mysql修改的值子查询语句_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
但不支持以下查詢:
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() 可能會執行不同的次數,這取決于優化器選擇如何處理它。
對于基于語句或混合格式的復制,這種不確定性的一個含義是,這樣的查詢可能在源及其從屬庫上生成不同的結果。
總結
以上是生活随笔為你收集整理的mysql修改的值子查询语句_MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Oracle能用什么软件访问,使用工具访
- 下一篇: cas .net 重定向循环_接口测试平
