人亦已歌 发表于 2023-1-18 18:34:17

Mysql数据库核心技术(十六)-查询数据(十一)-子查询

首先我们说一下何为子查询,它的意思是将一个查询语句的查询结果作为另一个查询语句的查询条件或表。
子查询语句一:
select * from user where name in (select name from stu666);语句解释:
查询stu666表的name字段数据,再查询user表中name字段数据为以上查询结果的全部数据。执行结果如下:


子查询语句二:
select * from user where (sex,age) in (select sex,max(age) from stu666 group by sex);语句解释:
查询stu666表的sex字段数据和男女生的最大年龄,再用该结果集查询user表的全部数据。

为了更直观的展示测试结果,我们先在stu666表中添加一个sex字段并填充数据。
alter table stu666 add column sex char after age;
update stu666 set sex='男' where pid=30;
update stu666 set sex='女' where pid=31;
update stu666 set sex='女' where pid=32;
update stu666 set sex='男' where pid=33;首先我们看一下子查询的结果集:


where (sex,age) in (以上结果集) 的含义是:相当于连续查询两次,第一次查询sex=女且age=10,第二次查询sex=男,age=22,然后将两次查询的结果集合并输出。


执行结果如下:


由于user表中没有age为16的数据,所以只输出一条结果。

子查询语句三:
select group_concat(age),sex,group_concat(name),group_concat(pid) from (select * from stu666 order by age desc) t group by sex;
语句解释:
查询stu666表的全部数据,查询结果按年龄的倒序排列,再将该结果集作为父查询语句的表,二次查询结果集中的age、sex和pid字段数据,然后将结果集按照sex进行分组。

首先我们看一下子查询的结果:


然后再执行完整语句,结果如下:


子查询语句四:
select * from user where exists (select * from stu666 where age=1);语句解释:
如果子查询有结果则执行父查询。not exists同理查询结果如下:


因为子查询为空,所以根本就没有执行父查询,结果为空。

好了,关于子查询大家只要能理解以上四条语句的语法结构就完全可以了,下面大家自己练习一下,一定要多练习。

CXJ 发表于 2023-1-30 20:37:05

很好的mysql教程,支持楼主发布原创教程

呕O麦噶 发表于 2023-1-31 04:12:31

讲的非常好,浅显易懂~

女王 发表于 2023-1-31 11:16:37

为了学mysql买了好几本书也没学会,这教程一看就懂了

lhl2008888 发表于 2023-2-1 01:48:53

佩服佩服,受教了

追梦人 发表于 2023-2-1 19:52:16

为了学mysql买了好几本书也没学会,这教程一看就懂了

寂寞的悲哀 发表于 2023-2-2 09:56:49

看一遍全部明白,剩下的就是记了,老师总结的很到位,记忆难度也小了不少

8000 发表于 2023-2-3 02:01:22

佩服佩服,受教了

hongbawudi 发表于 2023-2-16 01:52:44

赞一个赞一个赞一个赞一个赞一个

andyzzj 发表于 2023-2-19 01:29:11

老师辛苦了
页: [1] 2 3 4
查看完整版本: Mysql数据库核心技术(十六)-查询数据(十一)-子查询