DQL(Data Query Language),即數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢數(shù)據(jù)記錄。DQL 基本結(jié)構(gòu)由
SELECT FROM
、WHERE
、JOIN
等子句構(gòu)成。DQL 語(yǔ)句并不會(huì)改變數(shù)據(jù)庫(kù),而是讓數(shù)據(jù)庫(kù)將查詢結(jié)果發(fā)送結(jié)果集給客戶端,返回的結(jié)果是一張?zhí)摂M表。
1、MySQL 中的 DQL 語(yǔ)句
1.1、數(shù)據(jù)查詢語(yǔ)言–DQL
DQL(Data Query Language),即數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢數(shù)據(jù)記錄。DQL 基本結(jié)構(gòu)由 SELECT FROM
、WHERE
、JOIN
等子句構(gòu)成。
DQL 語(yǔ)句并不會(huì)改變數(shù)據(jù)庫(kù),而是讓數(shù)據(jù)庫(kù)將查詢結(jié)果發(fā)送結(jié)果集給客戶端,返回的結(jié)果是一張?zhí)摂M表。
1.2、DQL 語(yǔ)句的格式
DQL 的語(yǔ)法格式:
SELECT *|columns_list # columns_list 查詢字段(或表達(dá)式)列表 ,* 代表全部字段
FROM table_name # table_name 表名
[(LEFT | RIGHT | INNER | CROSS) JOIN join_table_name] # join_table_name 聯(lián)合查詢表表名
[WHERE query_condition] # query_condition 是查詢條件
[GROUP BY group_columns_list [HAVING group_clause]] # group_columns_list 分組字段列表 ,group_clause 分組條件
[ORDER BY order_columns_list [ASC|DESC]] # order_columns_list 排序字段列表 ,ASC 升序 ,DESC 降序
[LIMIT row_count OFFSET offset] # row_count 執(zhí)行返回的最大行數(shù) ,offset 指定返回的第一行的偏移量
2、MySQL 中 的 DQL 語(yǔ)句詳解
2.1、DQL 語(yǔ)句:SELECT FROM
SELECT FROM
語(yǔ)句用于從一個(gè)或多個(gè)表中檢索數(shù)據(jù),是 MySQL 中使用最多的語(yǔ)句。
以下是 SELECT FROM
語(yǔ)句的語(yǔ)法:
SELECT *|columns_list # columns_list 查詢字段(或表達(dá)式)列表 ,* 代表全部字段
FROM table_name [;] # table_name 表名 ,分號(hào) ; 表示語(yǔ)句結(jié)束
語(yǔ)句說(shuō)明:① 關(guān)鍵字 SELECT
后跟著一個(gè)或多個(gè)數(shù)據(jù)表的列;② columns_list
為查詢字段(或表達(dá)式)的列表,可以有多個(gè)列,列之間需要用逗號(hào) “,
” 分隔;③ 當(dāng)要檢索數(shù)據(jù)表中的所有列的時(shí)候,使用星號(hào) “*
” 表示全部字段;④ 關(guān)鍵字 FROM
后跟著要從中檢索數(shù)據(jù)的表名;⑤ 分號(hào) “;
” 表示語(yǔ)句的結(jié)束,它是可選的。如果有兩條或更多條語(yǔ)句,則需要使用分號(hào) “;
” 將它們分開(kāi),以便 MySQL 單獨(dú)執(zhí)行每條語(yǔ)句。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,分別使用星號(hào) “*
” 的方式查詢 “employees(國(guó)家)表” 的全部字段和使用指定字段的方式查詢 “employees” 表的部分字段。
SELECT * FROM employees; # 使用 * 查詢?nèi)孔侄?/span>
SELECT
emp_no, # 使用指定字段的方式查詢字段
birth_date, # 效果與使用 * 相同
first_name,
last_name,
gender,
hire_date
FROM
employees
2.1.1、關(guān)鍵字 AS
關(guān)鍵字 AS
可以用來(lái)給 列、表、派生表或者計(jì)算結(jié)果 取別名。
以下是關(guān)鍵字 AS
語(yǔ)句的語(yǔ)法:
SELECT column1,column2 AS "column2_alias"
FROM table_name; # 可給列取一個(gè)新別名
--
SELECT column1,column2
FROM table_name AS "table_name_alias"; # 可給表/派生表取一個(gè)新別名
--
SELECT column1 + column2 AS "alias"
FROM table_name; # 可給計(jì)算|總結(jié)的結(jié)果用另外一個(gè)新名稱來(lái)代替
語(yǔ)句說(shuō)明:①、AS
關(guān)鍵字后面跟的是列的別名 alias
;②、當(dāng)別名 alias
中包含空格時(shí),必須使用將別名引起來(lái),即 alias
;③ AS
關(guān)鍵字是可選的;④ 除了為字段指定別名,還可以為表達(dá)式指定別名。例如: SELECT NOW();
Current Time;
FROM dual;
。
舉例:
SELECT
emp.emp_no,
YEAR ( birth_date ) AS YEAR, # 給計(jì)算表達(dá)式取別名
first_name AS NAME # 給列取別名
FROM
employees AS emp; # 給表取別名
根據(jù)結(jié)果我們可以看到,當(dāng)我們使用 AS
關(guān)鍵字表示查詢字段或計(jì)算結(jié)果別名時(shí),查詢的結(jié)果返回字段名稱將為別名名稱。
2.1.2、關(guān)鍵字 DISTINCT
關(guān)鍵詞 DISTINCT
用于返回唯一不同的值。SELECT DISTINCT
表示查詢結(jié)果中,去掉了重復(fù)的行。
以下是關(guān)鍵字 DISTINCT
的語(yǔ)法:
SELECT DISTINCT columns_list FROM table_name # 去掉查詢返回的記錄結(jié)果中重復(fù)的記錄
注意:SELECT
語(yǔ)句不加關(guān)鍵字 DISTINCT
時(shí),是有一個(gè)默認(rèn)關(guān)鍵字 ALL
存在的,表示返回所有的記錄。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 DISTINCT
關(guān)鍵字查詢 “employees” 表中存在重復(fù)的字段。
SELECT DISTINCT gender FROM employees;
根據(jù)結(jié)果我們可以看到,重復(fù)的記錄已經(jīng)被去除。
2.2、DQL 子句:JOIN
在 MySQL 中,JOIN
語(yǔ)句用于將數(shù)據(jù)庫(kù)中的兩個(gè)表或者多個(gè)表組合起來(lái)。
MySQL 目前支持 4 種類型的連接:交叉連接(CROSS JOIN)、內(nèi)聯(lián)接(INNER JOIN)、左連接(LEFT JOIN)、右連接(RIGHT JOIN)。
MySQL 目前不支持全連接(FULL OUTER JOIN)。
以下是 MySQL 包含 JOIN
子句的 SELECT
語(yǔ)句語(yǔ)法:
# LEFT JOIN 左關(guān)聯(lián),此時(shí) a 表為主表,a、b 關(guān)聯(lián)后的臨時(shí)表中 a 表所有數(shù)據(jù)均存在
SELECT * FROM a LEFT JOIN b ON a.id = b.id
--
# RIGHT JOIN 右關(guān)聯(lián),此時(shí) b 表為主表,a、b 關(guān)聯(lián)后的臨時(shí)表中 b 表所有數(shù)據(jù)均存在
SELECT * FROM a RIGHT JOIN b ON a.id = b.id
--
# INNER JOIN == JOIN 等值關(guān)聯(lián),返回兩個(gè)表中關(guān)聯(lián)字段相等的數(shù)據(jù)行
SELECT * FROM a INNER JOIN b ON a.id = b.id
語(yǔ)句說(shuō)明:①、ON
用來(lái)生成關(guān)聯(lián)臨時(shí)表,生成的臨時(shí)表會(huì)將主表的所有記錄保存下來(lái),等待 WHERE
語(yǔ)句的進(jìn)一步篩選;②、兩表以上關(guān)聯(lián)時(shí)需要用到多條 JOIN
語(yǔ)句,一般用 LEFT JOIN
確立唯一的主表。
2.2.1、關(guān)于示例
在 JOIN
相關(guān)的以下示例中,我們將使用 student
和 student_score
兩個(gè)表來(lái)完成,下面是兩張表的結(jié)構(gòu)創(chuàng)建和數(shù)據(jù)插入語(yǔ)句。
CREATE TABLE `student` (`student_id` int NOT NULL , `name` varchar(45) NOT NULL , PRIMARY KEY (`student_id`));
CREATE TABLE `student_score` (`student_id` int NOT NULL , `subject` varchar(45) NOT NULL , `score` int NOT NULL);
---
INSERT INTO `student` (`student_id`, `name`) VALUES (1,'Tim') , (2,'Jim') , (3,'Lucy');
INSERT INTO `student_score` (`student_id`, `subject`, `score`) VALUES (1,'English',90) , (1,'Math',80) , (2,'English',85) , (2,'Math',88) , (5,'English',92);
查看兩個(gè)表的結(jié)構(gòu):
SELECT * FROM student; # 學(xué)生信息表
SELECT * FROM student_score; # 學(xué)生成績(jī)表
2.2.2、交叉連接(CROSS JOIN)
交叉連接返回兩個(gè)集合的笛卡爾積。也就是兩個(gè)表中的所有的行的所有可能的組合。這相當(dāng)于內(nèi)連接沒(méi)有連接條件或者連接條件永遠(yuǎn)為真。
如果一個(gè)有 m
行的表和另一個(gè)有 n
行的表,它們交叉連接將返回 m * n
行數(shù)據(jù)。
舉例:
我們以剛才示例中新建的 student
和 student_score
兩個(gè)表為例,分別采用顯式和隱式兩種方式交叉連接 student
和 student_score
表。
SELECT # 顯示交叉連接
student.*,
student_score.*
FROM
student CROSS JOIN student_score;
---
SELECT # 隱示交叉連接(這兩種方式的輸出一樣)
student.*,
student_score.*
FROM
student, student_score;
根據(jù)結(jié)果我們可以看到,使用 CROSS JOIN
子句的 SELECT
語(yǔ)句查詢后的結(jié)果為兩個(gè)集合的笛卡爾積。也就是兩個(gè)表中的所有的行的所有可能的組合。
2.2.3、內(nèi)連接(INNER JOIN JOIN)
內(nèi)連接基于連接條件組合兩個(gè)表中的數(shù)據(jù)。內(nèi)連接相當(dāng)于加了過(guò)濾條件的交叉連接。
內(nèi)連接將第一個(gè)表的每一行與第二個(gè)表的每一行進(jìn)行比較,如果滿足給定的連接條件,則將兩個(gè)表的行組合在一起作為結(jié)果集中的一行。
舉例:
我們以剛才示例中新建的 student
和 student_score
兩個(gè)表為例,將 student
表和 student_score
表內(nèi)連接。
SELECT
student.*,
student_score.*
FROM
student
INNER JOIN student_score
ON student.student_id = student_score.student_id;
---
SELECT # 隱藏 INNER JOIN,二者等價(jià)
student.*,
student_score.*
FROM
student, student_score
WHERE student.student_id = student_score.student_id;
注意輸出結(jié)果中,student
表中 student_id
為 3
的行和 student_score
表中 student_id
為 5
的行沒(méi)有出現(xiàn)在輸出結(jié)果中,這是因?yàn)樗麄儧](méi)有滿足連接條件:student.student_id = student_score.student_id
。
由于兩個(gè)表都使用相同的字段進(jìn)行等值匹配,因此我們還可以使用 USING
以下查詢中所示的子句:
SELECT
student.*,
student_score.*
FROM
student
INNER JOIN student_score USING(student_id);
2.2.4、左連接(LEFT JOIN)
左連接是左外連接的簡(jiǎn)稱,左連接需要連接條件。兩個(gè)表左連接時(shí),第一個(gè)表稱為左表,第二表稱為右表。例如 A LEFT JOIN B
,A
是左表,B
是右表。
左連接以左表的數(shù)據(jù)行為基礎(chǔ),根據(jù)連接匹配右表的每一行,如果匹配成功則將左表和右表的行組合成新的數(shù)據(jù)行返回;如果匹配不成功則將左表的行和 NULL 值組合成新的數(shù)據(jù)行返回。
舉例:
我們以剛才示例中新建的 student
和 student_score
兩個(gè)表為例,將 student
表和 student_score
進(jìn)行左連接。
SELECT
student.*,
student_score.*
FROM
student
LEFT JOIN student_score
ON student.student_id = student_score.student_id;
根據(jù)結(jié)果我們可以看到:① 結(jié)果集中包含了 student
表的所有記錄行;② student_score
表中不包含 student_id = 3
的記錄行,因此結(jié)果幾種最后一行中來(lái)自 student_score
的列的內(nèi)容為 NULL
;③ student_score
表存在多條 student_id
為 1
和 2
的記錄,因此 student
表也產(chǎn)生了多行數(shù)據(jù)。
由于兩個(gè)表都使用相同的字段進(jìn)行等值匹配,因此我們同樣可以使用 USING
以下查詢中所示的子句:
SELECT
student.*,
student_score.*
FROM
student
LEFT JOIN student_score USING(student_id);
2.2.5、右連接(RIGHT JOIN)
右連接是右外連接的簡(jiǎn)稱,右連接需要連接條件。
右連接與左連接處理邏輯相反,右連接以右表的數(shù)據(jù)行為基礎(chǔ),根據(jù)條件匹配左表中的數(shù)據(jù)。如果匹配不到左表中的數(shù)據(jù),則左表中的列為 NULL
值。
舉例:
我們以剛才示例中新建的 student
和 student_score
兩個(gè)表為例,將 student
表和 student_score
進(jìn)行右連接。
SELECT
student.*,
student_score.*
FROM
student
RIGHT JOIN student_score
ON student.student_id = student_score.student_id;
根據(jù)結(jié)果我們可以看到,由于左表中不存在到與右表 student_id = 5
匹配的記錄,因此最后一行左表的列的值為 NULL
。
注意:① 右連接其實(shí)是左右表交換位置的左連接,即 A RIGHT JOIN B
就是 B LEFT JOIN A
,因此右連接很少使用;② 由于兩個(gè)表都使用相同的字段進(jìn)行等值匹配,因此我們依舊可以使用 USING
關(guān)鍵字。
2.3、DQL 子句:WHERE
默認(rèn)情況下,SELECT
查詢數(shù)據(jù)表中的所有行數(shù)。但我們只想查詢滿足一定條件的數(shù)據(jù),就要用到 WHERE
子句。
WHERE
子句允許您為 SELECT
查詢指定搜索條件。
以下是包含 WHERE
子句的 SELECT
語(yǔ)句語(yǔ)法:
SELECT *|columns_list # columns_list 查詢字段(或表達(dá)式)列表 ,* 代表全部字段
FROM table_name # table_name 表名
WHERE query_condition # query_condition 是查詢條件
說(shuō)明:① 其中 query_condition
就是查詢條件,它的結(jié)果是一個(gè)布爾值,其值可能為 TRUE
, FALSE
或 UNKNOWN
。最終, SELECT
語(yǔ)句返回的結(jié)果集就是滿足查詢條件結(jié)果為 TRUE
的記錄;② WHERE
的查詢條件一般用來(lái)比較某個(gè)字段是否匹配某個(gè)值,一般形式為:column_name = value
;③ 查詢條件也可以是使用 AND
, OR
和 NOT
邏輯運(yùn)算符一個(gè)或多個(gè)表達(dá)式的組合;④ 除了用在 SELECT
語(yǔ)句之外, WHERE
子句還可以用在 UPDATE
和 DELETE
語(yǔ)句中,用來(lái)指定要更新或刪除的行。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 WHERE
查詢指定搜索條件的記錄。
SELECT
*
FROM
employees
WHERE
gender = 'M'; # 查詢性別為 M(male) 的員工
2.3.1、運(yùn)算符 AND
當(dāng)使用 SELECT
查詢數(shù)據(jù)時(shí),如果 WHERE
子句中有多個(gè)條件,可以根據(jù)需要使用 AND
, OR
, 或者 NOT
運(yùn)算符將他們組合起來(lái)。
AND
運(yùn)算符是一個(gè)雙目邏輯運(yùn)算符,用來(lái)組合兩個(gè)操作數(shù)。只有當(dāng)兩個(gè)操作數(shù)都為真時(shí),結(jié)果才返回真,否則返回假或者 NULL
。
AND
運(yùn)算符語(yǔ)法:
a AND b
其中,a
和 b
是 AND
的兩個(gè)操作數(shù),可以是表達(dá)式,也可以是值。不像一些編程語(yǔ)言,MySQL 中沒(méi)有布爾類型,AND
的運(yùn)算結(jié)果是 1
, 0
, 或著 NULL
。
說(shuō)明:① AND
是雙目運(yùn)算符,需要兩個(gè)布爾操作數(shù); ② 如果兩個(gè)操作數(shù)都不為 0
(FALSE
) 并且不為 NULL
時(shí),則 AND
運(yùn)算的結(jié)果為 1
;③ 如果有一個(gè)操作數(shù)為 0
(FALSE
),則 AND
運(yùn)算的結(jié)果為 0
;④ 如果兩個(gè)操作數(shù)中有一個(gè)為 NULL
,且另一個(gè)不為 0
(FALSE
),則返回 NULL
;⑤ 兩個(gè)操作數(shù)的前后順序不影響 AND
操作符的運(yùn)算結(jié)果; ⑥ WHERE
子句中的 AND
連接兩個(gè)比較條件,過(guò)濾那些同時(shí)滿足兩個(gè)比較條件的記錄行。
2.3.2、運(yùn)算符 OR
OR
運(yùn)算符是一個(gè)雙目邏輯運(yùn)算符,用來(lái)組合兩個(gè)操作數(shù)。只要兩個(gè)操作數(shù)中的一個(gè)為真時(shí),結(jié)果就返回真,否則返回假或者 NULL
。
OR
運(yùn)算符語(yǔ)法:
a AND b
其中,a
和 b
是 OR
的兩個(gè)操作數(shù),可以是表達(dá)式,也可以是值。不像一些編程語(yǔ)言,MySQL 中沒(méi)有布爾類型,OR
的運(yùn)算結(jié)果是 1
, 0
, 或著 NULL
。
說(shuō)明:① OR
是雙目運(yùn)算符,需要兩個(gè)布爾操作數(shù);② 如果兩個(gè)操作數(shù)中至少一個(gè)操作數(shù)為 1
(TURE
),則 OR
運(yùn)算的結(jié)果為 1
;③ 如果兩個(gè)操作數(shù)都為 0
(FALSE
),則 OR
運(yùn)算的結(jié)果為 0
;④ 如果兩個(gè)操作數(shù)有一個(gè)為 NULL
,另一個(gè)為 0
(FALSE
) 或者 NULL
,則 OR
運(yùn)算的結(jié)果為 NULL
;⑤ 兩個(gè)操作數(shù)的前后順序不影響 OR
操作符的運(yùn)算結(jié)果;⑥ AND
運(yùn)算符的優(yōu)先級(jí)高于 OR
。使用括號(hào)更改計(jì)算順序;⑦ WHERE
子句中的 OR
連接兩個(gè)比較條件,過(guò)濾那些至少滿足其中一個(gè)比較條件的記錄行。
2.3.3、運(yùn)算符 IN
在使用 SQL 查詢的時(shí)候,我們可能需要判斷一個(gè)字段的值是否位于一組值中,這就需要用到 IN
運(yùn)算符了。IN
運(yùn)算符用來(lái)檢查一個(gè)字段或值是否包含在一個(gè)集合中,如果值包含在集合中返回 1
,否則返回 0
。
IN
是一個(gè)雙目運(yùn)算符,它需要 2 個(gè)操作數(shù)。以下是 IN
運(yùn)算符的語(yǔ)法:
expression IN (value1, value2, ...) # expression 可以是一個(gè)字段名、值或其他的表達(dá)式
說(shuō)明:① IN
是一個(gè)雙目運(yùn)算符,需要 2 個(gè)操作數(shù);② IN
運(yùn)算符左側(cè)操作數(shù)是字段名或者值,右側(cè)操作數(shù)是值列表或者子查詢結(jié)果;③ IN
運(yùn)算符左側(cè)的操作數(shù)的值是右側(cè)操作數(shù)集合列表中的其中一個(gè)時(shí),返回 1
。否則 返回 0
;④ IN
運(yùn)算符可以看作是多個(gè) OR
運(yùn)算符組合的簡(jiǎn)化版本;⑤ IN
運(yùn)算符的否定操作是 NOT IN
。
2.3.4、運(yùn)算符 NOT IN
NOT
是一個(gè)邏輯運(yùn)算符,用來(lái)用來(lái)否定一個(gè)操作。NOT IN
是 IN
的否定操作符。
NOT IN
和 IN
用法幾乎一樣,只是在 IN
前面添加一個(gè) NOT
關(guān)鍵字,IN
的否定操作符。 NOT IN
語(yǔ)法如下:
expression NOT IN (value1, value2, ...) # expression 可以是一個(gè)字段名、值或其他的表達(dá)式
說(shuō)明:① NOT IN
檢查左側(cè)值是否不包含于右側(cè)的值列表中;② NOT IN
是 IN
運(yùn)算符的否定操作。
2.3.5、運(yùn)算符 BETWEEN
BETWEEN
運(yùn)算符確定一個(gè)值是否介于某兩個(gè)值之間。BETWEEN
運(yùn)算符常用于比較數(shù)字和日期類型的數(shù)據(jù)。
BETWEEN
運(yùn)算符是一個(gè)三目運(yùn)算符,它需要 3 個(gè)操作數(shù)。下面 BETWEEN
運(yùn)算符的語(yǔ)法:
expression BETWEEN min AND max # expression 可以是一個(gè)字段名、值或其他的表達(dá)式
# min 是范圍的最小值 max 是范圍的最大值
expression NOT BETWEEN min AND max # NOT 是否定運(yùn)算符,NOT BETWEEN 與 BETWEEN 相反
說(shuō)明:① BETWEEN
運(yùn)算符來(lái)測(cè)試一個(gè)值是否位于一個(gè)數(shù)值區(qū)間或者時(shí)間區(qū)間內(nèi);② BETWEEN min AND max
中 min
是區(qū)間的最小值,max
是區(qū)間的最大值;③ expression BETWEEN min AND max
與 expression >= min AND expression <= max
結(jié)果相同;④ BETWEEN
運(yùn)算符可以結(jié)合 NOT
運(yùn)算符進(jìn)行否定操作;⑤ expression NOT BETWEEN min AND max
與 expression < min OR expression > max
結(jié)果相同。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 BETWEEN
操作作為 WHERE
查詢搜索的條件來(lái)查詢相關(guān)記錄。
SELECT
*
FROM
employees
WHERE
birth_date BETWEEN "1960-01-01" # 查詢出生日期在 1960 年的員工
AND "1960-12-31";
2.3.6、運(yùn)算符 LIKE
在 MySQL 中, LIKE
運(yùn)算符可以根據(jù)指定的模式過(guò)濾數(shù)據(jù)。LIKE
運(yùn)算符一般用于模糊匹配字符數(shù)據(jù)。
LIKE
運(yùn)算符是一個(gè)雙目比較運(yùn)算符,需要兩個(gè)操作數(shù)。 LIKE
運(yùn)算符語(yǔ)法如下:
expression # expression 可以是一個(gè)字段名、值或其他的表達(dá)式
LIKE pattern # pattern 是一個(gè)字符串模式
說(shuō)明:① expression
可以是一個(gè)字段名、值或其他的表達(dá)式(比如函數(shù)調(diào)用、運(yùn)算等);② pattern
是一個(gè)字符串模式。MySQL 字符串模式支持兩個(gè)通配符:“%
” 和 “_
”,且當(dāng)使用通配符匹配文本時(shí),不區(qū)分字母大小寫(xiě)。;③ “%
” 匹配零或多個(gè)任意字符;④ “_
” 匹配單個(gè)任意字符;⑤ 如果需要匹配通配符,則需要使用 “\
” 轉(zhuǎn)義字符,如 “\%
” 和 “\_
”;⑥ 使用通配符匹配文本時(shí),不區(qū)分字母大小寫(xiě);⑦ 如果 expression
與 pattern
匹配,LIKE
運(yùn)算符返回 1,否則返回 0;⑧ 可使用 NOT
運(yùn)算符來(lái)否定 LIKE
運(yùn)算符。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 LIKE
操作作為 WHERE
查詢搜索的條件來(lái)查詢相關(guān)記錄。
SELECT * FROM employees WHERE first_name like "a______"; # 查詢以 A 開(kāi)頭 7 位 FirstName 的員工
SELECT * FROM employees WHERE last_name like "%ok%"; # 查詢 LasrName 中包含 ok 的員工
2.3.7、運(yùn)算符 NULL
在 MySQL 中,NULL
是一個(gè)特殊的值,它代表什么都沒(méi)有。它不是空,也不是 0
。
IS NULL
運(yùn)算符用來(lái)測(cè)試一個(gè)值是不是 NULL
,如果是 NULL
返回 1
,否則返回 0
。
IS NULL
是一個(gè)單目比較運(yùn)算符,只需要一個(gè)操作數(shù)。IS NULL
運(yùn)算符的語(yǔ)法是:
expression IS NULL # expression 可以是一個(gè)字段名、一個(gè)值或者一個(gè)表達(dá)式
expression IS NOT NULL # IS NOT NULL 是 IS NULL 的否定運(yùn)算
說(shuō)明:① IS NULL
和 IS NOT NULL
可以用在 SELECT
語(yǔ)句或者 WHERE
子句中;② 當(dāng) IS NULL
運(yùn)算符左側(cè)的操作數(shù)是 NULL
時(shí),IS NULL
運(yùn)算符返回 1
,否則返回 0
。
2.3.8、操作符 EXISTS
在 MySQL 中,EXISTS
操作符用來(lái)判斷一個(gè)子查詢是否返回?cái)?shù)據(jù)行。如果一個(gè)子查詢返回了至少一個(gè)數(shù)據(jù)行,則 EXISTS
的計(jì)算結(jié)果為 TRUE
,否則計(jì)算結(jié)果為 FALSE
。
SELECT column_name
FROM table_name
WHERE EXISTS(subquery);
說(shuō)明:① EXISTS
一般用在 WHERE
子句中;② EXISTS
是一個(gè)單目操作符,它需要一個(gè)子查詢 subquery
作為參數(shù);③ 如果子查詢 subquery
返回了至少一個(gè)數(shù)據(jù)行,則 EXISTS
的計(jì)算結(jié)果為 TRUE
,否則計(jì)算結(jié)果為 FALSE
;④ EXISTS
運(yùn)算時(shí),一旦子查詢找到一個(gè)匹配的行,EXISTS
運(yùn)算就會(huì)返回。這對(duì)提高查詢新能很有幫助;⑤ EXISTS
不關(guān)心子查詢中的列的數(shù)量或者名稱,它只在乎子查詢是否返回?cái)?shù)據(jù)行。所以在 EXISTS
的子查詢中,無(wú)論你是使用 SELECT 1
還是 SELECT *
,亦或是 SELECT column_list
,都不影響 EXISTS
運(yùn)算的結(jié)果;⑥ NOT EXISTS
則是 EXISTS
的否定操作;⑦ 大多數(shù)情況下,使用 EXISTS
的語(yǔ)句的性能比對(duì)應(yīng)的使用 IN
的語(yǔ)句要好。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 EXISTS
操作作為 WHERE
查詢搜索的條件來(lái)查詢相關(guān)記錄。
SELECT e.*#
FROM employees e
WHERE EXISTS ( # 查詢當(dāng)下在職的員工信息
SELECT 1
FROM dept_emp de
WHERE e.emp_no = de.emp_no
AND de.to_date > NOW()
);
2.4、DQL 子句:GROUP BY
在 MySQL 中, GROUP BY
子句用于將結(jié)果集根據(jù)指定的字段或者表達(dá)式進(jìn)行分組。
有時(shí)候,我們需要將結(jié)果集按照某個(gè)維度進(jìn)行匯總。這在統(tǒng)計(jì)數(shù)據(jù)的時(shí)候經(jīng)常用到,例如以下的場(chǎng)景:
- 按班級(jí)求取平均成績(jī);
- 按學(xué)生匯總某個(gè)人的總分;
- 按年或者月份統(tǒng)計(jì)銷售額;
- 按國(guó)家或者地區(qū)統(tǒng)計(jì)用戶數(shù)量。
這些正是 GROUP BY
子句發(fā)揮作用的地方。
GROUP BY
子句是 SELECT
語(yǔ)句的可選子句。 GROUP BY
子句語(yǔ)法如下:
SELECT column1[, column2,...] # column 為分組依據(jù)的字段,至少一個(gè)字段,可以多個(gè)字段
, aggregate_function(ci) # 聚合函數(shù)。這是可選的,但是一般都用得到
FROM table
[WHERE clause] # 可選的,用來(lái)過(guò)濾結(jié)果集中的數(shù)據(jù)
GROUP BY column1[, column2, ...];
[HAVING clause] # 子句是可選的,用來(lái)過(guò)濾分組數(shù)據(jù)
說(shuō)明:① GROUP BY
子句用于將結(jié)果集根據(jù)指定的字段或者表達(dá)式進(jìn)行分組;② GROUP BY
子句的分組字段或表達(dá)式至少一個(gè),可以多個(gè);③ 子句是可選的,用來(lái)過(guò)濾分組數(shù)據(jù),需要使用邏輯表達(dá)式作為條件,其中邏輯表達(dá)式中的字段或表達(dá)式只能使用分組使用的字段和聚合函數(shù)。 ④ GROUP BY
子句經(jīng)常用于數(shù)據(jù)統(tǒng)計(jì)匯總,通常使用聚合函數(shù);⑤ 經(jīng)常使用的聚合函數(shù)主要有:SUM()
求總和 、AVG()
求平均值、MAX()
求最大值、MIN()
求最小值、COUNT()
計(jì)數(shù) …
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 GROUP BY
子句對(duì)結(jié)果集進(jìn)行分組及聚合計(jì)算。
SELECT # 計(jì)算不同性別員工的平均/最大/最小年齡
gender,
AVG( DATEDIFF( CURRENT_DATE (), birth_date ) / 365 ) AS avg_age,
MAX( DATEDIFF( CURRENT_DATE (), birth_date ) / 365 ) AS max_age,
MIN( DATEDIFF( CURRENT_DATE (), birth_date ) / 365 ) AS min_age
FROM
employees
GROUP BY
gender;
2.5、DQL 子句:ORDER BY
通常情況下,SELECT
語(yǔ)句返回的結(jié)果集是按照數(shù)據(jù)庫(kù)默認(rèn)的規(guī)則排序的。如果我們想按照自定義自定義規(guī)則排序結(jié)果集,可以使用 ORDER BY
子句。
我們可以通過(guò) ORDER BY
子句指定排序的字段以及升序排序還是降序排序。
在 ORDER BY
子句中,我們可以指定一個(gè)或多個(gè)排序的字段。 ORDER BY
子句的語(yǔ)法如下:
SELECT
column1, column2, ...
FROM
table_name
[WHERE clause]
ORDER BY
column1 [ASC|DESC],
column2 [ASC|DESC],
...;
說(shuō)明:① ORDER BY
子句可以指定一個(gè)或多個(gè)字段;② ASC
代表升序,DESC
代表降序,這是可選的;③ 未指定 [ASC|DESC]
時(shí),默認(rèn)值是 ASC
。即,默認(rèn)是按指定的字段升序排序;④ 當(dāng)指定多個(gè)列時(shí),首先按照前面的字段排序,其次按照后面的字段排序。 ⑤ 使用 FIELD()
函數(shù)或者 CASE
子句可按照自定義的序列排序;⑥ 升序排序時(shí), NULL
在非 NULL 值之前;降序排序時(shí),NULL
在非 NULL 值之后。
2.5.1、使用 CASE 實(shí)現(xiàn)自定義排序
有時(shí)候單純的按照字段的值排序并不能滿足要求,我們需要按照自定義的順序的排序。即按照列表中元素的索引位置進(jìn)行排序。我們分別使用 CASE
子句或 FIELD()
函數(shù)實(shí)現(xiàn)它。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 CASE
自定義 ORDER BY
子句對(duì)結(jié)果集進(jìn)行排序。
SELECT * FROM departments
ORDER BY CASE dept_no
WHEN 'Finance' THEN 1
WHEN 'Human Resources' THEN 2
WHEN 'Research' THEN 3
WHEN 'Development' THEN 4
WHEN 'Customer Service' THEN 5
WHEN 'Sales' THEN 6
END;
值得注意的是,根據(jù)查詢結(jié)果我們可以看到,未包含在自定義規(guī)則內(nèi)的記錄,會(huì)在自定義查詢時(shí)排定義規(guī)則內(nèi)的記錄的前面。
2.5.2、使用 FIELD 函數(shù)實(shí)現(xiàn)自定義排序
對(duì)于上面實(shí)例中的 CASE
語(yǔ)句,我們可以如下的使用 FIELD()
代替。
SELECT DISTINCT Continent FROM country # 根據(jù)自定義規(guī)則對(duì)大陸進(jìn)行排列
ORDER BY FIELD(rating, 'Finance', 'Human Resources', 'Research', 'Development', 'Customer Service', 'Sales');
輸出結(jié)果與上面實(shí)例完全相同。
2.6、DQL 子句:LIMIT
在 MySQL 中,我們使用 LIMIT
子句來(lái)限定 SELECT
語(yǔ)句返回的行的數(shù)量。
該 LIMIT
子句可用于限制 SELECT
語(yǔ)句返回的行數(shù)。 LIMIT
接受一個(gè)或兩個(gè)非負(fù)數(shù)正數(shù)作為參數(shù)。 LIMIT
子句的語(yǔ)法如下:
LIMIT [offset,] row_count;
---
LIMIT row_count OFFSET offset; # 二者效果相同
說(shuō)明:① offset
指定要返回的第一行的偏移量。偏移量是相對(duì)于未使用 LIMIT
語(yǔ)句時(shí)的原始結(jié)果集而言的。offset
可理解為在原始結(jié)果集的基礎(chǔ)上跳過(guò)的行數(shù);② row_count
執(zhí)行要返回的最大行數(shù);③ offset
是可選的。當(dāng)未指定 offset
時(shí),默認(rèn)的值 offset
為 0
;④ LIMIT
一般位于 SELECT
語(yǔ)句的最后。
舉例:
我們以 MySQL 官方示例數(shù)據(jù)庫(kù) Employees 數(shù)據(jù)庫(kù)為例,使用 LIMIT
子句限定結(jié)果返回?cái)?shù)量。
SELECT * FROM employees LIMIT 60,10; # 限定返回?cái)?shù)量 10 ,偏移量 60
2.7、DQL子查詢
MySQL 子查詢是嵌套一個(gè)語(yǔ)句中的查詢語(yǔ)句,也被稱為內(nèi)部查詢。子查詢經(jīng)常用在 WHERE
子句中。
例如,我前面提到的操作符 EXISTS
就屬于子查詢的范疇。
此外,我們還可以將查詢結(jié)果作為 IN
的列表項(xiàng)以實(shí)現(xiàn)最終的查詢結(jié)果,這里需要注意在子查詢中返回的結(jié)果必須是一個(gè)字段列表項(xiàng)。
但大多數(shù)情況下,使用 IN
的自查詢的性能不如使用操作符 EXISTS
的性能的。最后,還存在一種在 FROM
中使用子查詢的方式,即當(dāng)一個(gè)子查詢位于 FORM
子句中時(shí),這個(gè)子查詢被稱為派生表。
2.8、DQL集合操作符:UNION
UNION
是一個(gè)集合操作符,它用于合并 2 個(gè)結(jié)果集中的所有的行
SQL 標(biāo)準(zhǔn)中定義了 3 個(gè)集合操作符: UNION
, INTERSECT
和 MINUS
。目前 MySQL 只支持 UNION
。
以下是集合操作符 UNION
的語(yǔ)法:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-839707.html
SELECT statementA
UNION [DISTINCT | ALL] # UNION 默認(rèn)為 UNION DISTINCT 會(huì)去除重復(fù)記錄
SELECT statementB
說(shuō)明:① UNION
為雙目操作符,需要兩個(gè) SELECT
語(yǔ)句作為操作數(shù);② UNION
中的 SELECT
語(yǔ)句中的列數(shù)、列順序必須相同;③ UNION
運(yùn)算包括 UNION DISTINCT
和 UNION ALL
兩種算法,其中 UNION DISTINCT
可以簡(jiǎn)寫(xiě)為 UNION
; ④UNION
會(huì)刪除兩個(gè)結(jié)果集中的重復(fù)記錄行,而 UNION ALL
則保留全部記錄行;⑤ UNION
運(yùn)算取第一個(gè)參與運(yùn)算的結(jié)果集的列名作為最終的列名文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-839707.html
到了這里,關(guān)于【MySQL 系列】MySQL 語(yǔ)句篇_DQL 語(yǔ)句的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!