SQLite - Subconsultas

Una subconsulta o consulta interna o consulta anidada es una consulta dentro de otra consulta SQLite e incrustada dentro de la cláusula WHERE.

Una subconsulta se utiliza para devolver datos que se utilizarán en la consulta principal como condición para restringir aún más los datos que se recuperarán.

Las subconsultas se pueden usar con las sentencias SELECT, INSERT, UPDATE y DELETE junto con los operadores como =, <,>,> =, <=, IN, BETWEEN, etc.

Hay algunas reglas que las subconsultas deben seguir:

  • Las subconsultas deben ir entre paréntesis.

  • Una subconsulta solo puede tener una columna en la cláusula SELECT, a menos que haya varias columnas en la consulta principal para que la subconsulta compare sus columnas seleccionadas.

  • Un ORDER BY no se puede usar en una subconsulta, aunque la consulta principal puede usar un ORDER BY. GROUP BY se puede utilizar para realizar la misma función que ORDER BY en una subconsulta.

  • Las subconsultas que devuelven más de una fila solo se pueden usar con varios operadores de valor, como el operador IN.

  • El operador BETWEEN no se puede utilizar con una subconsulta; sin embargo, BETWEEN se puede utilizar dentro de la subconsulta.

Subconsultas con instrucción SELECT

Las subconsultas se utilizan con mayor frecuencia con la instrucción SELECT. La sintaxis básica es la siguiente:

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

Ejemplo

Considere la tabla EMPRESA con los siguientes 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

Ahora, verifiquemos la siguiente subconsulta con la instrucción SELECT.

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

Esto producirá el siguiente resultado.

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

Subconsultas con instrucción INSERT

Las subconsultas también se pueden usar con instrucciones INSERT. La instrucción INSERT utiliza los datos devueltos por la subconsulta para insertarlos en otra tabla. Los datos seleccionados en la subconsulta se pueden modificar con cualquiera de las funciones de carácter, fecha o número.

A continuación, la sintaxis básica es la siguiente:

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

Ejemplo

Considere una tabla COMPANY_BKP con una estructura similar a la tabla COMPANY y se puede crear usando la misma CREATE TABLE usando COMPANY_BKP como el nombre de la tabla. Para copiar la tabla COMPAÑÍA completa en COMPANY_BKP, la siguiente es la sintaxis:

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

Subconsultas con instrucción UPDATE

La subconsulta se puede utilizar junto con la instrucción UPDATE. Se pueden actualizar una o varias columnas en una tabla cuando se usa una subconsulta con la instrucción UPDATE.

A continuación, la sintaxis básica es la siguiente:

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

Ejemplo

Suponiendo que tenemos la tabla COMPANY_BKP disponible, que es una copia de seguridad de la tabla COMPANY.

El siguiente ejemplo actualiza SALARIO 0,50 veces en la tabla EMPRESA para todos los clientes cuya EDAD sea mayor o igual a 27.

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

Esto afectaría dos filas y finalmente la tabla EMPRESA tendría los siguientes 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 con instrucción DELETE

La subconsulta se puede usar junto con la instrucción DELETE como con cualquier otra instrucción mencionada anteriormente.

A continuación, la sintaxis básica es la siguiente:

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

Ejemplo

Suponiendo que tenemos la tabla COMPANY_BKP disponible, que es una copia de seguridad de la tabla COMPANY.

El siguiente ejemplo elimina registros de la tabla EMPRESA para todos los clientes cuya EDAD sea mayor o igual a 27.

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

Esto afectará a dos filas y finalmente la tabla EMPRESA tendrá los siguientes 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