VALUES
VALUES — вычислить набор строк
Синтаксис
VALUES (выражение
[, ...] ) [, ...] [ ORDER BYвыражение_сортировки
[ ASC | DESC | USINGоператор
] [, ...] ] [ LIMIT {число
| ALL } ] [ OFFSETначало
[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [число
] { ROW | ROWS } ONLY ]
Описание
VALUES
вычисляет значение строки или множество значений строк, заданное выражениями. Чаще всего эта команда используется для формирования «таблицы констант» в большой команде, но её можно использовать и отдельно.
Когда указывается больше, чем одна строка, все строки должны иметь одинаковое количество элементов. Типы данных результирующих столбцов таблицы определяются в результате совмещения явных и неявных типов выражений, заданных для этих столбцов, по тем же правилам, что и в UNION
(см. Раздел 10.5).
В составе других команд синтаксис допускает использование VALUES
везде, где допускается SELECT
. Так как грамматически она воспринимается как SELECT
, с командой VALUES
можно использовать предложения ORDER BY
, LIMIT
(или равнозначное FETCH FIRST
) и OFFSET
.
Параметры
выражение
Константа или выражение, которое вычисляется и вставляется в указанное место результирующей таблицы (множества строк). В списке
VALUES
, находящемся на верхнем уровне оператораINSERT
,выражение
может быть заменено словомDEFAULT
, указывающим, что в целевой столбец должно быть вставлено значение этого столбца по умолчанию. КогдаVALUES
употребляется в других контекстах, указаниеDEFAULT
использовать нельзя.выражение_сортировки
Выражение или целочисленная константа, указывающая, как должны сортироваться строки результата. Это выражение может обращаться к столбцам результата
VALUES
по именамcolumn1
,column2
и т. д. За дополнительными подробностями обратитесь к ПредложениеORDER BY
.оператор
Оператор сортировки. За подробностями обратитесь к Предложение
ORDER BY
.число
Максимальное число строк, которое должно быть возвращено. За подробностями обратитесь к Предложение
LIMIT
.начало
Число строк, которые должны быть пропущены, прежде чем начнётся выдача строк. За подробностями обратитесь к Предложение
LIMIT
.
Примечания
Следует избегать составления списков VALUES
с очень большим количеством строк, так как при этом можно столкнуться с нехваткой памяти или снижением производительности. Применение VALUES
в команде INSERT
— особый случай (так как ожидаемые типы столбцов становятся известны из целевой таблицы команды INSERT
и их не надо вычислять, сканируя весь список VALUES
), так что в этом контексте можно работать с гораздо более объёмными списками, чем в других.
Примеры
Простейшая команда VALUES
:
VALUES (1, 'one'), (2, 'two'), (3, 'three');
Эта команда выдаст таблицу из двух столбцов и трёх строк. По сути она равнозначна запросу:
SELECT 1 AS column1, 'one' AS column2 UNION ALL SELECT 2, 'two' UNION ALL SELECT 3, 'three';
Более типично использование VALUES
в составе большей команды SQL. Чаще всего она применяется в INSERT
:
INSERT INTO films (code, title, did, date_prod, kind) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
В контексте INSERT
список VALUES
может содержать слово DEFAULT
, указывающее, что в данном месте вместо некоторого значения должно использоваться значение столбца по умолчанию:
INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'), ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES
также может применяться там, где можно написать вложенный SELECT
, например в предложении FROM
:
SELECT f.* FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind) WHERE f.studio = t.studio AND f.kind = t.kind; UPDATE employees SET salary = salary * v.increase FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase) WHERE employees.depno = v.depno AND employees.sales >= v.target;
Заметьте, что когда VALUES
используется в предложении FROM
, предложение AS
становится обязательным, так же, как и для SELECT
. При этом не требуется указывать в AS
имена всех столбцов, но это рекомендуется делать. (По умолчанию PostgreSQL даёт столбцам VALUES
имена column1
, column2
и т. д., но в других СУБД имена могут быть другими.)
Когда VALUES
используется в команде INSERT
, значения автоматически приводятся к типу данных соответствующего целевого столбца. Когда оно используется в других контекстах, может потребоваться указать нужный тип данных. Если все записи представлены строковыми константами в кавычках, достаточно привести к нужному типу значения в первой строке, чтобы задать тип для всех:
SELECT * FROM machines WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));
Подсказка
Для простых проверок на включение IN
лучше полагаться на форму IN
со списком скаляров, чем записывать запрос VALUES
, как показано выше. Список скаляров проще записать и обрабатывается он зачастую более эффективно.
Совместимость
VALUES
соответствует стандарту SQL. Указания LIMIT
и OFFSET
являются расширениями PostgreSQL; см. также SELECT.