本篇內容包括:DQL 的簡介、SELECT 語句、WHERE 條件語句、JOIN 連接查詢(多表查詢)和分組、過濾、排序、分頁、子查詢的使用。
一、DQL 簡介
DQL(Data QueryLanguage)語句,即數據查詢語句
常用的語句關鍵字有:SELECT、FROM、WHERE、ORDER BY、HAVING、ASC|DESC
二、SELECT 語句
1、SELECT 語句
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1] [,table.field[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] #聯合查詢
[WHERE ...] # 指定結果需滿足的條件
[GROUP BY ...] # 指定結果按照哪幾個字段來分組
[HAVNG ...] # 過濾分組的記錄必須滿足的次要條件
[ORDER BY ...] # 指定查詢記錄按一個或多個條件排序
[LIMIT { [offset,]row_count | row_count OFFSET offset}]; #指定查詢的記錄從哪條至哪條
PS:
[]
括號代表可選的;{}
括號代表必須的;#
為MySQL語句中的注釋符,也可以用/**/
指定查詢字段:
-
查詢表中所有的數據列結果,采用
"*"
符號 :SELECT * FROM 表名;
-
可指定查詢的結果數據列:
SELECT 字段1,字段2,.... FROM 表名;
-
如需要區分連接查詢時兩個表有同名的字段:
SELECT 表1.字段1,表2.字段2,字段3,.... FROM 表1,表2;
2、AS 子句
SELECT StudentNo AS "學號" FROM student; # 可給數據列取一個新別名
SELECT a.StudentNo FROM student AS a; # 可給表取一個新別名
SELECT Phone+1 AS Tel FROM student; # 可把經計算或總結的結果用另外一個新名稱來代替
3、DISTINCT 子句
SELECT DISTINCT 字段名1,字段名2... FROM 表名 #掉SELECT查詢返回的記錄結果中重復的記錄(所有返回列的值都相同),只返回一條
PS:
ALL
關鍵字是默認的(不加DISTINCT
默認ALL
),返回所有的記錄,與DISTINCT
相反。
4、使用表達式的列
表達式一般由文本值、列值、NULL、函數和操作符等組成
應用場景:
- SELECT語句返回結果列中使用
- SELECT語句的ORDER BY 、HAVING等子句中使用
- DML語句中的WHERE條件語句中使用表達式
PS:需要避免SQL返回結果中包含".“,”*"和括號等干擾開發語言程序
三、WHERE 條件語句
1、WHERE 條件語句
用于檢索數據表中符合條件的記錄,搜索條件可由一個或多個邏輯表達式組成,結果一般為真或假。
搜索條件的組成:
- 邏輯操作符
- 比較操作符
2、邏輯操作符
操作符名稱 | 語法 | 描述 |
---|---|---|
AND 或 && | a AND b 或 a && b | 邏輯與,同時為真,結果才為真 |
OR 或` | ` | |
NOT 或 ! | NOT a 或 !a | 邏輯非,若操作數為假,結果則為真 |
3、比較操作符
操作符名稱 | 語法 | 描述 |
---|---|---|
IS NULL | a IS NULL | 若操作數為NULL,則結果為真 |
IS NOT NULL | a IS NOT NULL | 若操作數不為NULL,則結果為真 |
BETWEEN | a BETWEEN b and c | 若a范圍在b與c之間,則結果為真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b,則結果為真 |
IN | a IN (a1,a2,a3,…) | 若a等于a1,a2,a3,…中的某一個,則結果為真 |
PS:1. 數值數據類型的記錄之間才能進行算數運算;2. 相同數據類型的數據之間才能進行比較。
4、BETWEEN AND 范圍查詢子句
SELECT 字段1,字段2,.... FROM 表名 WHERE 字段X BETWEEN 值1 AND 值2 # 根據一個范圍值來檢索,等同于>=和<=聯合使用
5、LIKE 模糊查詢子句
在 WHERE 子句中,使用 LIKE 關鍵字進行模糊查詢
- 與
%
一起使用,表示匹配 0 或任意多個字符 - 與
_
一起使用,表示匹配單個字符 - 如果需要顯示%或者_,可以使用轉義字符
\
,也可以用ESCAPE
關鍵字自定義轉義符,如:
6、IN范圍查詢
在 WHERE 子句中使用 IN 關鍵字進行范圍查詢
SELECT 字段列1,字段2,...FROM 表名 WHERE 字段X IN (值1,值2,值3...)
查詢的字段X的值,至少與括號中的一個值相同,多個值之間用英文逗號隔開
7、NULL空值條件查詢
- NULL代表"無值"
- 區別于零值0和空字符串""
- 只能出現在定義允許為NULL的字段
- 須使用IS NULL 或 IS NOT NULL比較操作符去比較
四、JOIN 連接查詢(多表查詢)
1、JOIN 連接查詢
如需要多張數據表進行查詢,則可通過連接運算符實現多個查詢
分類包括內連接和外連接
2、內連接(inner join)
在表中至少一個匹配時,則返回記錄
SELECT 字段1,字段2,... FROM table_1
INNER JOIN table_2
ON table_1.字段X = table_2.字段Y;
3、等值連接
SELECT 字段1,字段2,.... FROM table_1,table_2
WHERE table_1.字段X =table_2.字段Y;
- 與單表查詢類似,都是SELECT語句
- 把多個表放在FROM后,并用逗號隔開
- 可使用AS關鍵字取別名,便于引用
- 如無重名查詢字段則可省略數據表的指定
4、非等值連接
SELECT 字段1,字段2,.... FROM table_1,table_2 ;
- 返回記錄數為兩表記錄數的乘積
5、自連接
SELECT 字段1,字段2,.... FROM 表1 別名1,表1 別名2;
- 數據表與自身進行連接
6、外連接(out join)——左連接
從左表(table_1)中返回所有的記錄,即便在右表(table_2)中沒有匹配的行
SELECT 字段1,字段2,... FROM table_1
LEFT JOIN table_2
ON table_1.字段X =table_2.字段Y;
7、外連接(out join)——右連接
從右表(table_2)中返回所有的記錄,即便在左表(table_1)中沒有匹配的行
SELECT 字段1,字段2,... FROM table_1
RIGHT JOIN table_2
ON table_1.字段X =table_2.字段Y;
8、不同的SQL JOIN對比
操作符名稱 | 描述 |
---|---|
INNER JOIN (JOIN) | 如果表中至少有一個匹配,則返回行 |
LEFT JOIN | 無論右表是否有匹配,都會返回左表的所有行 |
RIGHT JOIN | 無論左表是否有匹配,都會返回右表的所有行 |
9、full join
mysql 不支持 full join
,使用 left join
和 right join
。可以相當與左右鏈接的結果
select * from t1 left join t2 on t1.id = t2.id
union
select * from t1 right join t2 on t1.id = t2.id
五、分組、過濾、排序、分頁
1、GROUP BY 語句
- 對所有數據進行分組統計。分組的依據字段可以有多個,并依次分組
- 與HAVING結合使用,進行分組后的數據篩選
- GROUP BY的語句順序在WHERE后面,ORDER BY 的前面
- 通常在對數據使用計算統計的時候,會用到GROUP BY分組
2、HAVING 語句
過濾分組的記錄必須滿足的次要條件。SELECT語句中,在GROUP BY分組之后再進行條件篩選,就不能使用WHERE,而是在GROUP BY后面通過HAVING進行分組后的條件篩選。HAVING的作用等同于WHERE。
3、ORDER BY 語句
ORDER BY 列名1 ASC/DESC[,列名2 ASC/DESC,...]
- 對
SELECT
語句查詢得到的結果,按某些字段進行排序 - 與
DESC
或ASC
搭配使用,默認為ASC
ASC
為升序排列,DESC
為降序排列
4、LIMIT
分頁顯示,對用戶體驗、網絡傳輸、查詢壓力上都有好處
LIMIT[m,]n 或 LIMIT n OFFSET m
- 限制
SELECT
返回結果的行數 - m 指定第一個返回記錄行的偏移量(顯示的起始位置)
- n 指定返回記錄行的最大數目(顯示行數)
- m 不指定則偏移量為 0,從第一條開始返回前 n 條記錄
- 在MySQL中,顯示每頁的行數可以使用
LIMIT (頁碼-1)*行數,行數
六、子查詢
在查詢語句中的WHERE條件子句中,又嵌套了另外一個查詢語句
- 嵌套查詢可由多個子查詢組成,求解的方式是由里及外
- 子查詢返回的結果一般都是集合,故而建議使用IN關鍵字
例如:
SELECTstudentno "學號",studentname "姓名"
FROMstudent
WHEREstudentno IN (SELECTstudentnoFROMresultWHEREsubjectno =(SELECTsubjectnoFROM`subject`WHEREsubjectname = '高等數學-2')AND studentresult >= 80)