在本教學中,您將了解SQL邏輯運算子以及如何使用它們來測試條件是否為:true
。
邏輯運算子用於測試條件是否為:true
。 與比較運算子類似,邏輯運算子返回值為三個:true
,false
或unknown
的其中一個。
下表說明了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 。 |
AND
運算子用於在SQL語句的WHERE
子句中構造多個條件,例如:SELECT
,UPDATE
和DELETE
語句中:
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
與AND
運算子類似,OR
運算子用於在SQL語句的WHERE
子句中組合多個條件:
expression1 OR expression2
只要有一個表示式的計算結果為true
,則OR
運算子返回true
。
例如,以下語句查詢薪水為8000
或9000
的員工資訊:
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
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
BETWEEN
運算子用於搜尋在給定最小值和最大值範圍內的值。 請注意,最小值和最大值包含在條件集合中。
例如,以下語句查詢薪水在8000
到10000
之間的所有員工資訊。
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
註:
8000
和10000
也出現在結果集中。
IN
運算子將值與指定值列表進行比較。 如果比較值與列表中的其中一個值匹配,則IN
運算子返回true
; 否則返回false
。
以下語句查詢在部門ID為1
或9
的所有員工資訊。
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
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
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
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
請注意,SOME
是ANY
的別名,因此,可以互換使用它們。
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邏輯運算子以及如何使用它們來測試條件。