子查询
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
子查询的类型
查询语句中的任何条件,值,范围,都可以使用子查询表示。
- 子查询结果为多行多列(当作虚拟表来使用)
-- 查询成绩比该课程平均成绩低的同学的成绩表
select s.sno,s.degree,aa.cno,aa.a from scores s
inner join (select cno,avg(degree) a from scores group by cno) aa on s.cno = aa.cno
where s.degree < aa.a;
- 子查询结果为多行一列(可以当作多个值来用(1,2,3,4))
-- 查询存在有85分以上成绩的课程名字
SELECT cs.cno,cs.cname from courses cs
where cs.cno in (SELECT DISTINCT cno from scores where degree > 85);
子查询结果为一个值。(可以作为字段使用)
-- 查询成绩表中分数最高的同学的记录
SELECT * from scores where degree = (SELECT max(degree) from scores);
比较运算符中使用子查询
如果子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入any、some或all。其中等值关系可以用IN操作符。
all子查询
all可以与=、>、>=、<、<=、<>结合是来使⽤,分别表示等于、⼤于、⼤于等于、 ⼩于、⼩于等于、不等于其中的所有数据。当所有数据都满足才是true,会返回满足所有条件的数据。
-- 查询选修编号为3-105且成绩高于所有选修编号为3-245的课程同学的cno,sno,degree
SELECT * from scores WHERE cno='3-105' and degree > all(
SELECT degree from scores where cno='3-245'
);
any/some子查询
any 可以与=、>、>=、<、<=、<>结合起来使⽤,分别表示等于、⼤于、⼤于等于、⼩于、⼩于等于、不等于其中的任何⼀个数据。也就是说只要有任意一个满足就是true。并且显示满足条件的数据。
-- 查询选修编号为“3-105”且成绩至少高于任意一位选修编号为“3-245”的同学的信息
select * from scores where cno='3-245' and degree > any(
select degree from scores where cno='3-245'
);
exists子查询
where exist (⼦查询)如果该⼦查询有结果数据(⽆论什么数据,只要⼤于等于1⾏),则就为true,否则就为false
-- 如果存在年龄大于40的学生,那么就展示全部的学生
SELECT * from student WHERE EXISTS (SELECT * from class where classid=4);
not 关键字
表示“非”、不等于