嵌套在其他查询中的查询即子查询,子查询也叫内部查询。子查询中有相关子查询和不相关子查询:相关子查询是指查询结果依赖于外部查询的子查询,外部查询每执行一次,内部子查询也会执行一次;而不相关子查询是指独立于外部查询的子查询,内部子查询仅执行一次,执行完毕后将查询结果作为外部查询的条件使用。
下面用具体示例来说明相关子查询和不相关子查询的区别:
数据表说明:
成绩表grade1(id,name,score)参数说明:
id:学生编号,name:学生姓名,score:学生成绩
成绩表grade2(sid,cid,score)参数说明:
sid:学生编号,cid:课程编号,score:课程成绩
数据表创建:
创建数据表grade1:
-
# 创建学生成绩表: create table grade1( id int, name varchar(10), score int (10) )engine myisam charset utf8; # 向成绩表中插入数据: insert into grade1 values (1,'张无忌',85), (2,'李隆基',59), (3,'王五',60), (4,'曹操',79), (5,'小明',90), (6,'如花',60), (7,'尉迟恭',100), (8,'欧阳风',90), (9,'刘备',90), (10,'董永',99), (11,'冯钰',83), (12,'孙殿英',82);
创建数据表grade2:
-
# 创建成绩表: create table grade2( sid varchar(10), cid varchar(10), score decimal(4,1) )engine myisam charset utf8; # 向成绩表中插入数据: insert into grade2 values ('01','01',80), ('01','02',90), ('02','01',70), ('02','02',60), ('02','03',80), ('02','04',85), ('03','01',80), ('03','02',80), ('03','03',80), ('03','04',61), ('04','01',75), ('04','02',30), ('04','03',20), ('04','04',45), ('05','01',76), ('05','02',87), ('05','03',99), ('05','04',75), ('06','01',31), ('06','02',65), ('06','03',34), ('07','02',89), ('07','03',98), ('09','03',82), ('10','01',88), ('10','02',90), ('13','01',59), ('13','02',79), ('13','04',81);
相关子查询
查看grade2表中的具体数据:
从grade2表中查询出每位学生大于其所修全部课程平均分的课程分数信息:
select * from grade2 as temp1
where score > (select avg(temp2.score) from grade2 as temp2 where temp2.sid = temp1.sid);
结果:
不相关子查询
查看grade1表中的具体数据:
select * from grade1
从grade1表中查询出分数大于所有学生平均分的学生的成绩信息:
select * from grade1 where score > (select avg(score) from grade1);
结果:
参考:
https://dev.mysql.com/doc/refman/5.7/en/correlated-subqueries.html
https://blog.youkuaiyun.com/qiushisoftware/article/details/80874463