文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  VALUES 陳述式

15.2.19 VALUES 陳述式

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_0column_1column_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 會作為表格值建構子;雖然它可用於 INSERTREPLACE 陳述式中提供值,但請勿將它與也用於此目的的 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 使用 EXCEPTINTERSECT,如下所示。

    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()INSERTREPLACE 陳述式中,在這種情況下,其語義與此處描述的略有不同。如需詳細資訊,請參閱 第 15.2.7 節:「INSERT 陳述式」

  • 取代 CREATE TABLE ... SELECTCREATE VIEW ... SELECT 中的來源表格。如需更多資訊和範例,請參閱這些陳述式的描述。