SQL中EXISTS的使用
2018年09月14日 20:11:47 借物小人 阅读数 115 标签: EXISTS 更多
个人分类: SQL
//相关子查询里头这句话"带EXISTS 的子查询就是相关子查询",应该是错的,这句去掉就好了
exists : 强调的是是否返回结果集
- 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
- 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
关键词 | 意思 | 返回结果判断 |
---|---|---|
EXISTS | 若子查询的结果集非空时,返回“True” | 当为ture时,主查询返回结果 |
NOT EXISTS | 若子查询结果为空,返回“True” | 当为ture时,主查询返回结果 |
Exists执行的流程
Exists首先执行外层查询,再执行内存查询,与IN相反。 流程为首先取出外层中的第 一元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果时。返回外层表中的第一元组,接着取出第二元组,执行相同的算法。一直到扫描完外层整表
类似java:
for(int i =0; i<>EOFout;i++) {
for (int j = 0 ; j<EOFint,j++) {
}
}
- 1
- 2
- 3
- 4
- 5
IN 查询和 EXISTS 查询,返回结果相同
in查询,先执行内层查询
SELECT 姓名
FROM 学生表
WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1');
- 1
- 2
- 3
等价于 下面EXISTS 查询(先执行外层查询)
SELECT 姓名
FROM 学生表
WHERE EXISTS
(
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1'
);
在子查询中使用 NULL 仍然返回结果集
select * from table where exists(select null)
等同于: select * from table
- 1
- 2
EXISTS 和 = ANY 的查询,返回结果相同
select * from 学生表 where exists(select 选课表.学号 from 选课表 where 选课表.学号=学生表.学号)
select * from 学生表 where 学生表.学号=ANY(select 选课表.学号 from 选课表)
- 1
- 2
查询年龄最大的学生
SELECT *
FROM 学生表 user1
WHERE not EXISTS (
SELECT 1
FROM 学生表 user2
WHERE
user1.age < user2.age
)
查询选修了所有课程的学生的姓名
SELECT 姓名
FROM 学生表
WHERE NOT EXISTS (
SELECT *
FROM 课程表
WHERE NOT EXISTS (
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号
)
);
查询至少选修了S1所选的全部课程的学生名
SELECT 姓名
FROM 学生表
WHERE NOT EXISTS (
SELECT *
FROM 选课表 AS 选课表X
WHERE 选课表X.学号='s1' AND NOT EXISTS (
SELECT *
FROM 选课表 AS 选课表Y
WHERE 学生表.学号 = 选课表Y.学号 AND 选课表X.课程号 = 选课表Y.课程号
)
);
在FROM语句中使用子查询,对查询结果定义表名及列名
SELECT 学号, AVG_G
FROM (
SELECT 学号, AVG(Grade)
FROM 选课表
GROUP BY 学号
) AS RA(学号, AVG_G)
WHERE AVG_G > 80