文档章节

Mysql——子查询

architect刘源源
 architect刘源源
发布于 2018/03/08 15:19
字数 1295
阅读 13
收藏 0

子查询的位置: 
select 中、from 后、where 中.group by 和order by 中无实用意义。 

子查询分为如下几类: 
1,标量子查询:返回单一值的标量,最简单的形式。 
2,列子查询:返回的结果集是 N 行一列。 
3,行子查询:返回的结果集是一行 N 列。 
4,表子查询:返回的结果集是 N 行 N 列。 
可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS  


标量子查询:是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。 
可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧 
示例: 
SELECT * FROM article WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1) 
SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2) 
SELECT * FROM article AS t WHERE 2 = (SELECT COUNT(*) FROM article WHERE article.uid = t.uid) 




MySQL 列子查询:指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。 
可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧 
示例:可以使用 IN、ANY、SOME 和 ALL 操作符,不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。 


示例: 
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2) 
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2) 
NOT IN 是 <> ALL 的别名,二者相同。 
特殊情况 
如果 table2 为空表,则 ALL 后的结果为 TRUE; 
如果子查询返回如 (0,NULL,1) 这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN 。 
注意:对于 table2 空表的情况,下面的语句均返回 NULL: 
SELECT s1 FROM table1 WHERE s1 > (SELECT s2 FROM table2) 
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT MAX(s1) FROM table2) 


MySQL 行子查询:指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。 
例子: 
SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2) 
注:(1,2) 等同于 row(1,2) 
SELECT * FROM article WHERE (title,content,uid) = (SELECT title,content,uid FROM blog WHERE bid=2) 


MySQL 表子查询:指子查询返回的结果集是 N 行 N 列的一个表数据。 
例子: 
SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog) 




子查询优化: 
 很多查询中需要使用子查询。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死。子查询可以使查询语句很灵活,但子查询的执行效率不高。子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句再临时表中查询记录。查询完毕后,MySQL需要撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。在MySQL中可以使用连接查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快。 


使用连接(JOIN)来代替子查询 
如: 
例子1: 
SELECT * FROM t1 
WHERE t1.a1 NOT in (SELECT a2 FROM t2 )  
优化后: 
SELECT * FROM t1  
LEFT JOIN t2 ON t1.a1=t2.a2  
WHERE t2.a2 IS NULL   


例子2: 
SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog) 
优化后: 
SELECT * FROM article 
inner join blog  
on (article.title=blog.title AND article.content=blog.content AND article.uid=blog.uid) 




不能优化的子查询: 
1、mysql不支持子查询合并和聚合函数子查询优化,mariadb对聚合函数子查询进行物化优化; 
2、mysql不支持from子句子查询优化,mariadb对from子句子查询进行子查询上拉优化; 
3、mysql和mariadb对子查询展开提供有限的支持,如对主键的操作才能进行上拉子查询优化; 
 4、mysql不支持exists子查询优化,mariadb对exists关联子查询进行半连接优化,对exists非关联子查询没有进一步进行优化; 
5、mysql和mariadb不支持not exists子查询优化; 
 6、mysql和mariadb对in子查询,对满足半连接语义的查询进行半连接优化,再基于代价评估进行优化,两者对半连接的代价评估选择方式有差异; 
 7、mysql不支持not in子查询优化,mariadb对非关联not in子查询使用物化优化,对关联not in子查询不做优化; 
 8、mysql和mariadb对>all非关联子查询使用max函数,<all非关联子查询使用min函数,对=all和非关联子查询使用exists优化; 
 9、对>some和>any非关联子查询使用min函数,对<some和<any非关联子查询使用max函数,=any和=some子查询使用半连接进行优化,对>some和>any关联子查询以及<some和<any关联子查询只有exists优化。 

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 169
博文 564
码字总数 941209
作品 0
浦东
程序员
私信 提问
史上最简单的 MySQL 教程(三十一)「子查询(上)」

子查询 子查询:,查询是在某个查询结果之上进行的,一条语句内部包含了另外一条语句。 分类 子查询有两种分类方式,分别为:按按结果分类和位置分类。 按结果分类,即根据子查询得到的数据进...

qq_35246620
2017/08/26
0
0
MySQL学习笔记一

MySQL目录结构 配置my.ini MySQL5.7的my.ini位于ProgramDataMySQLMySQL Server 5.7目录下(可能有的版本的my.ini就在安装目录下),该该目录下还有一个data目录存放我们的创建的数据库。 打开...

Aaron_DMC
2016/12/16
40
0
10条SQL优化语句,让你的MySQL数据库跑得更快!

慢SQL消耗了70%~90%的数据库CPU资源; 1 不使用子查询 例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name=’hechunyang’); 子查询在MySQL5.5版本里,内部执行计划器是这样执行的...

kangjunfei
2017/12/14
0
0
MySQL 查询语句select讲解与练习

select语句执行流程: START————>FROM------>WHERE(选择,合适的行)--------->GROUP BY(分组)---------->HAVING(对分组进行过滤)————>ORDER BY(排序)————>SELECT(投影,合适的字......

大飞侠大虾
2017/11/10
0
0
explain用法(转)

explain用法 EXPLAIN tblname或:EXPLAIN [EXTENDED] SELECT selectoptions 前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,而今天要讲述的重点是后者。 举例 mysql>...

年少爱追梦
2016/08/09
21
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
8
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
8
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部