1. 程式人生 > 資料庫 >MySQL的SQL語句 - 資料操作語句(16)- VALUES 語句

MySQL的SQL語句 - 資料操作語句(16)- VALUES 語句

VALUES 語句

VALUES 是 MySQL 8.0.19 中引入的一個 DML 語句,它以表的形式返回一個或多個行的集合。換句話說,它是一個表值構造器,也可以作為獨立的 SQL 語句來執行。

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 任意型別的字面量,或者是可以解析為標量值的表示式。

ROW() 不能為空(但提供的每個標量值都可以為 NULL)。同一 VALUES 語句中的每個 ROW() 在其值列表中的值數量必須相同。

VALUES 不支援 DEFAULT 關鍵字,會引發語法錯誤,除非在 INSERT 語句中使用該關鍵字提供值。

VALUES 的輸出是一個表:

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_1、column_2,依此類推,始終以 0 開頭。此事實可用於使用可選的 ORDER BY 子句按列對行排序,方法與此子句與 SELECT 語句一起使用的方式相同,如下所示:

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 語句對於列值的資料型別是寬容的;可以在同一列中混合型別,如下所示:

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)

重要

具有一個或多個 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 中替換源表

官方網址: