VALUES — computa um conjunto de valores de linha
VALUES (expressão[, ...] ) [, ...] [ ORDER BYexpressao_de_ordenação[ ASC | DESC | USINGoperador] [, ...] ] [ LIMIT {contador| ALL } ] [ OFFSETinício[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [contador] { ROW | ROWS } ONLY ]
O comando VALUES computa um valor de linha, ou um
conjunto de valores de linha, especificados por expressões de valor.
É mais comumente usado para gerar uma “tabela constante”
em um comando maior, mas pode ser usado sozinho.
Quando é especificada mais de uma linha, todas as linhas devem ter
o mesmo número de elementos.
Os tipos de dados das colunas da tabela resultante são determinados
pela combinação dos tipos explícitos ou inferidos das expressões que
aparecem na coluna, usando as mesmas regras da cláusula
UNION (veja UNION, CASE e construções relacionadas).
Dentro de comandos maiores, VALUES é sintaticamente
permitido em qualquer lugar onde o SELECT é permitido.
Por ser tratado pela gramática como um SELECT,
é possível usar as cláusulas ORDER BY,
LIMIT (ou de forma equivalente,
FETCH FIRST), e OFFSET
no comando VALUES.
expressão
Uma constante, ou expressão calculada, a ser inserida no local
indicado na tabela resultante (conjunto de linhas).
Em uma lista VALUES no nível superior de um
comando INSERT, a
expressão
pode ser substituída por DEFAULT, para indicar
que deve ser inserido o valor padrão da coluna de destino.
Não pode ser usado DEFAULT quando
VALUES aparece em outros contextos.
expressao_de_ordenação
Uma expressão, ou constante inteira, indicando como ordenar as
linhas do resultado.
Esta expressão pode se referir às colunas do resultado de
VALUES como column1,
column2, etc.
Para obter mais detalhes, veja a Cláusula ORDER BY
na documentação do SELECT.
operadorO operador de ordenação. Para obter mais detalhes, veja a Cláusula ORDER BY na documentação do SELECT.
contadorO número máximo de linhas a serem retornadas. Para obter mais detalhes, veja a Cláusula LIMIT na documentação do SELECT.
inícioO número de linhas a serem saltadas antes de começar a retornar linhas. Para obter mais detalhes, veja a Cláusula LIMIT na documentação do SELECT.
Deve-se evitar listas VALUES com um número
muito grande de linhas, porque podem acontecer falhas de
memória insuficiente ou baixo desempenho.
Quando VALUES aparece no comando
INSERT, isto é um caso especial
(porque os tipos de dados das colunas são conhecidos pela tabela de
destino do INSERT, não precisando ser inferidos
pela verificação da lista de VALUES), portanto,
é possível lidar com listas maiores do que em outros contextos.
Um comando VALUES simples:
VALUES (1, 'um'), (2, 'dois'), (3, 'três');
Retorna uma tabela de duas colunas e três linhas, equivalente a:
SELECT 1 AS column1, 'um' AS column2 UNION ALL SELECT 2, 'dois' UNION ALL SELECT 3, 'três';
Geralmente, VALUES é usado em um comando
SQL maior.
O uso mais comum é no comando INSERT:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
No contexto do comando INSERT, pode ser escrito
DEFAULT nas entradas da lista de
VALUES, para indicar que deve ser usado o valor
padrão da coluna nesta posição, em vez de especificar um valor:
INSERT INTO films VALUES
('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES também pode ser usado onde um
sub-SELECT pode ser escrito, por exemplo em uma
cláusula 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;
Note que a cláusula AS é necessária quando
VALUES é usado em uma cláusula
FROM, assim como seria para um
SELECT.
Não é necessário que a cláusula AS especifique
nomes para todas as colunas, mas é uma boa prática fazê-lo.
(Os nomes de coluna padrão para VALUES são
column1, column2, etc., no
PostgreSQL, mas estes nomes podem ser
diferentes em outros sistemas de banco de dados.)
Quando VALUES é usado em um comando
INSERT, os valores são todos convertidos
automaticamente para o tipo de dados da coluna de destino
correspondente.
Quando usado em outros contextos, pode ser necessário especificar
o tipo de dados correto.
Se todas as entradas forem constantes cadeia de caracteres entre
apóstrofos, converter a primeira é suficiente para determinar
o tipo de dados assumido para todas:
SELECT * FROM machines
WHERE ip_address IN
(VALUES
('192.168.0.1'::inet),
('192.168.0.10'),
('192.168.1.43')
);
Para testes IN simples, é melhor confiar na forma
lista-de-valores
do IN, do que escrever uma consulta usando
VALUES como mostrado acima.
O método da lista de valores é mais conciso, e geralmente mais eficiente.
Exemplo 88. Exemplo do tradutor
Este exemplo usa um bloco de código anônimo para mostrar
a atribuição da data e hora corrente a uma variável usando
o comando VALUES INTO
[162].
DO $$
DECLARE
agora TIMESTAMP;
BEGIN
VALUES (CURRENT_TIMESTAMP) INTO agora;
RAISE NOTICE 'Data e hora: %', agora;
END $$ LANGUAGE plpgsql;
NOTA: Data e hora: 2026-03-25 09:50:10.94829
DO
VALUES está em conformidade com o padrão
SQL.
LIMIT e OFFSET são extensões do
PostgreSQL; veja também o comando
SELECT.
[162]
O comando VALUES INTO produz uma tabela de
resultados que consiste em no máximo uma linha, e atribui os
valores dessa linha a variáveis do hospedeiro.
IBM DB2 12.1.x – VALUES INTO statement (N. T.)