一条查询语句出现在另外一条查询语句的内部,这条语句就被称之为子查询语句。
子查询分类
子查询可以根据子查询返回的结果以及子查询出现的位置两种方式进行分类
按结果分类:
标量子查询:子查询返回的结果是一行一列,一个字段的某一个值
列子查询:子查询返回的结果是一列,多行,一个字段有多个值
行子查询:子查询返回的结果是一行多列,多行多列
表子查询:子查询返回的结果多行多列
按照位置分类:
where子查询:子查询出现在where条件之后
from子查询:子查询出现在from之后
exists子查询:出现在exists之后,exists出现在where之后
标量子查询
子查询返回的结果是一个标量
列子查询
子查询返回的结果是一列。
需求:获取所有班级的所有学生,学生必须在班级中存在。
select * from student where c_id is not null; -- 无法解决
解决方案
- 获取所有的现有班级的id:select id from class;
- 从学生表中查出所有数据,判断学生的班级id是否在刚查出来的班级id中存在
行子查询
子查询返回的结果是一行多列
需求:找出所有班级中年龄最大,同时身高最高的学生;
行子查询必须构建行元素:有多个字段的元素
select * from 表名 where (字段1,字段2…) =/in (select 字段1,字段2… from 表名);
查找年龄最大的学生的所有信息
查找年龄最大的男生的所有信息
表子查询
表子查询从返回结果的层面上讲与行子查询完全一样。因为其出现的位置不是在where之后,而是在where之前,from之后。from后接数据源。
需求:求出每个班中身高最高的1个学生。
表子查询出现的原因:因为某些时候,希望order by在group by之前先执行。
查找性别,年龄,姓名,班级 并以年龄升序;