文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  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 關鍵字混淆。您也不應將其與在 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 一樣,使用 EXCEPTINTERSECTVALUES 結合使用,如下所示

    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 子句」

  • INSERTREPLACE 陳述式中,取代 VALUES(),在這種情況下,其語義與此處描述的略有不同。有關詳細資訊,請參閱 第 15.2.7 節,「INSERT 陳述式」

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