在本教程中,您将了解SQL ALL运算符以及如何使用它来将值与一组值进行比较。
1. SQL ALL运算符简介
SQL ALL
运算符是一个逻辑运算符,它将单个值与子查询返回的单列值集进行比较。
以下是SQL ALL
运算符的语法:
WHERE column_name comparison_operator ALL (subquery)
SQL ALL
运算符必须以比较运算符开头,例如:>
,>=
,<
,<=
,<>
,=
,后跟子查询。 某些数据库系统(如Oracle)允许使用文字值列表而不是子查询。
请注意,如果子查询不返回任何行,则WHERE
子句中的条件始终为true
。 假设子查询返回一行或多行,下表说明了SQL ALL
运算符的含义:
条件 | 描述 |
---|---|
c > ALL(…) | c 列中的值必须大于要评估为true 的集合中的最大值。 |
c >= ALL(…) | c 列中的值必须大于或等于要评估为true 的集合中的最大值。 |
c < ALL(…) | c 列中的值必须小于要评估为true 的集合中的最小值。 |
c <= ALL(…) | c 列中的值必须小于或等于要评估为true 的集合中的最小值。 |
c <> ALL(…) | c 列中的值不得等于要评估为true 的集合中的任何值。 |
c = ALL(…) | c 列中的值必须等于要评估为true 的集合中的任何值。 |
2. SQL All运算符示例
我们将使用示例数据库中的employees
表进行演示:
2.1. SQL ALL使用大于运算符
以下查询查找column_name
列中的值大于子查询返回的最大值的行:
SELECT
*
FROM
table_name
WHERE
column_name > ALL (subquery);
例如,以下语句查找工资大于部门ID
为2
的员工最高工资的所有员工:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary > ALL (SELECT
salary
FROM
employees
WHERE
department_id = 2)
ORDER BY salary;
执行上面查询语句,得到以下结果:
下面通过查询部门ID为2
中员工的最高薪水来验证它:
mysql> SELECT
MAX(salary)
FROM
employees
WHERE
department_id = 2;
+-------------+
| MAX(salary) |
+-------------+
| 13000 |
+-------------+
1 row in set
此查询返回13000
,该值小于使用上述ALL
运算符的查询返回的任何薪水。
2.2. SQL ALL大于或等于运算符
下面显示了具有大于或等于运算符的SQL ALL
运算符的语法:
SELECT
*
FROM
table_name
WHERE
column_name >= ALL (subquery);
该查询返回column_name
列中的值大于或等于子查询返回的所有值的所有行。
例如,以下查询查找薪水大于或等于市场营销部门(department_id=2
)员工最高薪水的所有员工:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary >= ALL (SELECT
salary
FROM
employees
WHERE
department_id = 2)
ORDER BY salary;
执行上面查询语句,得到以下结果:
如上图中所示,Michael
员工的薪水为13000
,等于营销部门员工的最高薪水包含在结果集中。
2.3. SQL ALL使用小于运算符
以下说明了ALL
运算符结合小于运算符一起使用的查询:
SELECT
*
FROM
table_name
WHERE
column_name < ALL (subquery);
此查询返回column_name
列中的值小于子查询返回的最小值的所有行。
以下语句查找市场营销部门(department_id=2
)中员工的最低薪水:
SELECT
MIN(salary)
FROM
employees
WHERE
department_id = 2;
+-------------+
| MIN(salary) |
+-------------+
| 6000 |
+-------------+
1 row in set
要查找薪水低于市场营销部门(department_id=2
)员工最低薪水的所有员工,请使用ALL
运算符和小于运算符,如下所示:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary < ALL (SELECT
salary
FROM
employees
WHERE
department_id = 2)
ORDER BY salary DESC;
执行以上查询语句,得到以下结果:
2.4. SQL ALL小于或等于运算符
以下是ALL
运算符与小于或等于运算符一起使用的语法:
SELECT
*
FROM
table_name
WHERE
column_name <= ALL (subquery);
例如,以下语句查找薪水小于或等于市场营销部门(department_id=2
)员工最低薪水的所有员工:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary <= ALL (SELECT
salary
FROM
employees
WHERE
department_id = 2)
ORDER BY salary DESC;
执行以上查询语句,得到以下结果:
2.5. SQL ALL与不等于运算符
以下查询返回column_name
列中的值不等于子查询返回的任何值的所有行:
SELECT
*
FROM
table_name
WHERE
column_name <> ALL (subquery);
例如,要查找工资不等于每个部门平均工资的员工,请使用以下查询:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary <> ALL (SELECT
AVG(salary)
FROM
employees
GROUP BY department_id)
ORDER BY salary DESC;
执行以上查询语句,得到以下结果:
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Steven | Lee | 24000 |
| Neena | Wong | 17000 |
| Lex | Liang | 17000 |
| John | Liu | 14000 |
| Karen | Liu | 13500 |
| Michael | Zhou | 13000 |
| Nancy | Chen | 12000 |
| Shelley | Wu | 12000 |
| Avg | Su | 11000 |
| Alexander | Lee | 9000 |
... ...
| Shelli | Zhang | 2900 |
| Sigal | Zhang | 2800 |
| Irene | Liu | 2700 |
| Guy | Zhang | 2600 |
| Karen | Zhang | 2500 |
+------------+-----------+--------+
35 rows in set
请注意,子查询通过使用AVG()函数和GROUP BY子句查找部门员工的平均工资。
2.6. SQL ALL与等于运算符
当将ALL运算符与等于运算符一起使用时,查询将查找column_name
列中的值等于子查询返回的任何值的所有行:
SELECT
*
FROM
table_name
WHERE
column_name = ALL (subquery);
以下示例查找薪水等于市场营销部门(department_id=2
)员工最高薪水的所有员工:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary = ALL (SELECT
MAX(salary)
FROM
employees
WHERE
department_id = 2);
执行上面查询语句,得到以下结果:
+------------+-----------+--------+
| first_name | last_name | salary |
+------------+-----------+--------+
| Michael | Zhou | 13000 |
+------------+-----------+--------+
1 row in set
在本教程中,您学习了如何使用SQL ALL
运算符来测试值是否与子查询返回的值集匹配。