在本教程中,您将了解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运算符通过将值与一组值进行比较来形成条件。