目录
1、子查询定义
2、子查询的注意事项
3、比较子查询
4、IN子查询
5、批量子查询
6、EXISTS子查询
1、子查询定义
子查询是将一个SELECT语句嵌套在另一个SELECT语句的where子句中的查询,执行时由内向外,子查询在其上一级父查询之前就被处理,其查询结果回送给父查询。
2、子查询的注意事项
- 使用圆括号将子查询的SELECT语句括起来。
当子查询的返回值为单个值时,子查询可以应用到任何表达式中。
3、比较子查询
比较子查询是指在父查询与子查询之间用比较运算符进行连接的查询,在这种类型的子查询中,子查询返回的值最多有一个。
题目:查询学生选课数据库,输出选修了’“音乐欣赏”这门课的所有学生的学号和成绩。
解析:先用子查询找到“mysql”这门课的课程号,再用父查询找出课程号等于子查询找到的课程号中的数据,输出选修了这门课的学生学号和成绩。
代码
select sno,score as mysql这门课的成绩
-> from elective
-> where cno=(select cno from course where cname='mysql');
运行效果
4、IN子查询
IN子查询是指父查询与子查询之间用IN或NOT IN进行连接并判断某个字段的值是否在子查询查找到的集合内。
题目:查询学生选课数据库,输出考试不及格的学生和姓名。
解析:先用子查询找到考试不及格的学生学号,再用父查询找出学生表中对应学号的学生姓名。
代码
select sno,sname as 考试不及格的学生
-> from studentinfo
-> where sno in(select sno from elective where(score)<60);
运行效果
5、 批量比较子查询
1,使用ANY、ALL谓词
在子查询前面使用ANY谓词,会使用指定的比较运算符将一个表达式的值或字段的值与每一个子查询返回值进行比较,只要有一次比较的结果为true,则整个表达式的结果为true,否则为false。
在子查询前面使用ALL谓词,会使用指定的比较运算符将一个表达式的值或字段的值与每一个子查询返回值进行比较,只有当所有比较的结果为true时,整个表达式的值才为true,否则为false。
题目:查询学生选课数据库,输出需要补考的学生姓名。
代码
select sname as 需要补考的学生
-> from studentinfo
-> where sno = any(select sno from elective where score<60);
运行效果
6、EXISTS子查询
EXISTS子查询是指在子查询前面加上EXISTS运算符或者 NOT EXISTS运算符,构成EXISTS表达式,如果子查询找到了满足条件的数据,表达式的返回值返回true,否则返回false。
题目:查询学生选课数据库的elective表,如果有需要补考的,就显示所有学生的成绩信息,如果没有需要补考的,就不输出任何信息。
代码
select * from elective
-> where exists(select * from elective where(score)<60);
运行效果