Spec-Zone.ru › MySQL 8.4

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). Каждая ROW() в одном и том же операторе VALUES должна иметь одинаковое количество значений в списке значений.

Ключевое слово 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)
Важно

VALUES с одним или несколькими примерами ROW() выступает как конструктор значений таблицы; хотя его можно использовать для предоставления значений в операторе 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”.

    Можно использовать EXCEPT и INTERSECT с VALUES аналогичным образом, как и UNION, как показано здесь:

    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. Более подробную информацию и примеры см. в описаниях этих операторов.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/values.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API