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;

执行上面示例代码,得到以下结果:

《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;

执行上面示例代码,得到以下结果:

《SQL Any运算符》

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运算符通过将值与一组值进行比较来形成条件。

        原文作者:SQL教程
        原文地址: https://www.yiibai.com/sql/sql-any.html
        本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
    点赞