Перейти к основному содержимому

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.

Смотрите также

INSERT, SELECT