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