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.