MySQL8.0關係數據庫基礎教程(四)-帶有條件的查詢語句

業務經常需要找出滿足某些條件的結果,可以通過查詢條件過濾數據。

1 查詢條件

WHERE

指定查詢的過濾條件。以下語句只返回姓名爲“劉備”的員工信息:



WHERE 位於 FROM 之後,指定一個或者多個過濾條件,滿足條件的數據纔會返回。

WHERE 子句被稱爲謂詞(Predicate)。

2 選擇(Selection)

  • 通過查詢條件過濾數據的操作在關係運算中被稱爲選擇
    它是針對表進行的水平選擇,保留滿足條件的行生成的新表

3 比較運算符

比較兩個數值的大小,包括字符、數字以及日期類型的數據。

  • MySQL 的比較運算符

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



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

BETWEEN

想要查找一個範圍內的數據。
查詢月薪位於 10000 到 15000 之間的員工:

需要注意的是,BETWEEN 包含了兩端的值(10000 和 15000)。

IN 運算符

查找列表中的值

  • 查詢姓名爲“劉備”、“關羽”或者“張飛”的員工:


    只要匹配列表中的任何一個值,都會返回結果

子查詢的結果匹配

空值判斷

代表缺失或者未知的數據.

判斷一個值是否爲空不能使用等於或者不等於.

