大廠都這樣使用MySQL8進(jìn)行條件查詢
日常業(yè)務(wù)中經(jīng)常需要通過(guò)查詢條件過(guò)濾數(shù)據(jù)。
1 查詢條件
1.1 WHERE
指定查詢的過(guò)濾條件。以下語(yǔ)句只返回姓名為“劉備”的員工信息:

WHERE 位于 FROM 之后,指定一個(gè)或者多個(gè)過(guò)濾條件,滿足條件的數(shù)據(jù)才會(huì)返回。
- WHERE 子句被稱為謂詞(Predicate)。
2 選擇(Selection)
通過(guò)查詢條件過(guò)濾數(shù)據(jù)的操作在關(guān)系運(yùn)算中被稱為選擇
它是針對(duì)表進(jìn)行的水平選擇,保留滿足條件的行生成的新表
3 比較運(yùn)算符
比較兩個(gè)數(shù)值的大小,包括字符、數(shù)字以及日期類型的數(shù)據(jù)。
- MySQL 的比較運(yùn)算符

查詢員工在 2018 年 11 月 11 日之后入職


其中,DATE 定義了一個(gè)日期類型的常量值。指定日期時(shí)也可以省略 DATE

4 BETWEEN
想要查找一個(gè)范圍內(nèi)的數(shù)據(jù)。
查詢?cè)滦轿挥?10000 到 15000 之間的員工:


需要注意的是,BETWEEN 包含了兩端的值(10000 和 15000)。
5 IN 運(yùn)算符
5.1 查找列表中的值
查詢姓名為“劉備”、“關(guān)羽”或者“張飛”的員工:

只要匹配列表中的任何一個(gè)值,都會(huì)返回結(jié)果
6 空值判斷
代表缺失或者未知的數(shù)據(jù).
判斷一個(gè)值是否為空不能使用等于或者不等于.
例如,以下查詢嘗試找出沒(méi)有上級(jí)領(lǐng)導(dǎo)(manager 字段為空)的員工:
空值判斷的錯(cuò)誤示例

該語(yǔ)句沒(méi)有返回任何結(jié)果

但確實(shí)存在這樣的數(shù)據(jù)。錯(cuò)因在于將一個(gè)值與一個(gè)未知的值進(jìn)行數(shù)學(xué)比較,結(jié)果仍然未知;即使是將兩個(gè)空值進(jìn)行比較,結(jié)果也是未知。
以下運(yùn)算均是非法的,在 MySQL8.0 版本下,會(huì)報(bào)錯(cuò)
- [42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘NULL != NULL’ at line 1

6.1 空值判斷

expression 的值為空,IS NULL 返回真,IS NOT NULL 返回假
表達(dá)式的值不為空,IS NULL 返回假,IS NOT NULL 返回真
查找沒(méi)有上級(jí)領(lǐng)導(dǎo)的員工

如果僅僅能夠指定單個(gè)過(guò)濾條件,就無(wú)法滿足復(fù)雜的查詢需求;為此,SQL 引入了用于構(gòu)建復(fù)雜條件的邏輯運(yùn)算符。
7 復(fù)合條件
借助于邏輯代數(shù)中的邏輯運(yùn)算,SQL 提供了三個(gè)邏輯運(yùn)算符:
7.1 AND 邏輯與運(yùn)算符
只有當(dāng)兩邊的條件都為真時(shí),結(jié)果才為真,返回?cái)?shù)據(jù);否則,不返回?cái)?shù)據(jù)。
以下示例使用 AND 運(yùn)算符查找性別為“女”,并且月薪超過(guò) 10000 的員工:
- SELECT emp_name, sex, salary
- FROM employee
- WHERE sex = '女'
- AND salary > 10000;
- emp_name|sex|salary |
- --------|---|--------|
- 孫尚香 |女 |12000.00|
- “孫尚香”是女性員工,并且月薪為 12000。
- OR,邏輯或運(yùn)算符。只要有一個(gè)條件為真,結(jié)果就為真,返回?cái)?shù)據(jù);否則,不返回?cái)?shù)據(jù)
- NOT,邏輯非運(yùn)算符。用于將判斷結(jié)果取反,真變?yōu)榧?,假變?yōu)檎?空值取反后仍然為空值。
7.2 OR 運(yùn)算符
使用 OR 運(yùn)算符查找姓名為“劉備”、“關(guān)羽”或者“張飛”的員工:
SELECT emp_name, sex, salary FROM employee WHERE emp_name = '劉備' OR emp_name = '關(guān)羽' OR emp_name = '張飛';
該查詢的結(jié)果與前文中 IN 運(yùn)算符的示例相同。
7.3 短路運(yùn)算
對(duì)于邏輯運(yùn)算符 AND 和 OR,SQL 使用短路運(yùn)算(short-circuit evaluation)。也就是說(shuō),只要前面的表達(dá)式能夠決定最終的結(jié)果,不執(zhí)行后面的計(jì)算。這樣能夠提高運(yùn)算效率。因此,以下語(yǔ)句不會(huì)產(chǎn)生除零錯(cuò)誤:
- SELECT 'AND'
- FROM employee
- WHERE 1 = 0 AND 1/0 = 1;
- SELECT 'OR'
- FROM employee
- WHERE 1 = 1 OR 1/0 = 1;
第一個(gè)查詢由于 AND 左邊的結(jié)果為假,肯定不會(huì)返回任何結(jié)果,因此也就不會(huì)計(jì)算 1/0;第二個(gè)查詢由于 OR 左邊的結(jié)果為真,一定會(huì)返回結(jié)果,同樣不會(huì)產(chǎn)生除零錯(cuò)誤。
7.4 NOT 運(yùn)算符
- NOT 運(yùn)算符可以結(jié)合其他的運(yùn)算符一起使用,用于對(duì)查詢條件的結(jié)果取反:
- NOT BETWEEN,位于范圍之外
- NOT IN,不在列表之中
- NOT LIKE,不匹配某個(gè)模式。LIKE 運(yùn)算符用于字符串的模糊查找,將在下一篇中進(jìn)行介紹
- NOT EXISTS,子查詢中不存在結(jié)果。關(guān)于子查詢和 EXISTS 運(yùn)算符,將在第 16 篇中進(jìn)行介紹
- NOT IS NULL,不為空。等價(jià)于 IS NOT NULL。
以下示例查找除了“劉備”、“關(guān)羽”以及“張飛”之外的其他員工:
- SELECT emp_id, emp_name
- FROM employee
- WHERE emp_name NOT IN ('劉備', '關(guān)羽', '張飛');
將多個(gè)邏輯運(yùn)算符進(jìn)行組合,可以構(gòu)造任意復(fù)雜的查詢條件。不過(guò),需要注意不同的運(yùn)算符之間的優(yōu)先級(jí)問(wèn)題。
8 運(yùn)算符優(yōu)先級(jí)
假如我們想要知道人力資源部(deptid = 2)或者財(cái)務(wù)部門(deptid = 3)中,哪些員工擁有獎(jiǎng)金。如果使用以下查詢:
- SELECT emp_name, dept_id, bonus
- FROM employee
- WHERE dept_id = 2
- OR dept_id = 3
- AND bonus IS NOT NULL;
【編輯推薦】