mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)
子查詢的限制
● 通常,不能在子查詢中修改表并從同一表中進(jìn)行選擇。例如,此限制適用于以下形式的語(yǔ)法:
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 ...);
在這里,來(lái)自派生表的結(jié)果被物化為臨時(shí)表,因此在對(duì) t 進(jìn)行更新時(shí),t 中的相關(guān)行已經(jīng)被選中。
通常,可以通過(guò)添加 NO_MERGE 優(yōu)化器提示來(lái)影響優(yōu)化器物化派生表。
● 僅部分支持行比較操作:
■ 對(duì)于 expr [NOT] IN subquery,expr 可以是 n 元組(使用行構(gòu)造函數(shù)語(yǔ)法指定),子查詢可以返回 n 元組的行。因此,允許的語(yǔ)法更明確地表示為 row_constructor [NOT] IN table_subquery
■ 對(duì)于 expr op {ALL|ANY|SOME} subquery,expr 必須是標(biāo)量值,子查詢必須是列子查詢;它不能返回多個(gè)列行。
換句話說(shuō),對(duì)于返回多行 n 元組的子查詢,支持以下操作:
1. (expr_1, ..., expr_n) [NOT] IN table_subquery
但不支持以下查詢:
1. (expr_1, ..., expr_n) op {ALL|ANY|SOME} subquery
支持 IN 的行比較而不支持其他形式行比較的原因是,IN 是通過(guò)將其重寫(xiě)為一序列 = 比較和 AND 操作來(lái)實(shí)現(xiàn)的。這種方法不適用于 ALL、ANY 或 SOME。
● 在 MySQL 8.0.14 之前,FROM 子句中的子查詢不能是關(guān)聯(lián)子查詢。在查詢執(zhí)行期間,它們被整體物化(計(jì)算以生成結(jié)果集),因此不能按外部查詢的每行計(jì)算它們。優(yōu)化器延遲物化直到需要結(jié)果,這可能允許避免物化。
● 對(duì)于某些子查詢運(yùn)算符,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 允許子查詢引用存儲(chǔ)函數(shù),該函數(shù)具有修改數(shù)據(jù)的副作用,例如向表中插入行。例如,如果 f() 插入行,則以下查詢可以修改數(shù)據(jù):
1. SELECT ... WHERE x IN (SELECT f() ...);
此行為是 SQL 標(biāo)準(zhǔn)的擴(kuò)展。在 MySQL 中,它可以產(chǎn)生不確定的結(jié)果,因?yàn)閷?duì)于給定查詢的不同的執(zhí)行,f() 可能會(huì)執(zhí)行不同的次數(shù),這取決于優(yōu)化器選擇如何處理它。
對(duì)于基于語(yǔ)句或混合格式的復(fù)制,這種不確定性的一個(gè)含義是,這樣的查詢可能在源及其從屬庫(kù)上生成不同的結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle能用什么软件访问,使用工具访
- 下一篇: linux cmake编译源码,linu