1、子查询(嵌套查询)的介绍
在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询.
select * from (select * from xxx) as t;
主查询和子查询的关系:
- 子查询是嵌入到主查询中
- 子查询是辅助主查询的,要么充当条件,要么充当数据源(数据表)
- 子查询是可以独立存在的语句,是一条完整的 select 语句
了解:子查询的应用场景
答:在我们需求的基础上,如果这个需求需要通过多条SQL语句分步查询的情况,一般都需要基于子查询。
2、子查询的使用
例1. 查询学生表中大于平均年龄的所有学生:
需求:查询年龄 > 平均年龄的所有学生
前提:① 获取班级的平均年龄值
② 查询表中的所有记录,判断哪个同学 > 平均年龄值
第一步:写子查询
select avg(age) from students;
第二步:写主查询
select * from students where age > (平均值);
第三步:第一步和第二步进行合并
select * from students where age > (select avg(age) from students);
例2. 查询tb_goods产品表中具有分类信息的产品
需求:查询产品表中具有分类信息的产品(没有与之对应分类信息的产品不显示)
前提:① 查询分类表中,到底有哪些分类(获取cid编号)
② 到产品表中进行判断,判断这个商品的cid编号与①中的是否相等
第一步:编写子查询
select cid from tb_category;
第二步:编写主查询
select * from tb_goods where cid in (所有分类cid编号)
第三步:把主查询和子查询合并
select * from tb_goods where cid in (select cid from tb_category);
例3. 查找年龄最小且成绩最低的学生:
第一步:获取年龄最小值和成绩最小值
select min(age), min(score) from student;
第二步:查询所有学员信息(主查询)
select * from students where (age, score) = (最小年龄, 最少成绩);
第三步:把第一步和第二步合并
select * from students where (age, score) = (select min(age), min(score) from students);
注:数据表中必须有这样一条记录,否则可能查询不到结果,重点练习子查询返回多个结果情况。