子查询
子查询:sub query,查询是在某个查询结果之上进行的。(一条select语句内部包含了另外一条select语句)。
子查询分类
子查询有两种分类方式:按位置分类;按结果分类。
按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置
From子查询:子查询跟在from之后
Where子查询:子查询出现在where条件中
Exists子查询:子查询出现在exists里面
按结果分类:根据子查询得到的数据进行分类(理论上讲,任何一个查询得到的结果都可以理解为二维表)。
标量子查询:子查询得到的结果是一行一列
列子查询:子查询得到的结果是一列多行
行子查询:子查询得到的结果是多列一行(多行多列)
上面几个出现的位置都是在where之后
表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)
标量子查询
需求:知道班级名字为PHP0710,想获取该班的所有学生。
1. 确定数据源:获取所有的学生
Select * from my_student where c_id=?;
2. 获取班级ID:可以通过班级名字确定
Select id from my_class where c_name = “PHP0710”; --id一定只有一个值(一行一列)
列子查询
需求:查询所有在读班级的学生(班级表中存在的班级)
1. 确定数据源:学生
Select * from my_student where c_id in (?);
2. 确定有效班级的id:所有班级id
Select id from my_class;
列子查询返回结果会比较:一列多行,需要使用in作为条件匹配。其实在mysql中还有几个类似的条件:all,some,any。
=any ========== in; -- 其中一个即可
any ========== some; -- any跟some是一样
=all ========== 为全部
行子查询
行子查询:返回的结果可以是多行多列(一行多列)
需求:要求查询整个学生中,年龄最大且身高最高的学生。
1. 确定数据源
Select * from my_student where age=? and height=?;
2. 确定最大的年龄和最高的身高
Select max(age),max(height) from my_student;
行子查询:需要构造行元素,行元素由多个字段构成
表子查询
表子查询:子查询返回的结果是多行多列的二维表,子查询返回的结果是当做二维表来使用。
需求:找出每一个班最高的一个学生
1. 确定数据源:先将学生按照身高进行降序排序
Select * from my_student order by height desc;
2. 从每个班选出第一个学生
Select * from my_student group by c_id; -- 每个班选出第一个学生
表子查询:from子查询,得到的结果作为from的数据源
Exists子查询
Exists:是否存在的意思,exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后,exists返回的结果只有0和1。
需求:查询所有的学生:前提条件是班级存在
1. 确定数据源
Select * from my_student where ?;
2. 确定条件是否满足
Exists(Select * from my_class); --是否成立