English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Subconsulta PostgreSQL

As consultas aninhadas, também conhecidas como consultas internas ou consultas aninhadas, referem-se a uma statement de consulta inserida na cláusula WHERE de uma consulta PostgreSQL.

Os resultados de uma statement SELECT podem ser usados como valor de entrada para outra statement.

As consultas aninhadas podem ser usadas com statements SELECT, INSERT, UPDATE e DELETE, e podem usar operadores como =, <, >, >=, <=, IN, BETWEEN e outros.

A seguir estão algumas regras que as consultas aninhadas devem seguir:

  • As consultas aninhadas devem ser envolvidas em parênteses.

  • Uma consulta aninhada pode ter apenas uma coluna no SELECT, a menos que haja várias colunas na consulta principal, para comparar com as colunas da consulta aninhada.

  • ORDER BY não pode ser usado dentro de consultas aninhadas, embora o ORDER BY possa ser usado na consulta principal. Pode ser usado GROUP BY dentro de consultas aninhadas, com a mesma função que o ORDER BY.

  • As consultas aninhadas retornam mais de uma linha e podem ser usadas com operadores de múltiplos valores, como o operador IN.

  • O operador BETWEEN não pode ser usado com consultas aninhadas, mas pode ser usado dentro de uma consulta aninhada.

A subconsulta na instrução SELECT usa

A subconsulta é geralmente usada com a instrução SELECT. A sintaxe básica é a seguinte:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Exemplo online

Criar tabela COMPANY(Baixar arquivo SQL do COMPANY ),o conteúdo dos dados é o seguinte:

w3codeboxdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Agora, vamos usar a subconsulta na instrução SELECT:

w3codeboxdb=# SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY  WHERE SALARY > 45000) ;

O resultado é o seguinte:

 id | name  | age |  address    | salary
----+-------+-----+-------------+--------
  4 | Mark |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas |  85000
(2 rows)

A subconsulta na instrução INSERT usa

A subconsulta também pode ser usada juntamente com a instrução INSERT. A instrução INSERT insere os dados retornados pela subconsulta em outra tabela.

Os dados selecionados na subconsulta podem ser modificados por qualquer caractere, função de data ou número.

A sintaxe básica é a seguinte:

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ] ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Exemplo online

Supondo que a estrutura do COMPANY_BKP seja semelhante à tabela COMPANY e possa usar o mesmo CREATE TABLE para criar, apenas o nome da tabela é alterado para COMPANY_BKP. Agora, vamos copiar toda a tabela COMPANY para COMPANY_BKP, a sintaxe é a seguinte:

w3codeboxdb=# INSERT INTO COMPANY_BKP SELECT * FROM COMPANY  WHERE ID IN (SELECT ID FROM COMPANY) ;

A subconsulta usada na cláusula UPDATE

A subconsulta pode ser usada com a cláusula UPDATE. Quando a subconsulta é usada com a cláusula UPDATE, uma ou mais colunas da tabela são atualizadas.

A sintaxe básica é a seguinte:

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ] ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE ) ]

Exemplo online

Suponha que temos a tabela COMPANY_BKP, que é uma cópia de segurança da tabela COMPANY.

Abaixo está um exemplo que atualiza o SALARY de todos os AGE maiores que 27 o SALARY do cliente é atualizado para 0.50 vezes:

w3codeboxdb=# UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 );

Isso afetará duas linhas, e o registro na tabela COMPANY no final será o seguinte:

 id | name | age | address | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas |  15000
  3 | Teddy |  23 | Norway |  20000
  4 | Mark |  25 | Rich-Mond |  65000
  6 | Kim |  22 | South-Hall |  45000
  7 | James |  24 | Houston |  10000
  1 | Paul |  32 | California |  10000
  5 | David |  27 | Texas |  42500
(7 rows)

A subconsulta usada na cláusula DELETE

A subconsulta pode ser usada com a cláusula DELETE, assim como outras cláusulas mencionadas acima.

A sintaxe básica é a seguinte:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ] ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE ) ]

Exemplo online

Suponha que temos a tabela COMPANY_BKP, que é uma cópia de segurança da tabela COMPANY.

Abaixo está um exemplo que deleta todos os AGE maiores ou iguais a 27 dos registros do cliente:

w3codeboxdb=# DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27 );

Isso afetará duas linhas, e o registro na tabela COMPANY no final será o seguinte:

 id | name | age | address | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas |  15000
  3 | Teddy |  23 | Norway |  20000
  4 | Mark |  25 | Rich-Mond |  65000
  6 | Kim |  22 | South-Hall |  45000
  7 | James |  24 | Houston |  10000
  5 | David |  27 | Texas |  42500
(6 rows)