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