Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Вычисляет набор строк.
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. Поскольку синтаксически VALUES обрабатывается как SELECT, к нему можно применять предложения ORDER BY, LIMIT (или эквивалентное FETCH FIRST) и OFFSET.
Следует избегать использования списков 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 — column1, column2 и т.д. в Database, но в других системах управления базами данных они могут отличаться.
Когда VALUES используется в команде INSERT, все значения автоматически приводятся к типу данных соответствующего целевого столбца. При использовании в других контекстах может потребоваться явное указание нужного типа данных. Если все элементы представляют собой строковые литералы в кавычках, достаточно привести первый элемент, чтобы определить тип для всех:
SELECT * FROM machines WHERE ip_address IN
(VALUES('192.168.0.1'::inet), ('192.168.0.10'),
('192.0.2.43'));
Примечание!
Для простых проверок с помощью IN лучше использовать форму списка скалярных значений, а не записывать запрос через VALUES, как показано выше. Использование списка скаляров требует меньше кода и зачастую обеспечивает лучшую производительность.
VALUES соответствует стандарту SQL. LIMIT и OFFSET являются расширениями Database; дополнительную информацию см. в описании SELECT.