一:單表查詢
SELECT查詢語句語法結構:
SELECT [DISTINCT] 字段名1[,字段名2,...] FROM 表名WHERE 過濾條件
GROUP BY 分組依據
HAVING 過濾條件
ORDER BY 排序依據
LIMIT 數字
各關鍵字執行順序:
FROM-->WHERE-->GROUP BY-->HAVING-->ORDER BY-->SELECT-[DISTINCT]-->LIMIT
1,DISTINCT
DISTINCT 應用於所有列而不僅是其後面的第一個列
如:distinct vend_id 取出所有不同的vend_id;distinct vend_id,prod_name 取出不同的vend_id和prod_name的組合,只有當vend_id和prod_name都相同時,纔會去掉
2,字段名
字段:包括表中的列,計算字段,拼接字段
計算字段:字段間進行運算(+、-、*、/)產生的,子查詢得到的、使用數據處理函數或聚集函數得到的新字段
拼接字段:使用concat()函數進行拼接得到的新字段
用 AS 給計算字段和拼接字段取別名:計算或拼接成的新字段只有值沒有名字,無法被應用程序引用,可以取個別名解決
3,WHERE
操作符 | 說明 | 操作符 | 說明 |
= | 等於 | IS NULL | 爲空值 |
<> | 不等於 | IS NOT NULL | 不爲空值 |
!= | 不等於 | AND | 邏輯 全部條件匹配成功,纔算匹配成功 |
< | 小於 | OR | 邏輯或 有一個條件匹配成功,就算匹配成功 |
<= | 小於等於 | NOT | 邏輯非,條件取反 |
> | 大於 | IN | IN(a,b,c) 功能與OR相當 指定條件範圍,逐個進行匹配 |
>= | 大於等於 | LIKE | 用於通配符搜索 (% 、_) |
BETWEEN...AND | 在兩個值之間 | REGEXP | 正則表達式 |
like操作符:用於通配符搜索
通配符:wildcard 用來匹配值的一部分的特殊字符
百分號 % 匹配任意個字符,包括0個字符
下劃線 _ 匹配單個字符,不能多也不能少
使用通配符的技巧:
1,不要過分使用通配符,如果其他操作符能達到相同的目的,應該使用其他操作符
2,儘量不要在搜索模式的開始處使用通配符,把通配符置於搜索模式的開始處搜索起來是最慢的
3,仔細注意通配符的位置
正則表達式:REGEXP '匹配字符'
SELECT * FROM t1
WHERE name REGEXP 'ock';
4,GROUP BY & HAVING
GROUP BY 子句可以包含任意數目的列
大多數SQL實現不允許GROUP BY列帶有長度可變的數據類型(如文本)
除聚集計算語句外,select語句中的每個列都必須在GROUP BY 子句中給出
GROUP BY 子句必須出現在WHERE子句之後,ORDER BY子句之前。
HAVING 過濾分組; WHERE 過濾行; 它倆的句法是相同的
WHRER用於分組前過濾; HAVING一般用於分組後過濾
5,ORDER BY
排序,默認升序 ASC
降序,需指定 DESC 關鍵字;想在多個列上進行降序排序,必須對每個列指定DESC關鍵字
--方式一:
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price,prod_name;
--方式二:按相對列位置進行排序,該相對位置必須在select清單中
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3 [DESC];
6,LIMIT
LIMIT 5; 限制返回5行
LIMIT 5,5; 指示從行5(即第6行)開始取5行(第一行爲行0)
LIMIT 4 OFFSET 3; 從行3開始取4行 同 LIMIT 3,4;
二:數據處理函數與聚集函數
1,數據處理函數
2,聚集函數
聚集函數:aggregate function 運行在行組上,計算和返回單個值的函數
函數 | 說明 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
COUNT(*) 對錶中的行的數目進行計數,包括NULL
COUNT(column) 對特定列中具有值的行進行計數,忽略NULL
三:子查詢
子查詢:subquery 嵌套在其他查詢中的查詢
可用於where子句的IN操作符中和創建計算字段
1,用於where子句的IN操作符中
SELECT cust_id FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2');
2,用於創建計算字段
SELECT cust_name,cust_state,(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;
在SELECT語句中,子查詢總是從內向外處理;對於能嵌套的子查詢的數目沒有限制,不過在實際使用時由於性能的限制,不能嵌套太多的子查詢
四:表的聯結、多表查詢與組合查詢
聯結是利用SQL的SELECT能執行的最重要的操作!!!
在聯結兩個表時,實際上做的是將第一個表中的每一行與第二個表中的每一行配對;WHERE子句作爲過濾條件,所有結果只包含那些匹配給定條件的行。
聯結表不是物理實體,即它在實際的數據庫表中不存在,只存在於查詢的執行當中
笛卡爾積:由沒有聯結條件的表關係返回的結果爲笛卡爾積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。(樣例見下圖)
1,內部聯結:也叫等值聯結,它基於兩個表之間的相等測試
1.1 兩種聯結形式:
--形式一:
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id;
--形式二:使用INNER JOIN關鍵字聯結表,推薦使用這種方式
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
--關鍵字ON給出聯結條件
ON vendors.vend_id = products.vend_id;
1.2 自聯結:兩張相同的表相聯結,這時爲了避免表名的二義性,需要給表取別名
可以給表起別名;表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶機
SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM customers AS c1,customers AS c2
WHERE c1.cust_name = c2.cust_name AND c2.cust_contact = 'Jim Jones';
用自聯結而不用子查詢:自聯結通常作爲外部語句用來替代從相同表中檢索數據使用的子查詢語句;因爲許多DBMS處理聯結遠比處理子查詢快得多。2,外部聯結
聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結稱爲外部聯結;外部聯結分兩種類型:左外部聯結與右外部聯結
左外部聯結:即包含了左表中那些與右表沒有關聯關係的行
--左外部聯結:使用關鍵字 LEFT OUTER JOIN
SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
--右外部聯結:RIGHT OUTER JOIN
3,組合查詢
組合查詢:使用UNION操作符來組合數條SQL查詢,並將它們的結果組合成單個結果集返回
UNION規則:
(1) UNION 中的每個查詢必須包含相同的列、表達式或聚集函數(次序可以不同)
(2) UNION 從查詢結果集中自動去除了重複的行;如果想返回所有匹配行,可使用UNION ALL
(3) 只能使用一條ORDER BY 子句來排序,在最後一條SELECT語句之後使用。
SELECT customers.cust_id,orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
UNION
SELECT customers.cust_id,orders.order_num
FROM customers RIGHT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
五:數據的插入、更新、刪除
1,數據的插入 INSERT INTO
--方式一:高度依賴於表中列的定義次序,各個列必須以它們在表定義中出現的次序填充
INSERT INTO customers
VALUES
(value1,value2,...);
--方式二:在表名後的括號裏明確地給出列名 (推薦使用這種寫法!)
INSERT INTO customers(cust_id,cust_name,...)
VALUES
(value1,value2,...);
--同時插入多行數據
INSERT INTO customers(cust_id,cust_name,...)
VALUES
(value1_1,value1_2,...),
(value2_1,value2_2,...);
--插入檢索出的數據:INSERT SELECT
INSERT INTO customers(cust_id,cust_name,...)
--不一定要求列名匹配,填充數據使用的是列的位置
SELECT cust_id,cust_name,...
FROM custnew;
--使用INSERT SELECT從custnew中將所有數據導入customers;表custnew有多少行就插入多少行
--MySQL中複製表:
CREATE TABLE newt1 as
SELECT * FROM t1;
2,數據的更新 UPDATE
語法:
UPDATE 表名 SET 列名1 = 值1,
列名2 = 值2
WHERE 過濾條件; (不要忘了使用WHERE子句,不然就會更新表中的所有行)
--更新一列
UPDATE customers
SET cust_email = '[email protected]'
WHERE cust_id = 10005;
--更新多列
UPDATE customers
SET cust_name = 'Fudds',
cust_email = '[email protected]'
WHERE cust_id = 10005;
--爲了刪除某個列的值,可設置它爲NULL(假定允許NULL值)
UPDATE customers
SET cust_email = NULL
WHERE cust_id = 10005;
3,數據的刪除 DELETE
語法:
DELETE FROM 表名 WHERE 過濾條件;
DELETE FROM customers
WHERE cust_id = 10006;