VALUES
是一個 DML 陳述式,它會將一組或多組列以表格形式傳回。換句話說,它是一個表格值建構子,同時也作為一個獨立的 SQL 陳述式運作。
VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number]
row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]
value_list:
value[, value][, ...]
column_designator:
column_index
VALUES
陳述式由 VALUES
關鍵字後接一個或多個以逗號分隔的列建構子清單組成。列建構子由 ROW()
列建構子子句,以及括號中包含一個或多個純量值的值清單組成。值可以是任何 MySQL 資料類型的文字,或是解析為純量值的表示式。
ROW()
不得為空 (但所提供的每個純量值都可以是 NULL
)。同一個 VALUES
陳述式中的每個 ROW()
,其值清單中的值數量必須相同。
DEFAULT
關鍵字不受 VALUES
支援,會造成語法錯誤,除非它用於 INSERT
陳述式中提供值時。
VALUES
的輸出是一個表格。
mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8);
+----------+----------+----------+
| column_0 | column_1 | column_2 |
+----------+----------+----------+
| 1 | -2 | 3 |
| 5 | 7 | 9 |
| 4 | 6 | 8 |
+----------+----------+----------+
3 rows in set (0.00 sec)
從 VALUES
輸出的表格的欄位會具有隱含命名的欄位 column_0
、column_1
、column_2
等等,且始終從 0
開始。這個事實可用於使用選用的 ORDER BY
子句依欄位排序,其作用方式與 SELECT
陳述式相同,如下所示。
mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY column_1;
+----------+----------+----------+
| column_0 | column_1 | column_2 |
+----------+----------+----------+
| 1 | -2 | 3 |
| 4 | 6 | 8 |
| 5 | 7 | 9 |
+----------+----------+----------+
3 rows in set (0.00 sec)
VALUES
陳述式也支援 LIMIT
子句,用於限制輸出中的列數。
VALUES
陳述式對欄位值的資料類型具有寬容性;您可以在同一欄位中混合類型,如下所示。
mysql> VALUES ROW("q", 42, '2019-12-18'),
-> ROW(23, "abc", 98.6),
-> ROW(27.0002, "Mary Smith", '{"a": 10, "b": 25}');
+----------+------------+--------------------+
| column_0 | column_1 | column_2 |
+----------+------------+--------------------+
| q | 42 | 2019-12-18 |
| 23 | abc | 98.6 |
| 27.0002 | Mary Smith | {"a": 10, "b": 25} |
+----------+------------+--------------------+
3 rows in set (0.00 sec)
具有一個或多個 ROW()
實例的 VALUES
會作為表格值建構子;雖然它可用於 INSERT
或 REPLACE
陳述式中提供值,但請勿將它與也用於此目的的 VALUES
關鍵字混淆。您也不應將它與 VALUES()
函數混淆,該函數指的是 INSERT ... ON DUPLICATE KEY UPDATE
中的欄位值。
您還應記住,ROW()
是列值建構子 (請參閱 第 15.2.15.5 節:「列子查詢」),而 VALUES ROW()
是表格值建構子;兩者不可互換使用。
在許多情況下,您可以使用 VALUES
,在這些情況下,您可以使用 SELECT
,包括這裡列出的情況。
搭配
UNION
,如下所示。mysql> SELECT 1,2 UNION SELECT 10,15; +----+----+ | 1 | 2 | +----+----+ | 1 | 2 | | 10 | 15 | +----+----+ 2 rows in set (0.00 sec) mysql> VALUES ROW(1,2) UNION VALUES ROW(10,15); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | | 10 | 15 | +----------+----------+ 2 rows in set (0.00 sec)
您可以像這樣將具有多列的建構表格聯集在一起。
mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6) > UNION VALUES ROW(10,15),ROW(20,25); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | | 3 | 4 | | 5 | 6 | | 10 | 15 | | 20 | 25 | +----------+----------+ 5 rows in set (0.00 sec)
您也可以 (通常建議) 在這種情況下完全省略
UNION
,並使用單個VALUES
陳述式,如下所示。mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6), ROW(10,15), ROW(20,25); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | | 3 | 4 | | 5 | 6 | | 10 | 15 | | 20 | 25 | +----------+----------+
VALUES
也可用於與SELECT
陳述式、TABLE
陳述式或兩者都有的聯集中。UNION
中的建構表格必須包含相同數量的欄位,就像您使用SELECT
一樣。如需更多範例,請參閱 第 15.2.18 節:「UNION 子句」。您可以像
UNION
一樣,以非常相似的方式搭配VALUES
使用EXCEPT
和INTERSECT
,如下所示。mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6) -> INTERSECT -> VALUES ROW(10,15), ROW(20,25), ROW(3,4); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 3 | 4 | +----------+----------+ 1 row in set (0.00 sec) mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6) -> EXCEPT -> VALUES ROW(10,15), ROW(20,25), ROW(3,4); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | | 5 | 6 | +----------+----------+ 2 rows in set (0.00 sec)
如需更多資訊,請參閱 第 15.2.4 節:「EXCEPT 子句」和 第 15.2.8 節:「INTERSECT 子句」。
在聯集中。如需更多資訊和範例,請參閱 第 15.2.13.2 節:「JOIN 子句」。
取代
VALUES()
在INSERT
或REPLACE
陳述式中,在這種情況下,其語義與此處描述的略有不同。如需詳細資訊,請參閱 第 15.2.7 節:「INSERT 陳述式」。取代
CREATE TABLE ... SELECT
和CREATE VIEW ... SELECT
中的來源表格。如需更多資訊和範例,請參閱這些陳述式的描述。