標籤:
在MySQL學習筆記(二)中講了MySQL的基礎知識,現在說說MySQL的核心的部分,查詢:SELECT語句。
1. 查詢所有欄位: SELECT * FROM <表名>;
2. 查詢指定欄位: SELECT <line1,line2,...> FROM <表名>;
3. 指定記錄查詢: SELECT <line1,line2,...> FROM <表名> WHERE <查詢條件>;
WHERE條件判斷符有以下這些:
=,<>、!=,<,<=,>,=>,BETWEEN
4. 帶IN關鍵詞的查詢,就是在查詢條件中使用IN關鍵詞。
例如:SELECT line1,line2 FROM tab1 WHERE line1 IN(100,200);
當然,也可以在IN前面加上NOT進行相反的條件查詢。
5. 帶BETWEEN AND的範圍查詢,就是在查詢條件中使用BETWEEN AND關鍵詞。
例如:SELECT line1,line2 FROM tab1 WHERE line1 BETWEEN 100 AND 200;
相似的,也可以在BETWEEN前面加上NOT進行相反的條件查詢。
6. 帶LIKE的字元匹配查詢:(1)匹配任意長度的字元使用‘%’,當然也包括零字元。
例如,需要尋找在tab1中所有以‘a’開頭的line1,SQL語句如下:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘a%’;
需要尋找在tab1中所有包含‘b’的line1記錄,SQL語句如下:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘%b%’;
(2)匹配一個長度的任一字元,使用底線‘_’,例如:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘_c%’;
7. 空值查詢(IS NULL 或者 IS NOT NULL):SELECT line1 FROM tab1 WHERE line1 IS NULL;
8. 多條件查詢。
(1)AND關鍵詞:SELECT <line1,line2,...> FROM <表名> WHERE <查詢條件1> AND <查詢條件2> [AND ...];
(2)OR關鍵詞:SELECT <line1,line2,...> FROM <表名> WHERE <查詢條件1> OR <查詢條件2> [AND ...];
這兩個關鍵詞是可以一起使用的,但是AND的優先順序要比OR高,使用時要確保邏輯正確。
9. 去重條件查詢:SELECT DISTINCT <欄位名> FROM <表名>;
10. 對查詢結果排序:使用ORDER BY子句。例如:
(1)對line1進行排序:SELECT line1 FROM tab1 ORDER BY line1;
(2)先按line1排序,再按line2排序:SELECT * FROM tab1 ORDER BY line1,line2;
另外,也可以指定排序,如ASC(升序,預設排序方式),(DESC)降序。
例如需對line1降序,對line2升序:SELECT * FROM tab1 ORDER BY line1 DESC, line2;
11. 分組查詢。使用GROUP BY關鍵詞,文法為:[GROUP BY 欄位] [HAVING <條件運算式>]
(1) 與集合函數一起使用時,如MAX( )、MIN( )、COUNT( )、SUM( )、AVG( )等。可以加上AS關鍵詞,給這些集合函數取一個別名,如MAX(line1) AS max。
例如以line1分組並統計分組中的數量:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1;
如果需要詳細的顯示出分組中的各欄位的名字,可以使用GROUP_CONCAT()關鍵詞。
使用如:SELECT line1,GROUP_CONCAT(line2),COUNT(*) AS Total FROM tab1 GROUP BY line1;
當然也可以使用多個欄位分組,形如GROUP BY line1,line2;
(2)使用HAVING關鍵詞過濾分組。
例如:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1 HAVING COUNT(line1)>100;
(3)使用WITH ROLLUP統計數量,它會在分組的最後一列加一條統計上面記錄總和的記錄。
例如:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1 WITH ROLLUP;
(4)使用LIMIT限制查詢結果,文法:LIMIT [位置位移量, ] <行數>;
例如,返回前3條記錄:SELECT * FROM tab1 LIMIT 3;
從第5條記錄起,返回接下來的2條記錄: SELECT * FROM tab1 LIMIT 4,2;
12. 子查詢。子查詢是指一個查詢語句中嵌套在另一個查詢語句內部的查詢。在SELECT語句中,先查詢子句的結果,將其作為外層的查詢的過濾條件。常用的操作符有ANY(SOME)、ALL、IN、EXISTS。當然,子查詢中可以添加到SELECT、UPDATE、DELETE語句中。
(1)帶ANY、SOME關鍵詞(即滿足其中任一條件)的子查詢:
SELECT line1 FROM tab1 WHERE line1 > ANY(SELECT line2 FROM tab2);
(2)帶ALL關鍵詞(滿足內層的所有條件)的子查詢:
SELECT line1 FROM tab1 WHERE line1 > ALL(SELECT line2 FROM tab2);
(3)帶(NOT) EXISTS關鍵字(系統對子查詢進行運算以判斷是否返回行,EXISTS是一個布爾型值,如果為false則不再對外層語句進行查詢)的子查詢。
例如:SELECT * FROM tab1 WHERE EXISTS (SELECT lin1 FROM tab2 WHERE lin1>10);
(4)帶(NOT)IN關鍵詞的子查詢:
SELECT line1 FROM tab1 WHERE line2 IN (SELECT lin1 FROM tab2 WHERE lin2> 10);
(5)使用比較子的子查詢:
SELECT line1 FROM tab1 WHERE line1=(SELECT lin1 FROM tab2 WHERE lin2= ‘one‘);
13. UNION合并查詢的結果。合并的前提是這些表的列數與資料類型必須相同,其返回的行都是唯一不重複的。當使用UNION ALL時,允許有重複的結果,其查詢效率相對較高。
文法: SELECT line1,... FROM tab1 UNION [ALL] SELECT line1,... FROM tab1;
14. 使用Regex查詢。MySQL中使用REGEXP關鍵詞指定字元的匹配模式。關於Regex,請看另一篇博文《Regex的使用》,這裡只舉幾個例子說明:
(1)查詢特定字元(這裡以‘s’為例)開頭的記錄:
SELECT * FROM tab1 WHERE line1 REGEXP ‘^s‘;
(2)查詢指定字元之外(這裡以查詢‘a-o’之外的字元為例)的字元:
SELECT * FROM tab1 WHERE line1 REGEXP ‘[^a-o]‘;
MySQL學習筆記(二)