Home  >  Article  >  Database  >  MYSQL子查询的五种形式

MYSQL子查询的五种形式

WBOY
WBOYOriginal
2016-06-07 15:21:081499browse

mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当的麻烦。mysql子查询的几种常见写法: select * from xxx where col=[ any | all ]( select * from xxxx); 该句法可分为加关键词和不加关键词的写法,当

mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当的麻烦。mysql子查询的几种常见写法:

<ol><li><span><span>select</span><span> * </span><span>from</span><span> xxx </span><span>where</span><span> col = [</span><span>any</span><span>|</span><span>all</span><span>](</span><span>select</span><span> * </span><span>from</span><span> xxxx); </span></span></li></ol>

该句法可分为加关键词和不加关键词的写法,当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个),查询语句将以子查询语句的结果作为自己 where子句的条件进行查询,该句法可以在子查询语句前加入any、all、some等关键字,此时子查询语句返回的是一组离散值。any则表示,查询语句是以子查询返回的值作为一个范围,在此值范围内进行查询,其与in关键字相像;all关键不太好了解,表示起全部匹配啥的。

<ol><li><span><span>select</span><span> * </span><span>from</span><span> xxx </span><span>where</span><span> col </span><span>in</span><span> (</span><span>select</span><span> * </span><span>from</span><span> xxxx); </span></span></li></ol>

该 句法相当的明了,就是查询语句的where子句是以子查询语句的结果作为其范围的,与上一种语法的any相似。

<ol><li><span><span>select</span><span> row(value1,value2.....) = [</span><span>any</span><span>](selectcol1,col2..); </span></span></li></ol>

该语句的执行实质是:子查询语句的执行所得的结果与查询的结果集匹配,若能找到匹配的返回真,否则返回假,并且两边的结果集都是一组离散值。

<ol><li><span><span>select</span><span>  .... </span><span>where</span><span> col = [</span><span>not</span><span>] exists (</span><span>select</span><span>......); </span></span></li></ol>

该语句比较蹩脚,其执行是这样的:当子查询进行操作,有返回结果的时候,该语句才会执行,而且有多少个结果,语句就执行几次。

<ol><li><span><span>select</span><span> .... </span><span>from</span><span> (</span><span>select</span><span> .....) </span><span>as</span><span> </span><span>name</span><span> </span><span>where</span><span> ...... </span></span></li></ol>

该句法,在平时用的比较少,而且并不好理解。其实是这么一回事,通过子查询执行的结果来构造一张新的表(这个表是一张衍生数据表,是一张虚拟的表),其用来作为主句的查询的对象,该句法功能非常强大,在一些复杂的查询中会经常用到。

子查询虽然挺方便,但其有不少缺点,其不支持limit,而且经实验证明其执行效率相当不理想,在一般的情况下,还是不推荐使用子查询。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn