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.