例如,以下查詢嘗試找出沒有上級領導(manager 字段爲空)的員工:

  • 空值判斷的錯誤示例

    該語句沒有返回任何結果
    但確實存在這樣的數據。這個錯誤的原因在於將一個值與一個未知的值進行數學比較,結果仍然未知;即使是將兩個空值進行比較,結果也是未知。
    以下運算均是非法的,在 MySQL8.0 版本下,會報錯

  • [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

判斷空值

  • expression 的值爲空,IS NULL 返回真,IS NOT NULL 返回假

  • 表達式的值不爲空,IS NULL 返回假,IS NOT NULL 返回真

  • 正確地查找沒有上級領導的員工

如果僅僅能夠指定單個過濾條件,就無法滿足複雜的查詢需求;爲此,SQL 引入了用於構建複雜條件的邏輯運算符。

複合條件

藉助於邏輯代數中的邏輯運算,SQL 提供了三個邏輯運算符:

AND,邏輯與運算符。只有當兩邊的條件都爲真時,結果才爲真,返回數據;否則,不返回數據。
OR,邏輯或運算符。只要有一個條件爲真,結果就爲真,返回數據;否則,不返回數據。
NOT,邏輯非運算符。用於將判斷結果取反,真變爲假,假變爲真;空值取反後仍然爲空值。
AND 運算符
以下示例使用 AND 運算符查找性別爲“女”,並且月薪超過 10000 的員工:

SELECT emp_name, sex, salary
FROM employee
WHERE sex = ‘女’
AND salary > 10000;

emp_name sex salary
孫尚香 12000.00

“孫尚香”是女性員工,並且月薪爲 12000。

OR 運算符
使用 OR 運算符查找姓名爲“劉備”、“關羽”或者“張飛”的員工:

SELECT emp_name, sex, salary
FROM employee
WHERE emp_name = ‘劉備’
OR emp_name = ‘關羽’
OR emp_name = ‘張飛’;
該查詢的結果與前文中 IN 運算符的示例相同。

短路運算
對於邏輯運算符 AND 和 OR,SQL 使用短路運算(short-circuit evaluation)。也就是說,只要前面的表達式能夠決定最終的結果,不執行後面的計算。這樣能夠提高運算效率。因此,以下語句不會產生除零錯誤:

SELECT ‘AND’
FROM employee
WHERE 1 = 0 AND 1/0 = 1;

SELECT ‘OR’
FROM employee
WHERE 1 = 1 OR 1/0 = 1;
第一個查詢由於 AND 左邊的結果爲假,肯定不會返回任何結果,因此也就不會計算 1/0;第二個查詢由於 OR 左邊的結果爲真,一定會返回結果,同樣不會產生除零錯誤。

NOT 運算符
NOT 運算符可以結合其他的運算符一起使用,用於對查詢條件的結果取反:

NOT BETWEEN,位於範圍之外。
NOT IN,不在列表之中。
NOT LIKE,不匹配某個模式。LIKE 運算符用於字符串的模糊查找,將在下一篇中進行介紹。
NOT EXISTS,子查詢中不存在結果。關於子查詢和 EXISTS 運算符,將在第 16 篇中進行介紹。
NOT IS NULL,不爲空。等價於 IS NOT NULL。
以下示例查找除了“劉備”、“關羽”以及“張飛”之外的其他員工:

SELECT emp_id, emp_name
FROM employee
WHERE emp_name NOT IN (‘劉備’, ‘關羽’, ‘張飛’);
該語句的結果如下(顯示部分內容):

avatar

將多個邏輯運算符進行組合,可以構造任意複雜的查詢條件。不過,需要注意不同的運算符之間的優先級問題。

運算符優先級
假如我們想要知道人力資源部(deptid = 2)或者財務部門(deptid = 3)中,哪些員工擁有獎金。如果使用以下查詢:

SELECT emp_name, dept_id, bonus
FROM employee
WHERE dept_id = 2
OR dept_id = 3
AND bonus IS NOT NULL;
獲得的結果如下:

avatar

其中有兩條數據並不是我們期望的結果(“黃忠”和“魏延”並沒有獎金)。那麼問題出在哪裏了呢?因爲 AND 運算符比 OR 運算符的優先級高,所以該查詢返回的是人力資源部(deptid = 2)的員工,或者財務部(deptid = 3)中擁有獎金的員工。

如果想要獲得我們期望的結果,可以使用圓括號調整運算符的優先級:

SELECT emp_name, dept_id, bonus
FROM employee
WHERE (dept_id = 2 OR dept_id = 3)
AND bonus IS NOT NULL;
正確的結果如下:

avatar

以下是 SQL 中各種條件運算符按照優先級從高到低進行的排列;必要時可以使用圓括號進行調整。

=、!=、<>、<、<=、>、>=
IS [NOT] NULL、[NOT] LIKE、[NOT] BETWEEN、[NOT] IN、[NOT] EXISTS
NOT
AND
OR
除了使用查詢條件過濾數據之外,SQL 還提供了一種特殊的數據選擇操作:去除查詢結果中的重複值。

去除重複值
SQL 使用 DISTINCT 關鍵字去除查詢結果中的重複數據。例如,以下查詢返回了員工表所有可能的性別:

SELECT DISTINCT sex
FROM employee;

sex

首先,DISTINCT 位於 SELECT 之後而不是像其他過濾條件一樣位於 WHERE 之後;其次,查詢結果中重複的記錄只會出現一次。

與 DISTINCT 相反的是 ALL,用於返回不去重的結果。我們通常不需要加上 ALL 關鍵字,因爲它是默認的行爲。另外,爲了消除重複值,數據庫系統需要對結果進行排序,然後掃描重複值;因此,大量數據的重複值處理可能會降低查詢的速度。

Oracle 中的 UNIQUE 等價於 DISTINCT,MySQL 中的 DISTINCTROW 等價於 DISTINCT。

總結

在 SQL 中使用 WHERE 子句指定一個或者多個過濾條件,可以查找滿足要求的數據。SQL 查詢條件中支持各種比較運算符、邏輯運算符以及空值判斷等。另外,DISITINCT 關鍵字可以去除查詢結果中的重複記錄。

思考題:查找 2018 年 1 月 1 日之後入職,月薪小於 5000,並且獎金小於 1000(包括沒有獎金)的員工。

發佈了339 篇原創文章 · 獲贊 238 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章