以太坊开奖(326681.com)_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)
发表时间:2021-12-27 浏览量:81
MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)
子查询的限制
● 通常,不能在子查询中修改表并从同一表中举行选择。例如,此限制适用于以下形式的语法:
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
但不支持以下查询:
,,www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。
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
0
珍藏