设为首页 收藏本站
查看: 464|回复: 0

[经验分享] Mysql子查询的概念、分类、语法

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-1 08:41:43 | 显示全部楼层 |阅读模式

wKiom1Zb4xayly9_AABlk1iuVTY168.jpg



场景:查找身高最高的学生
按照身高降序排序,取得第一个
1
select * from select_student order by height desc limit 0,1;



wKiom1Zb3v6y5JGDAAC1E75UqSs856.jpg
问题是出现等高的学生,问题不能处理!
应该,找到最高的身高,然后找到所有符合最高身高的学生
1
select max(height) from select_student;



1
select * from select_student where height=180.05;





上面两条语句可以整合为一条语句:
1
select * from select_student where height=select max(height) from select_student;




此时,select max() 出现在另外的语句内部,称之为子查询语句
注意:子查询,应该始终出现括号内!
1
select * from select_student where height=(select max(height) from select_student);





子查询的分类:
    分类的依据:
    1,依据子查询出现的位置

        where型子查询,出现在where子句内

        from型子查询,出现在from子句内

    2,依据子查询的返回数据的格式

        标量子查询,返回值是一个数据,称之为标量子查询

        列子查询,返回一个列

        行子查询,返回一个行

        表子查询,返回的是一个二维表





  • from型:



场景:查询下表每个班级之内,身高最高的学生


wKioL1Zb5QPSGvupAABUMQ7zDoo853.jpg


应该先将每个班最高的放置在班内的第一个位置,再按照班级进行分组
不能使用order by 再使用group by
而需要,先用一个查询,得到身高排序结果,再将该结果分组


留意:from需要一个数据还是一个表,需要将子查询返回的数据,导出成表即可!为子查询起个别名即可!
1
select * from (select * from select_student order by height desc) as tmp group by class_id;



wKioL1Zb5oXx4iA6AABU2pN0k48116.jpg

  • 列子查询   

返回值应该是一列
wKioL1Zb553R_Gr8AAAdxXmB9FI533.jpg



由于返回的是一列,是一类数据,看成是一个数据的集合。



查询所有班内女同学的男学生信息:

条件:先确定哪些班级内有女生:

1
select class_id from select_student where gender='female' group by class_id;



再在该班级之内,找到所有的男生:

1
2
select * from select_student where gender='male' and class_id in
(select class_id from select_student where gender='female' group by class_id);



典型的列子查询使用 in or not in 作为子查询的条件!



列子查询,还可以使用 =some , !=all 或者其他的运算符配合 some() 和 all() 语法完成!

some() 表示集合中的一部分! =some()相当于in , !=some()不相当于 not in !

all() 表示集合中的全部!(!=all() 相当于not in)


  • 行子查询


    场景:找到最高,最富有的学生!

1
2
select * from select_student where height=(select max(height) from select_student)
and money=(select max(money) from select_student);



上面的代码可以简化为:
1
2
select * from select_student where (height,money) = (select max(height),max(money)
form select_student;






使用行子查询可以,一次性查出来一个行(多个行)使用行进行匹配!上面使用了(),构建了一行!与子查询的行作比较!


  • exists型子查询

    判断依据不是根据子查询所返回的数据!只是根据子查询是否存在的返回数据来看;
    语法:exists(子查询);

    如果子查询存在返回数据,则exists返回真,反之返回假!

    出现在where条件内:

1
select * from select_student where exists(select 1);





场景:
        检索出班级已经不存在的学生

1
2
select * from select_student where exists(select * from select_class where
select_student.class_id=select_class.id);





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-145628-1-1.html 上篇帖子: Mysql连接查询介绍 下篇帖子: 常见的高可用MySQL解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表