T-SQL – Subconsultas

PERO subconsulta o Solicitud interna o Consulta anidada es una consulta en otra consulta de SQL Server incrustada en una 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 recuperados.

Las subconsultas se pueden utilizar con sentencias SELECT, INSERT, UPDATE y DELETE junto con sentencias como =, <,>,> =, <=, EN, ENTRE, etc.

Hay algunas reglas que las subconsultas deben seguir:

  • Debe encerrar la subconsulta entre paréntesis.

  • La subconsulta debe incluir una cláusula SELECT y una cláusula FROM.

  • La subconsulta puede incluir cláusulas WHERE, GROUP BY y HAVING opcionales.

  • La subconsulta no puede incluir cláusulas COMPUTE o FOR BROWSE.

  • Solo puede incluir la cláusula ORDER BY si se incluye la cláusula TOP.

  • Puede anidar subconsultas hasta 32 niveles.

Subconsultas con instrucción SELECT

Sintaxis

Las subconsultas se usan más comúnmente 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 la tabla CLIENTES con las siguientes entradas.

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 una instrucción SELECT.

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

El comando anterior dará 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 una subconsulta se pueden modificar utilizando cualquiera de las funciones de símbolo, 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 la tabla CUSTOMERS_BKP con una estructura similar a la tabla CUSTOMERS. A continuación se muestra la sintaxis para copiar la tabla CUSTOMERS completa a 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. Cuando usa una subconsulta con una instrucción UPDATE, puede actualizar una o más columnas en la tabla.

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 una tabla CUSTOMERS_BKP que es una copia de seguridad de la tabla CUSTOMERS.

El siguiente ejemplo del comando SALARIO actualiza la tabla CLIENTES 0,25 veces para todos los clientes que tienen 27 años o más.

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 CUSTOMERS 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 

ELIMINAR subconsultas

La subconsulta se puede utilizar junto con la sentencia DELETE como con cualquiera de las otras sentencias mencionadas 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 una tabla CUSTOMERS_BKP 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 que tienen 27 años o más.

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

Esto afectará a dos filas y finalmente la tabla CUSTOMERS 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 

🚫