从形式上看,子查询就是一个select语句中又出现了一个select语句
最基本的要求:子查询语句需要使用一对括号括起来!
子查询的分类:
根据子查询返回值的形式可以分成:
- 单一值:返回单一值的子查询就叫作标量子查询
- 一列:返回一列的子查询就叫作列子查询
- 一行:返回一行的子查询就叫作行子查询
- 多行多列:返回多行多列的子查询就叫作表子查询
根据子查询出现的位置可以分成:
- from型:出现在from之后
- where型:出现在where之后
- exists型:出现在exists之后
列子查询:
列子查询的结果往往就是一列相同性质的数据的集合,所以,通常就是配合着in和not in等集合运算符一起来使用
案例:
找出php_student中所有已经开班了的学生的信息
分成两个步骤:
1,找出所有已经开班的班级号
2,找出符合条件的学生信息
select * from php_student where class_id in (select class_id from php_class);
行子查询:
查询结果为一行的子查询叫作行子查询
案例:
要查询php_student表中年龄最大而且分数还要最高的记录
1,先查询最大年龄和最高分
2,查询满足条件的记录
select * from php_student where (age,score) = (select max(age),max(score) from php_student);
表子查询:
返回结果为多行多列的子查询就是表子查询
表子查询一般都是用在from之后,当成一个数据源来使用
强调:必须要对子查询的结果起一个别名
常见的格式:
select *|字段列表 from制表查询结果 as 别名 where子句……
案例:
在不使用任何统计函数的前提下,找出php_student表中每个家乡home中分数score最低的一个学生
1,先对整个表以score字段进行排序
2,对排序后的表以home字段进行分组
select * from (select * from php_student order by score asc) as s group by home;
exists子查询:
exists主要是用来做判断的,判断一个子查询有没有数据返回!返回结果是一个布尔值
判断依据:如果一个子查询可以返回数据(查询到了数据),则认为exists表达式的值返回为真,否则就返回为假
select exists(select * from phpstudent where home=”西天”);