1. 程式人生 > 資料庫 >MySQL的SQL語句 - 資料操作語句(13)- 子查詢(11)

MySQL的SQL語句 - 資料操作語句(13)- 子查詢(11)

子查詢錯誤

有些錯誤只適用於子查詢。本節將介紹它們。

● 不支援的子查詢語法:

1. ERROR 1235 (ER_NOT_SUPPORTED_YET)
2. SQLSTATE = 42000
3. Message = "This version of MySQL doesn't yet support
4. 'LIMIT & IN/ALL/ANY/SOME subquery'"

這意味著 MySQL 不支援如下語句:

1. SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)

● 子查詢中的列數不正確:

1. ERROR 1241 (ER_OPERAND_COL)
2. SQLSTATE = 21000
3. Message = "Operand should contain 1 column(s)"

在以下情況下會發生此錯誤:

1. SELECT (SELECT column1, column2 FROM t2) FROM t1;

如果目的是行比較,則可以使用返回多個列的子查詢。在其他上下文中,子查詢必須是標量運算元。

● 子查詢的行數不正確:

1. ERROR 1241 (ER_OPERAND_COL)
2. SQLSTATE = 21000
3. Message = "Operand should contain 1 column(s)"

對於子查詢最多隻能返回一行但返回多行的語句,會出現此錯誤。考慮以下示例:

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

如果 SELECT column1 FROM t2 只返回一行,則上一個查詢可以工作。如果子查詢返回多行,則會出現錯誤 1242。在這種情況下,查詢應重寫為:

1. SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);

● 子查詢中的表使用錯誤:

1. Error 1093 (ER_UPDATE_TABLE_USED)
2. SQLSTATE = HY000
3. Message = "You can't specify target table 'x'
4. for update in FROM clause"

在以下情況下會發生此錯誤,即試圖修改表並從子查詢中對同一表中進行查詢:

1. UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);

可以使用公共表表達式或派生表來解決此問題。

在 MySQL 8.0.19 及更高版本中,當在子查詢中使用 TABLE 時,本節中描述的所有錯誤也適用。

對於事務性儲存引擎,子查詢的失敗會導致整個語句失敗。對於非事務儲存引擎,將保留在遇到錯誤之前所做的資料修改。

官方網址: