SQL查询 找出满足下面条件的所有`教师`的`姓名`,他们的`工资`至少比`Biology`系某一个教师的工资要高
写法1
写法2
子查询 产生`Biology`系所有教师的所有工资值的集合
至少大于其中一个`>some`
some详解
其他运算符和some组合的情况
`=some`等价于in
`<>some`不等价与`not in`
SQL查询 找出`工资值`比`Biology`系每个教师的工资`都高`的所有教师的`姓名`
all详解
`<>all`等价于`not in`
`=all`不等价与in
SQL查询 找出平均工资最高的系
any
3.8.2 集合的比较
SQL查询 找出满足下面条件的所有教师
的姓名
,他们的工资
至少比Biology
系某一个教师的工资要高
作为一个说明嵌套子查询
能够对集合进行比较的例子,考虑查询”找出满足下面条件的所有教师
的姓名
,他们的工资
至少比Biology
系某一个教师的工资要高“。
写法1
在3.4.1节,我们将此查询写作:1
2
3select distinct T.name
from instructor as T,instructor as s
where T.salary >S.salary and S.dept_name = 'Biology';1
2
3
4
5
6
7
8
9
10
11
12
13
14
15mysql> select distinct T.name
from instructor as T,instructor as s
where T.salary >S.salary and S.dept_name = 'Biology';
+----------+
| name |
+----------+
| Wu |
| Einstein |
| Gold |
| Katz |
| Singh |
| Brandt |
| Kim |
+----------+
7 rows in set
写法2
子查询 产生Biology
系所有教师的所有工资值的集合
1 | ( |
产生Biology
系所有教师的所有工资值的集合。
至少大于其中一个>some
短语”至少比某一个要大“在SQL
中用>some
表示。>some
短语允许我们用一种更贴近此查询的文字表达的形式重写上面的查询:1
2
3
4
5
6
7select name
from instructor
where salary > some(
select salary
from instructor
where dept_name='Biology'
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19mysql> select name
from instructor
where salary > some(
select salary
from instructor
where dept_name='Biology'
);
+----------+
| name |
+----------+
| Wu |
| Einstein |
| Gold |
| Katz |
| Singh |
| Brandt |
| Kim |
+----------+
7 rows in set
当元组的salary
值至少比Biology
系教师的所有工资值集合中某一成员高时,外层select
的where
子句中>some
的比较为真。
some详解
其他运算符和some组合的情况
- 至少
小于
其中一个(<some
), - 至少
小于等于
其中一个(<=some
), - 至少
大于等于
其中一个(>=some
), - 至少
等于
其中一个(=some
) - 至少
不等于
其中一个(<>some
),SQL
中<>
符号是不等于
的意思
=some
等价于in
因为=some
的意思是至少等于其中一个,而in
关键字,也是至少等于其中一个的意思,所以=some
等价于in
。
<>some
不等价与not in
<>some
的意思是至少不等于其中任意一个,not in
的意思是都不等于其中任意一个.
可见not in
要求比<>some
要严格,所以<>some
不等价于not in
。
SQL查询 找出工资值
比Biology
系每个教师的工资都高
的所有教师的姓名
结构>all
对应于词组”比所有的都大“。使用该结构,我们写出査询如下:1
2
3
4
5
6
7select name
from instructor
where salary >all(
select salary
from instructor
where dept_name ='Biology'
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19mysql> select name
from instructor
where salary >all(
select salary
from instructor
where dept_name ='Biology'
);
+----------+
| name |
+----------+
| Wu |
| Einstein |
| Gold |
| Katz |
| Singh |
| Brandt |
| Kim |
+----------+
7 rows in set
all详解
- 大于其中所有的
<all
, - 小于等于其中所有的
<=all
, - 大于等于其中所有的
>=all
, - 等于其中所有的
=all
, - 不等于其中所有的
<>al
,
<>all
等价于not in
<>all
的意思是不等于其中所有的,和not in
的意思是一样的,两者等价。
=all
不等价与in
=all
的意思是等于其中所有的,in
的意思是等于其中一个
=all
比in要求要严格,=all
不等价于in
SQL查询 找出平均工资最高的系
作为集合比较的另一个例子,考虑查询”找出平均工资最高的系“。我们首先写一个查询来找出每个系的平均工资
,然后把它作为子查询嵌套在一个更大的查询中,以找出那些平均工资大于等于所有系平均工资的系。1
2
3
4
5
6
7
8select dept_name
from instructor
group by dept_name
having avg(salary) >= all(
select avg(salary)
from instructor
group by dept_name
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30mysql> select dept_name,avg(salary)
from instructor
group by dept_name;
+------------+--------------+
| dept_name | avg(salary) |
+------------+--------------+
| Biology | 72000 |
| Comp. Sci. | 77333.333333 |
| Elec. Eng. | 80000 |
| Finance | 85000 |
| History | 61000 |
| Music | 40000 |
| Physics | 91000 |
+------------+--------------+
7 rows in set
mysql> select dept_name
from instructor
group by dept_name
having avg(salary) >= all(
select avg(salary)
from instructor
group by dept_name
);
+-----------+
| dept_name |
+-----------+
| Physics |
+-----------+
1 row in set
any
在SQL
中关键词any
同义于some
。早期SQL
版本中仅允许使用any
,后来的版本为了避免和英语中any
一词在语言上的混淆,又添加了另一个可选择的关键词some
。
any
是任意一个some
是一些,也就是至少一个
1 | mysql> select name |