SQL筆記之SELECT語句
阿新 • • 發佈:2018-11-27
SELECT語句的完整語法:
SELECT【ALL/DISTINCT】目標列表達式 [AS 別名],··· --ALL不去掉重複 DISTINCT去掉重複
FROM 表名或檢視名 或者(SELECT語句)AS 表名(屬性)
[WHERE] 條件表示式
[GROUP BY] 列名 【HAVING 條件表示式】
[ORDER BY] 列名 【ASC|DESC】 --ASC = ASCENDING(預設為遞增遞增)DESC = DESCENDING(遞減)
[LIMIT子句]
去重選項
- 去重選項是指是否對結果中完全相同的記錄(所有欄位資料都相同)進行去重:
- ALL:不去重 (預設)
- DISTINCT:去重
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15));
INSERT INTO student(name,gender) VALUES("lihua","male");
INSERT INTO student(name,gender) VALUES("lihua","male");
SELECT * FROM student;
SELECT DISTINCT * FROM student;
欄位別名
- 欄位別名是指給列名另取一個名字
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15)); INSERT INTO student(name,gender) VALUES("lihua","male"); INSERT INTO student(name,gender) VALUES("lihua","male"); SELECT * FROM student; SELECT name AS "姓名",gender AS "性別" FROM student;
資料來源
- 資料來源可以為單表資料來源或者多表資料來源
- 單表:SELECT 欄位列表 FROM 表名;
- 多表: SELECT 欄位列表 FROM 表名1,表名2,…;
PS :
- 多表查詢時是將每個表中的X條記錄與另一個表Y條記錄組成結果,組成的結果的記錄條數為X*Y (笛卡爾積)
WHERE 子句
- WHERE子句是用於篩選符合條件的結果的。
- WHERE幾種語法:
- 基於值:
- = : WHERE 欄位 = 值 ;查找出對應欄位等於對應值的記錄。(相似的,<是小於對應值,<=是小於等於對應值,>是大於對應值,>=是大於等於對應值,!=是不等於)
- LIKE:WHERE 欄位 LIKE 值 ;功能與 = 相似 ,但可以使用模糊匹配來查詢結果。
- 基於值的範圍:
- IN: WHERE 欄位 IN 範圍;查找出對應欄位的值在所指定範圍的記錄。
- NOT IN : WHERE 欄位 IN 範圍;查找出對應欄位的值不在所指定範圍的記錄。
- BETWEEN X AND Y :WHERE 欄位 BETWEEN X AND Y;查找出對應欄位的值在閉區間[X,Y]範圍的記錄。
- 條件複合:
- OR : WHERE 條件1 OR 條件2… ; 查找出符合條件1或符合條件2的記錄。
- AND: WHERE 條件1 AND 條件2… ; 查找出符合條件1並且符合條件2的記錄。
- NOT : WHERE NOT 條件1 ;查找出不符合條件的所有記錄。
- &&的功能與AND相同;||與OR功能類似,!與NOT 功能類似。
- 基於值:
PS :
- WHERE是從磁碟中獲取資料的時候就進行篩選的。所以某些在記憶體是才有的東西WHERE無法使用。(欄位別名什麼的是本來不是“磁碟中的資料”(是在記憶體這中執行時才定義的),所以WHERE無法使用,一般都依靠HAVING來篩選)
GROUP BY 子句
- GROUP BY 可以將查詢結果依據欄位來將結果分組。
SELECT name,gender,count(name) AS "組員" FROM student AS d GROUP BY name;
SELECT name,gender,count(name) AS "組員" FROM student AS d GROUP BY name,gender;
PS :
- 實際上,GROUP BY 的作用主要是統計(使用情景很多,比如說統計某人的總分數,學生中女性的數量。。),所以一般會配合一些統計函式來使用:
- COUNT(X):統計每組的記錄數,X是*時代表記錄數,為欄位名時代表統計欄位資料數(除去NULL)
- MAX(X):統計最大值,X是欄位名
- MIN(X):統計最小值,X是欄位名
- AVG(X):統計平均值,X是欄位名
- SUM(X):統計總和,X是欄位名
- GROUP BY 欄位 後面還可以跟上ASC或DESC,代表分組後是否根據欄位排序。
HAVING 子句:
- HAVING功能與WHERE類似,不過HAVING的條件判斷髮生在資料在記憶體中時,所以可以使用在記憶體中才發生的資料,如“分組”,“欄位別名”等。(操作符之類的可以參考WHERE的,增加的只是一些“記憶體”中的篩選條件)
SELECT name AS n ,gender FROM student HAVING n ="lihua";
SELECT name,gender,COUNT(*) AS "組員" FROM student AS d GROUP BY name,gender HAVING COUNT(*) >2 ;-- 這裡只顯示記錄數>2的分組
ORDER BY 子句:
- ORDER BY 可以使查詢結果按照某個欄位來排序
- 語法:SELECT 欄位列表 FROM 表名 ORDER BY 欄位 [ASC|DESC];
- 欄位可以有多個,從左到右,後面的排序基於前面的,(比如:先按NAME排序,再按GENDER排序,後面的GENDER排序是針對前面NAME排序時NAME相同的資料)
- ASC代表排序是遞增的 (預設)
- DESC代表是遞減的
- 也可以指定某個欄位的排序方法,比如第一個欄位遞增,第二個遞減。只需要在每個欄位後面加ASC或DESC即可(雖然預設不加是遞增,但還是加上更清晰明確)。
SELECT * FROM student ORDER BY name;
SELECT * FROM student ORDER BY name,gender;
SELECT * FROM student ORDER BY name ASC,gender DESC;
LIMIT 子句:
- LIMIT是用來限制結果數量的。與WHERE\HAVING等配合使用時,可以限制匹配出的結果。但凡是涉及數量的時候都可以使用LIMIT(這裡只是強調LIMIT的作用,不要過度理解)
- 語法:SELECT 欄位列表 FROM 表名 LIMIT [OFFSET,...] COUNT;
- COUNT是數量
- OFFSET是起始位置,OFFSET從0開始,可以說是每條記錄的索引號
SELECT * FROM student LIMIT 1;
SELECT * FROM student LIMIT 3,1;
SELECT * FROM student WHERE name ="lihua" limit 1;
SELECT * FROM student WHERE name ="lihua" limit 3,1;