VALUES
Эта страница переведена при помощи нейросети GigaChat.
VALUES
- вычисление набора строк.
Синтаксис
VALUES ( expression [, ...] ) [, ...]
[ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
Описание
VALUES
вычисляет строку значений или набор строковых значений, указанных выражениями значений. Чаще всего он используется для генерации «таблицы констант» внутри более крупной команды, но может использоваться и самостоятельно.
Когда указано более одной строки, все строки должны содержать одинаковое количество элементов. Типы данных столбцов результирующей таблицы определяются путем объединения явных или выведенных типов выражений, появляющихся в этом столбце, с использованием тех же правил, что и для UNION
.
В более крупных командах VALUES
синтаксически разрешен везде, где разрешено SELECT
. Поскольку он обрабатывается грамматикой как SELECT
, возможно использовать предложения ORDER BY
, LIMIT
(или эквивалентно FETCH FIRST
), и OFFSET
с командой VALUES
.
Параметры
expression
- Константа или выражение для вычисления и вставки в указанное место в результирующей таблице (наборе строк). В списке
VALUES
, который появляется на верхнем уровне командыINSERT
, элементexpression
может быть заменен наDEFAULT
, чтобы указать, что должно быть вставлено значение по умолчанию столбца назначения.DEFAULT
не может использоваться при появленииVALUES
в других контекстах.
sort_expression
- Выражение или целая константа, указывающая, как сортировать строки результата. Это выражение может ссылаться на столбцы результата как
VALUES
,column1
,column2
и т.д. Для получения дополнительной информации см. раздел ПОЛОЖЕНИЕ О ПОРЯДКЕ СОРТИРОВКИ в документации по ВЫБОРУ.
operator
- Оператор сортировки. Подробности см. в разделе Пункт ORDER BY в документации по ВЫБРАТЬ.
count
- Максимальное количество строк для возврата. Подробности см. в разделе Пункт LIMIT в документации по ВЫБРАТЬ.
start
- Количество строк, которые следует пропустить перед началом возврата строк. Для получения подробной информации см. раздел Ограничение LIMIT в документации по ВЫБОРУ.
Примечания
Cписки с очень большим количеством строк следует избегать, так как можно столкнуться с отказами из-за нехватки памяти или плохой производительностью. 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
как подзапроса в предложении 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;
Использование VALUES
в UPDATE
с JOIN
:
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;
Обратите внимание, предложение AS
обязательно при использовании VALUES
в FROM
, как и при использовании SELECT
. Не обязательно указывать имена всех столбцов в AS
, но это считается хорошей практикой. В PostgreSQL имена столбцов по умолчанию — 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
лучше использовать форму списка скалярных значений, а не подзапрос VALUES
, как показано выше. Такая форма требует меньше написания и зачастую более эффективна.
Совместимость
VALUES
соответствует стандарту SQL. LIMIT
и OFFSET
являются расширениями PostgreSQL. Смотрите также SELECT.