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