T-SQL - Subconsultas
UN sub-query o Inner query o Nested queryes una consulta dentro de otra consulta de SQL Server e incrustada dentro de la cláusula WHERE. Se utiliza una subconsulta 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 utilizar con las instrucciones SELECT, INSERT, UPDATE y DELETE junto con los operadores como =, <,>,> =, <=, IN, BETWEEN, etc.
Hay algunas reglas que deben seguir las subconsultas:
Debe incluir una subconsulta entre paréntesis.
Una subconsulta debe incluir una cláusula SELECT y una cláusula FROM.
Una subconsulta puede incluir cláusulas WHERE, GROUP BY y HAVING opcionales.
Una subconsulta no puede incluir cláusulas COMPUTE o FOR BROWSE.
Puede incluir una cláusula ORDER BY solo cuando se incluye una cláusula TOP.
Puede anidar subconsultas hasta 32 niveles.
Subconsultas con instrucción SELECT
Sintaxis
Las subconsultas se utilizan con mayor frecuencia con la instrucción SELECT. A continuación se muestra la sintaxis básica.
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Ejemplo
Considere que la tabla CLIENTES tiene los siguientes registros.
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Apliquemos la siguiente subconsulta con la instrucción SELECT.
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)
El comando anterior producirá el siguiente resultado.
ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
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.
Sintaxis
A continuación se muestra la sintaxis básica.
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Ejemplo
Considere una tabla CUSTOMERS_BKP con una estructura similar a la tabla CUSTOMERS. A continuación se muestra la sintaxis para copiar la tabla CUSTOMERS completa en CUSTOMERS_BKP.
INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS)
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.
Sintaxis
A continuación se muestra la sintaxis básica.
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Ejemplo
Supongamos que tenemos la tabla CUSTOMERS_BKP disponible, que es una copia de seguridad de la tabla CUSTOMERS.
El siguiente ejemplo de comando actualiza SALARIO 0,25 veces en la tabla CLIENTES para todos los clientes cuya EDAD sea mayor o igual a 27.
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )
Esto afectará a dos filas y finalmente la tabla CLIENTES tendrá los siguientes registros.
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 2125.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Subconsultas con instrucción DELETE
La subconsulta se puede usar junto con la instrucción DELETE como con cualquier otra instrucción mencionada anteriormente.
Sintaxis
A continuación se muestra la sintaxis básica.
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Ejemplo
Supongamos que tenemos la tabla CUSTOMERS_BKP disponible, que es una copia de seguridad de la tabla CUSTOMERS.
El siguiente ejemplo de comando elimina registros de la tabla CLIENTES para todos los clientes cuya EDAD sea mayor o igual a 27.
DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )
Esto afectaría a dos filas y finalmente la tabla CLIENTES tendrá los siguientes registros.
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00