SQL邏輯運算子

2019-10-16 22:50:52

在本教學中,您將了解SQL邏輯運算子以及如何使用它們來測試條件是否為:true

邏輯運算子用於測試條件是否為:true。 與比較運算子類似,邏輯運算子返回值為三個:truefalseunknown的其中一個。

下表說明了SQL邏輯運算子:

編號 運算子 描述
1 ALL 如果所有比較都為真,則返回true
2 AND 如果兩個表示式都為真,則返回true
3 ANY 如果任何一個比較為真,則返回true
4 BETWEEN 如果運算元在一個指定範圍內,則返回true
5 EXISTS 如果子查詢有結果集,則返回true
6 IN 如果運算元等於列表中的值之一,則返回true
7 LIKE 如果運算元與模式匹配,則返回true
8 NOT 反轉其他布林運算子的結果。
9 OR 如果任一表示式為真,則返回true
10 SOME 如果某些表示式為真,則返回true

1. AND運算子

AND運算子用於在SQL語句的WHERE子句中構造多個條件,例如:SELECTUPDATEDELETE語句中:

expression1 AND expression2

如果兩個表示式的計算結果為true,則AND運算子返回true。以下範例中,將查詢薪水大於5000且小於7000的所有員工資訊:

SELECT 
    first_name, last_name, salary
FROM
    employees
WHERE
    salary > 5000 AND salary < 7000
ORDER BY salary;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Bruce      | Wong      | 6000   |
| Pat        | Zhou      | 6000   |
| Charles    | Yang      | 6200   |
| Shanta     | Liu       | 6500   |
| Susan      | Zhou      | 6500   |
| Min        | Su        | 6900   |
+------------+-----------+--------+
6 rows in set

2. OR運算子

AND運算子類似,OR運算子用於在SQL語句的WHERE子句中組合多個條件:

expression1 OR expression2

只要有一個表示式的計算結果為true,則OR運算子返回true
例如,以下語句查詢薪水為80009000的員工資訊:

SELECT 
    first_name, last_name, salary
FROM
    employees
WHERE
    salary = 8000 OR salary = 9000
ORDER BY salary;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Matthew    | Han       | 8000   |
| Alexander  | Lee       | 9000   |
| Daniel     | Chen      | 9000   |
+------------+-----------+--------+
3 rows in set

3. IS NULL運算子

IS NULL運算子將列的值與null值進行比較,如果比較的值為null,則返回true; 否則,它返回false。 例如,以下語句查詢沒有電話號碼的所有員工資訊:

SELECT 
    first_name, last_name, phone_number
FROM
    employees
WHERE
    phone_number IS NULL
ORDER BY first_name , last_name;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------------+
| first_name | last_name | phone_number |
+------------+-----------+--------------+
| Charles    | Yang      | NULL         |
| Jack       | Yang      | NULL         |
| John       | Liu       | NULL         |
| Jonathon   | Yang      | NULL         |
| Karen      | Liu       | NULL         |
| Kimberely  | Yang      | NULL         |
+------------+-----------+--------------+
6 rows in set

4. BETWEEN運算子

BETWEEN運算子用於搜尋在給定最小值和最大值範圍內的值。 請注意,最小值和最大值包含在條件集合中。

例如,以下語句查詢薪水在800010000之間的所有員工資訊。

SELECT 
    first_name, last_name, salary
FROM
    employees
WHERE
    salary BETWEEN 8000 AND 10000
ORDER BY salary;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Matthew    | Han       | 8000   |
| John       | Chen      | 8200   |
| Max        | Han       | 8200   |
| William    | Wu        | 8300   |
| Jack       | Yang      | 8400   |
| Jonathon   | Yang      | 8600   |
| Alexander  | Lee       | 9000   |
| Daniel     | Chen      | 9000   |
| Hermann    | Wu        | 10000  |
+------------+-----------+--------+
9 rows in set

註:800010000也出現在結果集中。

5. IN運算子

IN運算子將值與指定值列表進行比較。 如果比較值與列表中的其中一個值匹配,則IN運算子返回true; 否則返回false

以下語句查詢在部門ID為19的所有員工資訊。

SELECT 
    first_name, last_name, department_id
FROM
    employees
WHERE
    department_id IN (1 , 9)
ORDER BY department_id;

執行上面查詢語句,得到以下結果 -

