VALUES#
VALUES
VALUES — вычислить набор строк
Синтаксис
VALUES (expression
[, ...] ) [, ...] [ ORDER BYsort_expression
[ ASC | DESC | USINGoperator
] [, ...] ] [ LIMIT {count
| ALL } ] [ OFFSETstart
[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [count
] { ROW | ROWS } ONLY ]
Описание
VALUES
вычисляет строковое значение или набор строковых значений, указанных в выражениях значений. Он чаще всего используется для создания “константной таблицы” внутри более крупной команды, но может использоваться и самостоятельно.
Когда указывается более одной строки, все строки должны иметь одинаковое количество элементов. Типы данных столбцов результирующей таблицы определяются путем объединения явных или неявных типов выражений, появляющихся в этом столбце, с использованием тех же правил, что и для UNION
(см. Раздел 10.5).
В рамках более крупных команд, VALUES
синтаксически допускается
в любом месте, где допускается SELECT
. Поскольку он обрабатывается как
SELECT
с точки зрения грамматики, возможно использование
ORDER BY
, LIMIT
(или
эквивалентно FETCH FIRST
),
и OFFSET
секции с
командой VALUES
.
Параметры
expression
Константа или выражение для вычисления и вставки в указанное место в результирующей таблице (наборе строк). В списке
VALUES
, появляющемся на верхнем уровнеINSERT
,expression
может быть заменено наDEFAULT
, чтобы указать, что должно быть вставлено значение по умолчанию для столбца назначения.DEFAULT
не может использоваться, когдаVALUES
появляется в других контекстах.sort_expression
Выражение или целочисленная константа, указывающая, как сортировать строки результата. Это выражение может ссылаться на столбцы результата
VALUES
какcolumn1
,column2
и т.д. Дополнительные сведения см. в разделе ORDER BY Clause документации по SELECT.operator
Оператор сортировки. Подробности см. в документации по ORDER BY Clause в разделе SELECT.
count
Максимальное количество строк для возврата. Подробности см. в документации по LIMIT Clause в разделе SELECT.
start
Количество строк, которые нужно пропустить перед началом возврата строк. Подробности см. в разделе LIMIT Clause документации по SELECT.
Примечания
Следует избегать списков 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
указывало имена для всех столбцов,
но это хорошая практика. (Имена столбцов по умолчанию для VALUES
в Tantor BE - 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
являются
расширениями Tantor BE; см. также
раздел SELECT.