SQLite Subconsultas

Una subconsulta, también llamada consulta interna o consulta anidada, se refiere a una consulta incrustada en la cláusula WHERE de una consulta SQLite.

El resultado de una sentencia SELECT puede utilizarse como valor de entrada de otra sentencia.

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

A continuación se presentan varias reglas que deben seguir las subconsultas:

  • La subconsulta debe estar encerrada entre paréntesis.

  • En la cláusula SELECT, una subconsulta solo puede tener una columna, a menos que en la consulta principal haya múltiples columnas que se comparen con las columnas seleccionadas en la subconsulta.

  • ORDER BY no puede usarse en una subconsulta, aunque la consulta principal puede usar ORDER BY. Se puede usar GROUP BY dentro de la subconsulta, con la misma función que ORDER BY.

  • Si la subconsulta devuelve más de una fila, solo puede usarse con operadores multivalor, como el operador IN.

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

Uso de subconsultas en la sentencia SELECT

Las subconsultas se usan normalmente con la sentencia 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

Supongamos que la tabla COMPANY tiene 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, veamos el uso de subconsultas en la sentencia 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

Uso de subconsultas en la sentencia INSERT

Las subconsultas también pueden usarse con la sentencia INSERT. La sentencia INSERT utiliza los datos devueltos por la subconsulta para insertarlos en otra tabla. Los datos seleccionados en la subconsulta pueden modificarse con cualquier función de caracteres, fecha o números.

La sintaxis básica es la siguiente:

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

Ejemplo

Supongamos que COMPANY_BKP tiene una estructura similar a la tabla COMPANY y puede crearse con el mismo CREATE TABLE, solo que el nombre de la tabla se cambia a COMPANY_BKP. Ahora copie toda la tabla COMPANY a COMPANY_BKP, la sintaxis es la siguiente:

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

Uso de subconsultas en la sentencia UPDATE

Las subconsultas pueden combinarse con la sentencia UPDATE. Cuando se usa una subconsulta con la sentencia UPDATE, se actualizan una o varias columnas de la tabla.

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

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

El siguiente ejemplo actualiza el SALARY de todos los clientes con AGE mayor o igual que 27 en la tabla COMPANY a 0.50 veces el valor original:

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, al final, los registros de la tabla COMPANY serán los siguientes:

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

Uso de subconsultas en la sentencia DELETE

Las subconsultas pueden combinarse con la sentencia DELETE, al igual que con las otras sentencias mencionadas anteriormente.

La sintaxis básica es la siguiente:

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

Ejemplo

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

El siguiente ejemplo elimina los registros de todos los clientes con AGE mayor o igual que 27 en la tabla COMPANY:

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

Esto afectará a dos filas y, al final, los registros de la tabla COMPANY serán los siguientes:

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
Otras extensiones