PostgreSQL - Subconsultas

Uma subconsulta ou consulta interna ou consulta aninhada é uma consulta dentro de outra consulta PostgreSQL e embutida na cláusula WHERE.

Uma subconsulta é usada para retornar dados que serão usados ​​na consulta principal como uma condição para restringir ainda mais os dados a serem recuperados.

As subconsultas podem ser usadas com as instruções SELECT, INSERT, UPDATE e DELETE junto com os operadores como =, <,>,> =, <=, IN, etc.

Existem algumas regras que as subconsultas devem seguir -

  • As subconsultas devem ser colocadas entre parênteses.

  • Uma subconsulta pode ter apenas uma coluna na cláusula SELECT, a menos que várias colunas estejam na consulta principal da subconsulta para comparar suas colunas selecionadas.

  • Um ORDER BY não pode ser usado em uma subconsulta, embora a consulta principal possa usar um ORDER BY. O GROUP BY pode ser usado para executar a mesma função que o ORDER BY em uma subconsulta.

  • As subconsultas que retornam mais de uma linha só podem ser usadas com vários operadores de valor, como o operador IN, EXISTS, NOT IN, ANY / SOME, ALL.

  • O operador BETWEEN não pode ser usado com uma subconsulta; no entanto, o BETWEEN pode ser usado na subconsulta.

Subconsultas com a instrução SELECT

As subconsultas são usadas com mais freqüência 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

Considere a tabela COMPANY com os seguintes registros -

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 verificar a seguinte subconsulta com a instrução SELECT -

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

Isso produziria o seguinte resultado -

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

Subconsultas com a instrução INSERT

As subconsultas também podem ser usadas com instruções INSERT. A instrução INSERT usa os dados retornados da subconsulta para inserir em outra tabela. Os dados selecionados na subconsulta podem ser modificados com qualquer uma das funções de caractere, 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

Considere uma tabela COMPANY_BKP, com estrutura semelhante à tabela COMPANY e pode ser criada usando o mesmo CREATE TABLE usando COMPANY_BKP como o nome da tabela. Agora, para copiar a tabela COMPANHIA completa em COMPANY_BKP, a seguir está a sintaxe -

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

Subconsultas com a instrução UPDATE

A subconsulta pode ser usada em conjunto com a instrução UPDATE. Tanto uma coluna quanto várias colunas em uma tabela podem ser atualizadas ao usar uma subconsulta com a instrução UPDATE.

A sintaxe básica é a seguinte -

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

Exemplo

Assumindo que temos a tabela COMPANY_BKP disponível, que é o backup da tabela COMPANY.

O exemplo a seguir atualiza SALÁRIO em 0,50 vezes na tabela EMPRESA para todos os clientes, cuja IDADE seja maior ou igual a 27 -

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

Isso afetaria duas linhas e, finalmente, a tabela COMPANY teria os seguintes registros -

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)

Subconsultas com a instrução DELETE

A subconsulta pode ser usada em conjunto com a instrução DELETE como com qualquer outra instrução mencionada acima.

A sintaxe básica é a seguinte -

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

Exemplo

Assumindo que temos a tabela COMPANY_BKP disponível, que é um backup da tabela COMPANY.

O exemplo a seguir exclui registros da tabela COMPANY para todos os clientes, cuja IDADE é maior ou igual a 27 -

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

Isso afetaria duas linhas e, finalmente, a tabela COMPANY teria os seguintes registros -

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)