SQL Any運算子


在本教學中,您將了解SQL ANY運算子以及如何使用它來將值與一組值進行比較。

1. 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的集合中的最大值。

2. SQL ANY範例

在下面範例中,我們將使用範例資料庫中的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運算子通過將值與一組值進行比較來形成條件。