概念
子查询就是在原有的查询语句中,
嵌入新的查询,来得到我们想要的结果集。
也叫嵌套查询。
格式:
SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);
子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询(外查询)使用 。
子查询分为:比较子查询,IN/NOT
IN子查询,EXISTS/NOT EXISTS子查询
比较查询类型
单行子查询:返回一行数据
SELECT * from student WHERE birthday>(SELECT birthday FROM student WHERE name = 'Tom');
多行子查询:返回多行数据
输出选修3-105课程,其成绩高于109号同学在此课程所得成绩的所有同学的学号,姓名
SELECT student.no,name FROM student INNER JOIN score ON student.no=score.no
WHERE score.cno='3-105' AND degree > ALL
(SELECT degree FROM student,score WHERE score.no='109' ) ;
带有IN运算符的子查询
SELECT * FROM student WHERE stuid IN (
SELECT stuid FROM score);
例:SELECT * FROM student WHERE stuid NOT IN (
SELECT stuid FROM score WHERE student.stuid = score.stuid );
IN/NOT IN区别:
IN/NOT IN先执行子查询,子查询返回的是一个
集合,然后再将子查询的结果作为外层查询的条
件进行过滤。
EXISTS型子查询
exists即:外层sql查询所查到的行代入内层sql查询,要使内层查询能够成立 查询可以与in型子查询互换,但效率要高
select * from 表名 where exists
(select * from 表名 where …);
查询参加了考试的所有学生的信息
SELECT * FROM student WHERE EXISTS(
SELECT stuid FROM score
WHERE student.stuid = score.stuid
);
查询未参加了考试的所有学生的信息
SELECT * FROM student WHERE NOT EXISTS(
SELECT stuid FROM score
WHERE student.stuid = score.stuid
);
EXISTS/NOT EXISTS区别 :
EXISTS/NOT EXISTS先执行外层查询,再将外层
查询的每一条记录作为条件进行子查询,子查询 返回的只是返回一个TRUE或FALSE,因此一般情况 下子查询中直接使用SELECT
1提高效率。