子查询和主查询
嵌入在其它查询语句中的select语句称为子查询。
其它的查询语句称为主查询。
所以说主查询是相对子查询来说的。
注意:
1 子查询是辅助主查询的,要么是充当主查询的条件,要么是充当主查询的数据源。
如果充当的是数据源,经常和连接查询配合使用。
2 子查询一定是一个完整的,可以单独执行的select查询语句。
子查询充当条件
在一个表中的某个结果,是另一个表的条件,可以用内连接去查到结果,也可以用子查询去查到结果。
1 标量子查询,返回的结果是一个字段,字段作为主查询的条件去使用
例1:查询姓名为张三的学生的成绩。
张三是在students学生表的,它的studentNo 是成绩表scores的一个字段。
select * from scores where sutdentNo =
(select studentNo from students where name = '张三')
2 列子查询,返回的结果是一列(一行,竖着多列的结果),作为主查询的条件
注意点:因为结果是一列,所以条件判断用in关键字。
例1:查询年龄为18岁的学员的成绩
select * from scores where studentNo in
(select studentNo from students where age = 18)
3 行子查询,返回的结果是一行或多行,作为主查询的条件
注意:这个时候查询的条件是多个,用小括号一一对应的方法即可。查询的select后面是多个字段,和主查询的条件对应。
例1:查询和张三同样班级和年龄的学生信息
select * from students where (name,age) =
(select name,age from students where name = '张三')
子查询充当数据源
子查询充当数据源,就相当于子查询的结果作为一个表,使用内连接来进行主查询。
例1:查询自动化测试和前端的课程成绩
思路:
1 自动化测试和前端,从课程表(course)去查,结果是一个新的表
2 这个新的表和成绩表进行内连接查询从而得出结果
3 注意起别名,数据源整体视为一个表 ,它的结果起别名
select co.name ,sc.score from scores as sc enner join (
select * from course where name in ('自动化测试','前端')
)as co on sc.courseNo = co.courseNo
子查询作为条件时,几个特殊关键字
子查询作为条件时,如果结果是一列,我们可以使用in作为过滤的关键字。
1但是实际开发中,经常使用的是any或者some,我们可以理解为any和some 和in是等价的。
2 not in 和 != all 是等价的。
他们只是写法不一样,我们遇到了这样的代码能看懂即可。