博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql学习总结(26)——MySQL子查询
阅读量:6447 次
发布时间:2019-06-23

本文共 1058 字,大约阅读时间需要 3 分钟。

mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询。
1、理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后。出现在from后的子查询结果通常是多行多列的,充当临时表;而出现在where后的子查询结果通常是单行单列,充当条件:
2、where后作为条件的子查询多与“=”、“!=”、“>”、“<”等比较运算符一起使用。结果虽然通常是单行单列,但是有的时候也会用单行多列,而且有的时候还会返回多行单列。如果是多行单列的情况,则多与in、any、all、exists结合使用:
in和not in:
其中in表示包含于后边子查询结果集里的任意一个,not in表示不包含于后边结果集里的任意一个。上图子查询的结果中,返回depart_id为1、2、4,因此第一个查询就会查出emp中所有depart_id是1或2或4的,第二个就会查出既不是1也不是2也不是4的。
any:
=any的用法和in的效果是一样的;>any是说要大于子查询结果集里的任意一个就可以,简单理解就是只要大于结果集中最小的那个就可以;<any就是要小于子查询结果集里任意一个就可以,简单理解就是只要小于最大的一个就可以。因此这里>any是只要大于1就行,而<any则只要小于4就行。
all:
>all就是说要大于子查询结果集里所有的,简单理解就是要比最大的那个还大;<all就是要小于结果集里所有的,简单理解就是要比最小的还小。因此上边的第一个查询就是要大于4,第二个就是要小于1。
exists:
exists和not exists只关心后边的子查询是否有结果,而不关心子查询的结果是什么;对于exists,如果后边的子查询有结果,那么它的值就是true,反之如果没有查到结果,则为false,而not exists正好和这个情况相反,有值为false,无值为true。当他们的值为true时,前边查询到的结果成立,会被加入到主查询的结果集,否则不会被加入主查询的结果集。
在上便的查询中,查询语句会先从emp中查询一条数据,然后拿这条数据的depart_id和company中的depart_id比较,当存在两个id相同的数据时,就会有结果返回,然后最终返回6条数据,而第二个查询一样的道理,当不存在两个id相同的数据时,主查询才有结果返回,只有一条数据。

转载于:https://www.cnblogs.com/zhanghaiyang/p/7212962.html

你可能感兴趣的文章
BlockingQueue(阻塞队列)详解
查看>>
Lotus Domino中使用Xpage技术打造通讯录
查看>>
awt组件中文乱码Intellij解决
查看>>
初步学习pg_control文件之七
查看>>
使用c#代码安装系统字体
查看>>
Orchard模块开发全接触4:深度改造前台
查看>>
[Spark][Python]Spark Join 小例子
查看>>
版本号对比
查看>>
[LeetCode] Expression Add Operators 表达式增加操作符
查看>>
ASP.NET Core 注入和获取 AppSettings 配置
查看>>
Maya Plugin 编译Maya插件
查看>>
oracle数据库性能
查看>>
开箱即用 - jwt 无状态分布式授权
查看>>
VS2008中使用NUnit
查看>>
【iOS】Alamofire库在iOS7下设置Head无效的问题
查看>>
css选择器的优先级
查看>>
MyEclipse junit测试问题initializationError
查看>>
用图片做网站输入验证的构想
查看>>
动态规划基本要素
查看>>
【java】值传递和引用传递---对象作为方法的参数传入属于哪种传递
查看>>