No PostgreSQL, os
VALUES
O comando retorna um conjunto de uma ou mais linhas como uma tabela. É um construtor de valor de tabela que pode ser usado como parte de um comando maior ou como uma instrução SQL independente. Sintaxe
A sintaxe oficial é assim:
VALUES ( expression [, ...] ) [, ...]
[ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
Exemplo
Aqui está um exemplo simples para demonstrar como funciona:
VALUES (1, 2, 3), (4, 5, 6);
Resultado:
+---------+---------+---------+ | column1 | column2 | column3 | +---------+---------+---------+ | 1 | 2 | 3 | | 4 | 5 | 6 | +---------+---------+---------+
As colunas resultantes são chamadas implicitamente de
column1
, column2
, column3
e assim por diante (embora isso possa ser alterado – veja o SELECT
opção de instrução mais adiante neste artigo). Cada linha é definida por um ou mais valores entre parênteses. Quando mais de uma linha é especificada, todas as linhas devem ter o mesmo número de elementos
Aqui está outro exemplo:
VALUES ('Peter', 'Griffin'), ('Bart', 'Simpson');
Resultado:
+---------+---------+ | column1 | column2 | +---------+---------+ | Peter | Griffin | | Bart | Simpson | +---------+---------+
O ORDER BY
Cláusula
A sintaxe permite o uso do
ORDER BY
cláusula para ordenar os resultados. Exemplo:
VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) ORDER BY column1 DESC;
Resultado:
+---------+---------+---------+ | column1 | column2 | column3 | +---------+---------+---------+ | 7 | 8 | 9 | | 4 | 5 | 6 | | 1 | 2 | 3 | +---------+---------+---------+
O LIMIT
Cláusula
Podemos usar o
LIMIT
cláusula para limitar o número de linhas que são geradas:VALUES
('Peter', 'Griffin'),
('Homer', 'Simpson'),
('Ned', 'Flanders')
LIMIT 2;
Resultado:
+---------+---------+ | column1 | column2 | +---------+---------+ | Peter | Griffin | | Homer | Simpson | +---------+---------+
O OFFSET
Cláusula
Aqui está um exemplo de uso do
OFFSET
cláusula com os VALUES
comando:VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders'),
(4, 'Barney', 'Rubble'),
(5, 'George', 'Costanza')
OFFSET 3;
Resultado:
+---------+---------+----------+ | column1 | column2 | column3 | +---------+---------+----------+ | 4 | Barney | Rubble | | 5 | George | Costanza | +---------+---------+----------+
O FETCH
Cláusula
Aqui está um exemplo de uso do
FETCH
cláusula:VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders'),
(4, 'Barney', 'Rubble'),
(5, 'George', 'Costanza')
FETCH FIRST 3 ROWS ONLY;
Resultado:
+---------+---------+----------+ | column1 | column2 | column3 | +---------+---------+----------+ | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +---------+---------+----------+
Dentro de um SELECT
Declaração
Também podemos usar os
VALUES
declaração dentro de um SELECT
instrução, como se os VALUES
construtor de tabela eram uma tabela real:SELECT
FirstName,
LastName
FROM
(VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders')
) AS Idiots(IdiotId, FirstName, LastName)
WHERE IdiotId = 2;
Resultado:
+-----------+----------+ | firstname | lastname | +-----------+----------+ | Homer | Simpson | +-----------+----------+
Cada construtor de linha deve conter o mesmo número de valores
Cada construtor de linha no mesmo
VALUES
A instrução deve ter o mesmo número de valores em sua lista de valores. Portanto, não podemos fazer isso:
VALUES (1, 2), (3);
Resultado:
ERROR: VALUES lists must all be the same length LINE 1: VALUES (1, 2), (3); ^
Usando VALUES
para inserir dados
Podemos usar os
VALUES
instrução em conjunto com o INSERT
instrução para inserir dados em uma tabela. Exemplo:
CREATE TABLE Idiots (
IdiotId int,
FirstName varchar(50),
LastName varchar(50)
);
INSERT INTO Idiots VALUES
(1, 'Peter', 'Griffin'),
(2, 'Homer', 'Simpson'),
(3, 'Ned', 'Flanders');
Isso criou uma tabela chamada
Idiots
e inseriu três linhas nele. Agora podemos usar um
SELECT
instrução para ver os novos valores na tabela:SELECT * FROM Idiots;
Resultado:
+---------+-----------+----------+ | idiotid | firstname | lastname | +---------+-----------+----------+ | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +---------+-----------+----------+