VALUES 語句html
VALUES 是 MySQL 8.0.19 中引入的一個 DML 語句,它以表的形式返回一個或多個行的集合。換句話說,它是一個表值構造器,也能夠做爲獨立的 SQL 語句來運行。mysql
1. VALUES row_constructor_list [ORDER BY column_designator] [LIMIT BY number] 2. 3. row_constructor_list: 4. ROW(value_list)[, ROW(value_list)][, ...] 5. 6. value_list: 7. value[, value][, ...] 8. 9. column_designator: 10. column_index
VALUES 語句由 VALUES 關鍵字後跟一個或多個行構造器的列表組成,用逗號分隔。行構造器由 ROW() 子句以及包含在括號中的一個或多個標量值的值列表組成。其中的值能夠是 MySQL 任意類型的字面量,或者是能夠解析爲標量值的表達式。sql
ROW() 不能爲空(但提供的每一個標量值均可覺得 NULL)。同一 VALUES 語句中的每一個 ROW() 在其值列表中的值數量必須相同。ide
VALUES 不支持 DEFAULT 關鍵字,會引起語法錯誤,除非在 INSERT 語句中使用該關鍵字提供值。函數
VALUES 的輸出是一個表:code
1. mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8); 2. +----------+----------+----------+ 3. | column_0 | column_1 | column_2 | 4. +----------+----------+----------+ 5. | 1 | -2 | 3 | 6. | 5 | 7 | 9 | 7. | 4 | 6 | 8 | 8. +----------+----------+----------+ 9. 3 rows in set (0.00 sec)
從 VALUES 輸出的表的列具備隱式命名 column_0、column_一、column_2,依此類推,始終以 0 開頭。此事實可用於使用可選的 ORDER BY 子句按列對行排序,方法與此子句與 SELECT 語句一塊兒使用的方式相同,以下所示:htm
1. mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY column_1; 2. +----------+----------+----------+ 3. | column_0 | column_1 | column_2 | 4. +----------+----------+----------+ 5. | 1 | -2 | 3 | 6. | 4 | 6 | 8 | 7. | 5 | 7 | 9 | 8. +----------+----------+----------+ 9. 3 rows in set (0.00 sec)
VALUES 語句還支持限制輸出行數的 LIMIT 子句。排序
VALUES 語句對於列值的數據類型是寬容的;能夠在同一列中混合類型,以下所示:get
1. mysql> VALUES ROW("q", 42, '2019-12-18'), 2. -> ROW(23, "abc", 98.6), 3. -> ROW(27.0002, "Mary Smith", '{"a": 10, "b": 25}'); 4. +----------+------------+--------------------+ 5. | column_0 | column_1 | column_2 | 6. +----------+------------+--------------------+ 7. | q | 42 | 2019-12-18 | 8. | 23 | abc | 98.6 | 9. | 27.0002 | Mary Smith | {"a": 10, "b": 25} | 10. +----------+------------+--------------------+ 11. 3 rows in set (0.00 sec)
重要it
具備一個或多個 ROW() 實例的 VALUES 充當表值構造器;儘管它能夠用於在 INSERT 或 REPLACE 語句中提供值,但不要將其與一樣用於此目的的 VALUES 關鍵字混淆。也不該該將它與在 INSERT ... ON DUPLICATE KEY UPDATE 中引用列值的 VALUES() 函數混淆。
還應該記住 ROW() 是一個行值構造器,而 VALUES ROW() 是一個表值構造器;二者不能互換使用。
VALUES 可用於許多可使用 SELECT 的狀況,包括下面列出的:
● 使用 UNION,以下所示:
1. mysql> SELECT 1,2 UNION SELECT 10,15; 2. +----+----+ 3. | 1 | 2 | 4. +----+----+ 5. | 1 | 2 | 6. | 10 | 15 | 7. +----+----+ 8. 2 rows in set (0.00 sec) 9. 10. mysql> VALUES ROW(1,2) UNION VALUES ROW(10,15); 11. +----------+----------+ 12. | column_0 | column_1 | 13. +----------+----------+ 14. | 1 | 2 | 15. | 10 | 15 | 16. +----------+----------+ 17. 2 rows in set (0.00 sec)
也能夠用這種方式將具備多行的構造表聯合在一塊兒,以下所示:
1. mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6) 2. > UNION VALUES ROW(10,15),ROW(20,25); 3. +----------+----------+ 4. | column_0 | column_1 | 5. +----------+----------+ 6. | 1 | 2 | 7. | 3 | 4 | 8. | 5 | 6 | 9. | 10 | 15 | 10. | 20 | 25 | 11. +----------+----------+ 12. 5 rows in set (0.00 sec)
在這種狀況下,也能夠(一般最好)徹底省略 UNION,並使用單個 VALUES 語句,以下所示:
1. mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6), ROW(10,15), ROW(20,25); 2. +----------+----------+ 3. | column_0 | column_1 | 4. +----------+----------+ 5. | 1 | 2 | 6. | 3 | 4 | 7. | 5 | 6 | 8. | 10 | 15 | 9. | 20 | 25 | 10. +----------+----------+
VALUES 也能夠與 SELECT、TABLE 語句聯合使用。
UNION 構造的表必須包含相同數量的列,就像使用 SELECT 同樣。
● 在鏈接語句中使用。
● 代替 INSERT 或 REPLACE 語句中的 VALUES(),在這種狀況下,它的語義與這裏描述的略有不一樣。
● 在 CREATE TABLE ... SELECT 和 CREATE VIEW ... SELECT 中替換源表