子查询是指在一个查询语句中,还包含了多个其它的查询。其中,包含了其它查询的查询叫“父查询”,被包含的查询叫做“子查询”。
使用子查询有什么好处呢?先看一个小例子。
例如,从下面的成绩表中查询成绩最好的记录:
学号 科目 成绩
100 语文 90
101 数学 80
102 语文 90
不管用什么技术,思路是相同的。
先找出最高分:
select max(成绩) from 成绩表
返回:
90
然后再找出分数等于这个最高分的记录:
select * from 成绩表 where 成绩=90
返回:
学号 科目 成绩
100 语文 90
102 语文 90
但是如果用子查询,则只需要写一句,这显然要方便一些:
select * from 成绩表
where 成绩=(select max(成绩) from 成绩表)
返回结果同上。
其中,
主查询是:select * from 成绩表 where 成绩 = ?
子查询是:select max(成绩) from 成绩表
而理解子查询的关键就是理解多个查询运行的先后顺序。
本例显然是先执行括号中的子查询,再执行外部父查询。
先执行:select max(成绩) from 成绩表 返回 90
再执行:select * from 成绩表 where 成绩= ( 90 )
返回:
学号 科目 成绩
100 语文 90
102 语文 90
同时,从上面的例子也可以看出,使用子查询很方便、很强大。当然,这只是使用子查询其中的一个优点而已。
子查询我认为是数据库基础中是最令人头晕的章节。所以下面将根据由易到难的顺序列出各项知识点,然后再逐项进行讲解。
知识点:
1、子查询的分类:
从位置上分,有:计算列子查询,嵌套子查询,条件子查询。
从逻辑上分,有:相关子查询,非相关查询。
另外,两个查询还能进行集合运算(如并集),叫:组合查询。
2、先学习容易理解的子查询:非相关子查询、嵌套子查询和条件子查询。
3、再学习比较难理解的子查询:相关子查询,重点是理解相关子查询的执行流程,使用场合,以及性能优化的方法。