+------------+-----------+---------------+
| first_name | last_name | department_id |
+------------+-----------+---------------+
| Jennifer   | Zhao      |             1 |
| Steven     | Lee       |             9 |
| Neena      | Wong      |             9 |
| Lex        | Liang     |             9 |
+------------+-----------+---------------+
4 rows in set

6. LIKE運算子

LIKE運算子使用萬用字元運算子將值與類似值進行比較。 SQL提供了兩個與LIKE運算子一起使用的萬用字元:

  • 百分號(%)表示零個,一個或多個字元。
  • 下劃線符號(_)表示單個字元。

以下語句查詢名字以字串Ma開頭的員工資訊:

SELECT 
    employee_id, first_name, last_name
FROM
    employees
WHERE
    first_name LIKE 'Ma%'
ORDER BY first_name;

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         120 | Matthew    | Han       |
|         112 | Max        | Su        |
|         121 | Max        | Han       |
+-------------+------------+-----------+
3 rows in set

以下範例查詢那些名字的第二個字元為i的所有員工資訊:

SELECT 
    employee_id, first_name, last_name
FROM
    employees
WHERE
    first_name LIKE '_i%'
ORDER BY first_name;

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         107 | Diana      | Chen      |
|         178 | Kimberely  | Yang      |
|         201 | Michael    | Zhou      |
|         113 | Min        | Su        |
|         122 | Min        | Liu       |
|         117 | Sigal      | Zhang     |
|         206 | William    | Wu        |
+-------------+------------+-----------+
7 rows in set

7. ALL運算子

ALL運算子將值與另一個值集中的所有值進行比較。 ALL運算子必須以比較運算子開頭,後跟子查詢。

以下是ALL運算子的語法:

comparison_operator ALL (subquery)

註,可在子查詢教學中了解子查詢的用法。

以下範例查詢薪水大於部門ID為8中所有員工工資的員工資訊:

SELECT 
    first_name, last_name, salary
FROM
    employees
WHERE
    salary >= ALL (SELECT 
            salary
        FROM
            employees
        WHERE
            department_id = 8)
ORDER BY salary DESC;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Steven     | Lee       | 24000  |
| Neena      | Wong      | 17000  |
| Lex        | Liang     | 17000  |
| John       | Liu       | 14000  |
+------------+-----------+--------+
4 rows in set

8. ANY運算子

ANY運算子根據條件將值與集合中的任何值進行比較,如下所示:

comparison_operator ANY(subquery)

ALL運算子類似,ANY運算子必須以比較運算子開頭,後跟子查詢。

例如,以下語句查詢薪水大於每個部門平均薪水的所有員工:

SELECT 
    first_name, last_name, salary
FROM
    employees
WHERE
    salary > ANY(SELECT 
            AVG(salary)
        FROM
            employees
        GROUP BY department_id)
ORDER BY first_name , last_name;

執行上面查詢語句,得到以下結果 -

+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Alexander  | Lee       | 9000   |
| Avg        | Su        | 11000  |
| Bruce      | Wong      | 6000   |
| Charles    | Yang      | 6200   |
| Daniel     | Chen      | 9000   |
... ...
| Shelley    | Wu        | 12000  |
| Steven     | Lee       | 24000  |
| Susan      | Zhou      | 6500   |
| Valli      | Chen      | 4800   |
| William    | Wu        | 8300   |
+------------+-----------+--------+
32 rows in set

請注意,SOMEANY的別名,因此,可以互換使用它們。

9. EXISTS運算子

EXISTS運算子測試子查詢是否包含任何行:

EXISTS (subquery)

如果子查詢返回一行或多行,則EXISTS的結果為true; 否則結果是false

例如,以下語句查詢所有具有受撫養人的員工資訊:

SELECT 
    first_name, last_name
FROM
    employees e
WHERE
    EXISTS( SELECT 
            1
        FROM
            dependents d
        WHERE
            d.employee_id = e.employee_id);

執行上面查詢語句,得到以下結果 -

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Steven     | Lee       |
| Neena      | Wong      |
| Lex        | Liang     |
| Alexander  | Lee       |
| Bruce      | Wong      |
| David      | Liang     |
| Valli      | Chen      |
| Diana      | Chen      |
... ...
| Shelley    | Wu        |
| William    | Wu        |
+------------+-----------+
30 rows in set

通過上面的學習,現在,您應該了解所有SQL邏輯運算子以及如何使用它們來測試條件。