ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)

2020-12-04 11:51:39  阅读:276  来源: 互联网

标签:语句 ... 13 expr 查询 subquery MySQL SELECT


子查询的限制

● 通常,不能在子查询中修改表并从同一表中进行选择。例如,此限制适用于以下形式的语法:

1. DELETE FROM t WHERE ... (SELECT ... FROM t ...);
2. UPDATE t ... WHERE col = (SELECT ... FROM t ...);
3. {INSERT|REPLACE} INTO t (SELECT ... FROM t ...);

例外情况:如果使用的是派生表,并且派生表是物化的,而不是合并到外部查询中,则上述禁止不适用。例子:

1. UPDATE t ... WHERE col = (SELECT * FROM (SELECT ...  FROM t...) AS dt ...);

在这里,来自派生表的结果被物化为临时表,因此在对 t 进行更新时,t 中的相关行已经被选中。

通常,可以通过添加 NO_MERGE 优化器提示来影响优化器物化派生表。

● 仅部分支持行比较操作:

■ 对于 expr [NOT] IN subquery,expr 可以是 n 元组(使用行构造函数语法指定),子查询可以返回 n 元组的行。因此,允许的语法更明确地表示为 row_constructor [NOT] IN table_subquery

■ 对于 expr op {ALL|ANY|SOME} subquery,expr 必须是标量值,子查询必须是列子查询;它不能返回多个列行。

换句话说,对于返回多行 n 元组的子查询,支持以下操作:

1. (expr_1, ..., expr_n) [NOT] IN table_subquery

但不支持以下查询:

1. (expr_1, ..., expr_n) op {ALL|ANY|SOME} subquery

支持 IN 的行比较而不支持其他形式行比较的原因是,IN 是通过将其重写为一序列 = 比较和 AND 操作来实现的。这种方法不适用于 ALL、ANY 或 SOME。

● 在 MySQL 8.0.14 之前,FROM 子句中的子查询不能是关联子查询。在查询执行期间,它们被整体物化(计算以生成结果集),因此不能按外部查询的每行计算它们。优化器延迟物化直到需要结果,这可能允许避免物化。

● 对于某些子查询运算符,MySQL 在 子查询 中不支持使用 LIMIT:

1. mysql> SELECT * FROM t1
2.        WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1);
3. ERROR 1235 (42000): This version of MySQL doesn't yet support
4.  'LIMIT & IN/ALL/ANY/SOME subquery'

● MySQL 允许子查询引用存储函数,该函数具有修改数据的副作用,例如向表中插入行。例如,如果 f() 插入行,则以下查询可以修改数据:

1. SELECT ... WHERE x IN (SELECT f() ...);

此行为是 SQL 标准的扩展。在 MySQL 中,它可以产生不确定的结果,因为对于给定查询的不同的执行,f() 可能会执行不同的次数,这取决于优化器选择如何处理它。

对于基于语句或混合格式的复制,这种不确定性的一个含义是,这样的查询可能在源及其从属库上生成不同的结果。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/subquery-restrictions.html

标签:语句,...,13,expr,查询,subquery,MySQL,SELECT
来源: https://blog.51cto.com/15023289/2559595

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有