VALUES
VALUES — вычислить набор строк
Синтаксис
VALUES ( выражение [, ...] ) [, ...]
[ ORDER BY выражение_сортировки [ ASC | DESC | USING оператор ] [, ...] ]
[ LIMIT { число | ALL } ]
[ OFFSET начало [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ число ] { ROW | ROWS } ONLY ]
Описание
Команда VALUES
вычисляет значение строки или набор значений строк, заданных
выражениями значений. Чаще всего она используется для формирования «таблицы
констант» в рамках более крупной команды, но может быть использована и самостоятельно.
Если указано более одной строки, то все строки должны иметь одинаковое количество элементов. Типы данных результирующих столбцов таблицы определяются путем объединения явных и неявных типов выражений, находящихся в этом столбце, с использованием тех же правил, что и для UNION (см. раздел UNION, CASE и связанные конструкции).
В составе более крупных команд синтаксис допускает использование VALUES
везде,
где разрешена SELECT
. Так как грамматически она воспринимается как SELECT
,
с командой VALUES
можно использовать предложения ORDER BY, LIMIT
(или равнозначное FETCH FIRST) и OFFSET.
Параметры
выражение
Константа или выражение, подлежащее вычислению и добавлению в указанное место
в результирующей таблице (наборе строк). В списке VALUES
, находящемся на верхнем
уровне INSERT
, выражение можно заменить на DEFAULT, указывая, что
следует добавить значение по умолчанию целевого столбца. DEFAULT нельзя
использовать, когда VALUES
употребляется в других контекстах.
выражение_сортировки
Выражение или целочисленная константа, указывающая, как сортировать
результирующие строки. Это выражение может ссылаться на столбцы результата
VALUES
по именам column1, column2 и т. д. Дополнительную информацию см. в
описании предложения ORDER BY команды SELECT
.
оператор
Оператор сортировки. Дополнительную информацию см. в описании
предложения ORDER BY команды SELECT
.
число
Максимальное количество возвращаемых строк. Дополнительную информацию см. в
описании предложения LIMIT команды SELECT
.
начало
Количество строк, которые необходимо пропустить перед тем, как начать возвращать
строки. Дополнительную информацию см. в описании предложения LIMIT
команды 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 необязательно, но рекомендуется. (В QHB
именами столбцов по умолчанию являются 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 являются
расширениями QHB; см. также справочную страницу команды SELECT
.