在本教學中,您將了解SQL ANY
運算子以及如何使用它來將值與一組值進行比較。
ANY
運算子是一個邏輯運算子,它將值與子查詢返回的一組值進行比較。 ANY
運算子必須以比較運算子:>
,>=
,<
,<=
,=
,<>
開頭,後跟子查詢。
以下是ANY
運算子的語法:
WHERE column_name comparison_operator ANY (subquery)
如果子查詢不返回任何行,則條件的計算結果為false
。 假設子查詢不返回零行,下面說明了ANY
運算子與每個比較運算子一起使用時的含義:
條件 | 表示含義 |
---|---|
x = ANY (…) |
c 列中的值必須與集合中的一個或多個值匹配,以評估為true 。 |
x != ANY (…) |
c 列中的值不能與集合中的一個或多個值匹配以評估為true 。 |
x > ANY (…) |
c 列中的值必須大於要評估為true 的集合中的最小值。 |
x < ANY (…) |
c 列中的值必須小於要評估為true 的集合中的最大值。 |
x >= ANY (…) |
c 列中的值必須大於或等於要評估為true 的集合中的最小值。 |
x <= ANY (…) |
c 列中的值必須小於或等於要評估為true 的集合中的最大值。 |
在下面範例中,我們將使用範例資料庫中的employees
表:
mysql> DESC employees;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| employee_id | int(11) | NO | PRI | NULL | auto_increment |
| first_name | varchar(20) | YES | | NULL | |
| last_name | varchar(25) | NO | | NULL | |
| email | varchar(100) | NO | | NULL | |
| phone_number | varchar(20) | YES | | NULL | |
| hire_date | date | NO | | NULL | |
| job_id | int(11) | NO | MUL | NULL | |
| salary | decimal(8,2) | NO | | NULL | |
| manager_id | int(11) | YES | MUL | NULL | |
| department_id | int(11) | YES | MUL | NULL | |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set
2.1. SQL ANY等於運算子範例
以下語句使用AVG()函式和GROUP BY
子句來查詢每個部門的平均工資:
SELECT
ROUND(AVG(salary), 2)
FROM
employees
GROUP BY
department_id
ORDER BY
AVG(salary) DESC;
執行上面範例程式碼,得到以下結果:
要查詢工資等於所在部門平均工資的所有員工,請使用以下查詢:
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,
salary;
執行上面範例程式碼,得到以下結果:
2.2. SQL 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,
salary;
執行上面範例程式碼,得到以下結果:
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Alexander | Lee | 9000 |
| Alexander | Su | 3100 |
| Avg | Su | 11000 |
| Britney | Zhao | 3900 |
... ...
| Sigal | Zhang | 2800 |
| Steven | Lee | 24000 |
| Susan | Zhou | 6500 |
| Valli | Chen | 4800 |
| William | Wu | 8300 |
+------------+-----------+--------+
40 rows in set
2.3. SQL ANY和大於運算子的範例
以下查詢查詢薪水大於每個部門平均薪水的所有員工:
SELECT
first_name,
last_name,
salary
FROM
employees
WHERE
salary > ANY (SELECT
AVG(salary)
FROM
employees
GROUP BY department_id)
ORDER BY
salary;
執行上面查詢語句,得到以下結果 -
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Diana | Chen | 4200 |
| Jennifer | Zhao | 4400 |
| David | Liang | 4800 |
| Valli | Chen | 4800 |
| Bruce | Wong | 6000 |
| Pat | Zhou | 6000 |
| Charles | Yang | 6200 |
| Shanta | Liu | 6500 |
... ...
| Karen | Liu | 13500 |
| John | Liu | 14000 |
| Neena | Wong | 17000 |
| Lex | Liang | 17000 |
| Steven | Lee | 24000 |
+------------+-----------+--------+
32 rows in set
請注意,最低平均工資是4150
。 上面的查詢返回薪水大於最低薪水的所有員工。
2.4. SQL 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 , salary;
執行上面查詢語句,得到以下結果 -
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Alexander | Lee | 9000 |
| Avg | Su | 11000 |
| Bruce | Wong | 6000 |
| Charles | Yang | 6200 |
| Daniel | Chen | 9000 |
| David | Liang | 4800 |
| Diana | Chen | 4200 |
| Hermann | Wu | 10000 |
... ...
| Pat | Zhou | 6000 |
| Shanta | Liu | 6500 |
| Shelley | Wu | 12000 |
| Steven | Lee | 24000 |
| Susan | Zhou | 6500 |
| Valli | Chen | 4800 |
| William | Wu | 8300 |
+------------+-----------+--------+
32 rows in set
2.5. SQL ANY使用小於運算子的範例
以下查詢查詢薪水低於每個部門平均薪水的所有員工:
SELECT
first_name,
last_name,
salary
FROM
employees
WHERE
salary < ANY (SELECT
AVG(salary)
FROM
employees
GROUP BY department_id)
ORDER BY salary DESC;
執行上面查詢語句,得到以下結果 -
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Neena | Wong | 17000 |
| Lex | Liang | 17000 |
| John | Liu | 14000 |
| Karen | Liu | 13500 |
| Michael | Zhou | 13000 |
| Nancy | Chen | 12000 |
| Shelley | Wu | 12000 |
... ...
| Alexander | Su | 3100 |
| Shelli | Zhang | 2900 |
| Sigal | Zhang | 2800 |
| Irene | Liu | 2700 |
| Guy | Zhang | 2600 |
| Karen | Zhang | 2500 |
+------------+-----------+--------+
39 rows in set
在此範例中,員工的工資小於每個部門的最高平均工資:
2.6. SQL ANY使用小於或等於運算子範例
要查詢工資小於或等於每個部門平均工資的員工,請使用以下查詢:
SELECT
first_name,
last_name,
salary
FROM
employees
WHERE
salary <= ANY (SELECT
AVG(salary)
FROM
employees
GROUP BY department_id)
ORDER BY salary DESC;
執行上面查詢語句,得到以下結果 -
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Neena | Wong | 17000 |
| Lex | Liang | 17000 |
| John | Liu | 14000 |
| Karen | Liu | 13500 |
| Michael | Zhou | 13000 |
| Nancy | Chen | 12000 |
| Shelley | Wu | 12000 |
... ...
| Alexander | Su | 3100 |
| Shelli | Zhang | 2900 |
| Sigal | Zhang | 2800 |
| Irene | Liu | 2700 |
| Guy | Zhang | 2600 |
| Karen | Zhang | 2500 |
+------------+-----------+--------+
39 rows in set
如上結果所示,結果集包括員工的工資低於或等於每個部門的最高平均工資。
現在,您應該知道如何使用SQL ANY
運算子通過將值與一組值進行比較來形成條件。