SQL语法练习4

紧接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 条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值