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

Subconsulta no SQLite

Subconsulta ou consulta interna ou consulta aninhada é uma consulta SQLite dentro de outra consulta, inserida na cláusula WHERE.

As subconsultas são usadas para retornar os dados que serão usados na consulta principal, como condições adicionais para limitar os dados a serem recuperados.

As subconsultas podem ser usadas com as cláusulas SELECT, INSERT, UPDATE e DELETE, bem como com os operadores =, <, >, >=, <=, IN, BETWEEN, etc.

Existem algumas regras a serem seguidas pelas subconsultas-

  • A subconsulta deve ser colocada entre parênteses.

  • A subconsulta pode ter apenas uma coluna na cláusula SELECT, a menos que a consulta principal tenha várias colunas para comparar as colunas selecionadas pela subconsulta.

  • Embora a consulta principal possa usar ORDER BY, não pode usar ORDER BY na subconsulta. GROUP BY pode ser usado para executar a mesma função que o ORDER BY na subconsulta.

  • Subconsultas que retornam várias linhas podem ser usadas apenas com operadores de múltiplos valores (por exemplo, o operador IN).

  • O operador BETWEEN não pode ser usado com subconsultas; mas, pode ser usado dentro de uma subconsulta.

Subconsulta com cláusula SELECT

A subconsulta é mais frequentemente usada com a cláusula 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])

示例

Tabela COMPANY com os seguintes registros.

ID          NOME        IDADE         ENDEREÇO     SALÁRIO
----------  ----------  ----------  ----------  ----------
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 usar a cláusula SELECT para verificar a seguinte subconsulta.

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

Isso resultará nos seguintes resultados.

ID          NOME        IDADE         ENDEREÇO     SALÁRIO
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

带有INSERT语句的子查询

子查询也可以与INSERT语句一起使用。INSERT语句使用从子查询返回的数据插入另一个表。可以使用任何字符,日期或数字功能修改子查询中的选定数据。

以下是基本语法如下-

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

示例

考虑一个表COMPANY_BKP,其结构与COMPANY表相似,并且可以使用COMPANY_BKP作为表名使用相同的CREATE TABLE创建。要将完整的COMPANY表复制到COMPANY_BKP,请使用以下语法-

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

带有UPDATE语句的子查询

子查询可以与UPDATE语句结合使用。使用带有UPDATE语句的子查询时,可以更新表中的单列或多列。

以下是基本语法如下-

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

示例

假设我们有COMPANY_BKP表可用,它是COMPANY表的备份。

以下示例将COMPANY表中年龄大于或等于27岁的所有客户的薪资更新0。50倍。

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

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

ID          NOME        IDADE         ENDEREÇO     SALÁRIO
----------  ----------  ----------  ----------  ----------
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

带有DELETE语句的子查询

子查询可以与DELETE语句一起使用,就像上面提到的任何其他语句一样。

以下是基本语法如下-

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

示例

假设我们有COMPANY_BKP表可用,它是COMPANY表的备份。

下面的示例从COMPANY表中删除年龄大于或等于27的所有客户的记录。

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

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

ID          NOME        IDADE         ENDEREÇO     SALÁRIO
----------  ----------  ----------  ----------  ----------
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