首页 > 数据库技术 > 详细

MySQL 子查询

时间:2019-06-02 15:25:17      阅读:97      评论:0      收藏:0      [点我收藏+]

  源自MySQL 5.7 官方手册 13.2.10 Subquery Syntax

〇、MySQL子查询介绍

  子查询指的是嵌套在某个语句中的SELECT语句。

  MySQL支持标准SQL所要求的所有子查询形式和操作,此外还进行了一些扩展。

  下面就是一个有子查询的示例:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

  在此示例中,SELECT * FROM t1 ...是外部查询(或外部语句),而(SELECT column1 FROM t2)是子查询。子查询嵌套在外部查询中,实际上可以将子查询嵌套在其他子查询中,达到相当深的程度。子查询必须始终出现在括号内。

 

  子查询的优点:

  • 允许结构化的查询,以便可以隔离语句的每个部分;
  •  可以替代复杂的连接和联合;
  • 相比连接和联合,有更高的可读性。实际上,正是子查询这个创新给了人们灵感把SQL叫做结构化查询语言。

  

  子查询的语法要点

  下面是一个示例语句,显示了SQL标准指定的并在MySQL中支持的子查询语法的要点:

DELETE FROM t1
WHERE s11 > ANY
 (SELECT COUNT(*) /* no hint */ FROM t2
  WHERE NOT EXISTS
   (SELECT * FROM t3
    WHERE ROW(5*t2.s1,77)=
     (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
      (SELECT * FROM t5) AS t5)));

  一个子查询可以返回一个标量(单个值),单个行,单个列或一个表(一个或多个列的一行或多行)。他们分别叫做标量子查询、列子查询、行子查询以及表子查询。

  返回特定类型结果的子查询通常只能在某些上下文中使用,接下来的章节会阐述。

 

  子查询可以应用在大部分语句中,MySQL对此限制很少。

  子查询可以包含很多普通SELECT语句中的关键字:DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, index hints, UNION constructs, comments, functions等。

  一个子查询的外接语句可以为:SELECT, INSERT, UPDATE, DELETE, SET, or DO。

  但是在MySQL中,不能在修改一个表的同时在子查询中对同一个表进行SELECT操作。这适用于DELETE,INSERT,REPLACE,UPDATE等语句,还有LOAD DATA((因为子查询可以在SET子句中使用))。

 

  关于优化器怎么处理子查询的知识,see Section 8.2.2,“Optimizing Subqueries, Derived Tables, and View References”。

  有关子查询使用限制的讨论,包括某些形式的子查询语法的性能问题,see Section C.4, “Restrictions on Subqueries”。

 

一、将子查询作为标量操作数

  在此查询最简单的形式中,子查询是一个返回单个值的标量子查询(a scalar subquery)标量子查询是一个简单的操作数,您几乎可以在将它使用在任何单个列值或文字合法的地方。你可以期望它具有一般操作数都拥有的特征:数据类型,长度,可以为NULL的指示,等等。

  示例:

CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
INSERT INTO t1 VALUES(100, abcde);
SELECT (SELECT s2 FROM t1);

  这个查询中的子查询返回单个值——“abcde”,数据类型为CHAR,长度为5,字符集和排序规则等于CREATE TABLE时生效的默认值,以及一个关于该列值可以为NULL的提示。

  如果子查询的结果为空集,那么单值子查询所取回的值的NULL性并不会直接被复制,因为此时子查询的结果就为NULL。如上面的子查询,如果t1为空表,那么子查询的结果将为NULL,即使S2含有NOT NULL约束。

  

  很少有一个标量子查询不能被使用的情况。如果一个语句只允许一个字面量值,那此时你无法使用一个子查询。例如,LIMIT要求有字面量招整数类型的参数,LOAD DATA要求一个代表文件路径的字面量的字符串值。此时你就不能使用子查询来提供这些值。

  当你在接下来章节的示例中看到相当简洁的子查询时,可以联想下在自己的代码中的子查询使用更加多样化和复杂的构造。

 

  假设现在有两个表:

CREATE TABLE t1 (s1 INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (s1 INT);
INSERT INTO t2 VALUES (2);

 

MySQL 子查询

原文:https://www.cnblogs.com/bigbigbigo/p/10962833.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!