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
關鍵字混淆。您也不應將其與在 INSERT ... ON DUPLICATE KEY UPDATE
中參照欄位值的 VALUES()
函數混淆。
您也應該記住 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
一樣,使用EXCEPT
和INTERSECT
與VALUES
結合使用,如下所示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 子句」。
在
INSERT
或REPLACE
陳述式中,取代VALUES()
,在這種情況下,其語義與此處描述的略有不同。有關詳細資訊,請參閱 第 15.2.7 節,「INSERT 陳述式」。在
CREATE TABLE ... SELECT
和CREATE VIEW ... SELECT
中,取代來源表格。有關更多資訊和範例,請參閱這些陳述式的說明。