紧接SQL语法练习3
四.子查询
基本子查询
相当于就是SELECT 嵌套语句的查询
4.1.1查询年龄最大的学生信息,显示信息包含学生的id、学生的名称、学生的年龄
4.1.2查询一班和三班学生信息
4.1.3查询一班学生年龄大于18岁的学生信息
-- 4.子查询
-- 4.1.1查询年龄最大的学生信息,显示信息包含学生的id、学生的名称、学生的年龄
SELECT * FROM shs_students WHERE age in (SELECT MAX(age) FROM shs_students);
-- 4.1.2查询一班和三班学生信息
SELECT * FROM shs_students WHERE shs_students.class_id in (SELECT id FROM shs_class WHERE id='1' or id='3');
SELECT * FROM shs_students JOIN shs_class ON shs_students.class_id=shs_class.id WHERE class_id='1' or class_id='3';
-- 4.1.3.查询一班学生年龄大于18岁的学生信息
SELECT * FROM shs_students WHERE age>18 and shs_students.class_id in (SELECT id FROM shs_class WHERE id='1');
SELECT * FROM shs_class JOIN shs_students ON shs_class.id=shs_students.class_id WHERE age>18 and shs_class.id=1;
4.1子查询关键字之all
all关键字用在比较操作操符的后面,表示查询结果的多个数据中的所有都满足该比较操作符才算满足
比较操作符:= 、>、!=、>=、<=等
4.1.1 查询年龄大于一班所有年龄的学生信息
4.1.2 查询没有班级的学生信息
-- 4.1.1 查询年龄大于一班所有年龄的学生信息
SELECT * FROM shs_students WHERE age > all(SELECT age FROM shs_students WHERE shs_students.class_id='1' );
-- 4.1.2 查询没有班级的学生信息
select * from shs_students where shs_students.class_id is null or shs_students.class_id!= all(select shs_class.id from shs_class );
4.2子查询关键字之any
4.2.1查询学生年龄大于一班任意一个学生年龄的信息
SELECT * FROM shs_students WHERE age > ANY(SELECT age FROM shs_students WHERE shs_students.class_id='1' ) and shs_students.class_id!=1 ;
all和any的区别?
all 底层是多个 and 比较
any 底层是多个 or 比较
4.3子查询关键字之not in和in
in关键字 用于判断某个记录的值 是否在指定的集合中
使用 not in 可以实现取反
4.3.1查询一班和三班所有学生信息
-- 4.3.1 查询一班和三班所有学生信息
SELECT * FROM shs_students WHERE shs_students.class_id in (SELECT id FROM shs_class WHERE shs_class.id='1' or shs_class.id='3');
4.4子查询关键字之exists
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS比in关键字运算效率高,实际开发中,如果是数据量大的情况下,推荐使用EXISTS关键字。
4.4.1.查询学生年龄大于18岁的学生信息
4.4.2.查询班级下 有学生的班级
4.4.3.查询有班级的学生信息
-- 4.4.1.查询学生年龄大于18岁的学生信息
SELECT * FROM shs_students WHERE age>18;
SELECT * FROM shs_students s1
WHERE EXISTS(select * from shs_students
where s1.age >18
);
-- 4.4.2.查询班级下有学生的班级
SELECT * FROM shs_class WHERE EXISTS (SELECT *FROM shs_students WHERE shs_class.id=shs_students.class_id);
-- 4.4.3.查询有班级的学生信息
SELECT * FROM shs_students WHERE EXISTS (SELECT *FROM shs_class WHERE shs_class.id=shs_students.class_id);
4.5子查询之自关联查询
对mysql数据自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。
注意 关联查询时必须给表取别名,格式为:
select 字段列表 from 表名称 a ,表 名称b where 条件; 或者 select 字段列表 from 表名称 a left join 表名称 b on 条件