SQLite - Subconsultas

Uma subconsulta ou consulta interna ou consulta aninhada é uma consulta dentro de outra consulta SQLite e incorporada 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, BETWEEN, 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.

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

Subconsultas com 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.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Agora, vamos verificar a seguinte subconsulta com a instrução SELECT.

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000) ;

Isso produzirá o seguinte resultado.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Subconsultas com 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 seguir, 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. Para copiar a tabela COMPANHIA completa em COMPANY_BKP, a seguir está a sintaxe -

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

Subconsultas com 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 seguir, 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 é um backup da tabela COMPANY.

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

sqlite> 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
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Subconsultas com instrução DELETE

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

A seguir, 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.

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

Isso afetará duas linhas e, finalmente, a tabela COMPANY terá os seguintes registros -

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0