Subconsultas en SQL Server

 Subconsultas en SQL



Muchas veces en nuestras consultas necesitamos incluir información de registros que se encuentran almacenados en otras tablas. Para poder obtener esos registros contenidos en otras tablas en SQL existen las Subconsultas.



¿Qué es una Subconsulta?

Una Subconsulta es una instrucción de selección que nos permite obtener los registros almacenados en otra tablas, de manera que podemos añadir una subconsulta a una sentencia SELECT para obtener los registros que cumplen con la condición.

Una subconsulta es una consulta que debemos especificarla cuando utilizamos la clausula WHERE o HAVING  en una sentencia SQL.


Características  de las subconsultas

  • Una subconsulta debe ser declarada entre paréntesis
  • Al crear una subconsulta esta no debe contener la clausula BETWEEN ni la clausula LIKE
  • Una subconsulta se puede anidar dentro de otra subconsulta
  • Una subconsulta  debe ir siempre colocada al lado derecho del operador relacional
  • En una subconsulta no puede haber una clausula ORDER BY.
  • Al crear una subconsulta en una sentencia UPDATE ,esta no puede recuperar registros de la misma tabla donde se va a realizar la actualización
  • Una subconsulta debe devolver siempre el mismo tipo y número de valores  a comparar

Sintaxis de una subconsulta en sentencias SELECT, INSERT INTO, UPDATE Y DELETE


Sentencia Select
SELECT Columnas1,Columna2 
FROM Nombre_Tabla
WHERE Columna = (SELECT Columna FROM Nombre_Tabla)

A continuación vamos a explicar la sintaxis de una subconsulta dentro de una sentencia SELECT.

Una subconsulta dentro de una sentencia Select debe ir luego de la cláusula WHERE o HAVING además en una subconsulta podemos hacer uso de funciones como MIN,MAX, AVG,SUM y de operadores como IN ,ANY o ALL.


Sentencia Insert Into

INSERT INTO Nombre_Tabla(Colummna1, Columna2, Columna3)
SELECT Columna1, Columna2, Columna3 
FROM Nombre_Tabla
WHERE Columna = Condicion

Al crear una subconsulta en una sentencia Insert Into las columnas de la sentencia Select deben estar en el mismo orden que las columnas de la tabla donde se insertarán los registros, también debemos saber que las columnas de la de la sentencia Select debemos renombrarlas para realizar la inserción en la tabla. Una subconsulta en una sentencia Insert Into también podemos hacer uso de operadores y funciones T-SQL. 


Sentencia UPDATE

UPDATE Nombre_Tabla
SET Nombre_Columna =(SELECT * FROM Nombre_Tabla WHERE Columna = Condicion)

UPDATE Nombre_Tabla
SET Nombre_Columna = Operacion_Actualizacion
WHERE Nombre_Columna =(SELECT * FROM Nombre_Tabla WHERE Columna = Condicion)

Una subconsulta en una sentencia UPDATE podemos declararla en la cláusula SET y WHERE. Como es de nuestro conocimiento la cláusula SET es donde definimos el nuevo valor para la columna que se va a modificar, por lo cual acá podemos definir una subconsulta que nos permita obtener ese valor de otra tabla siempre y cuando obtengamos un solo registro con solo una columna para cada registros que vayamos a actualizar, por último, debemos saber que el tipo de datos obtenido en la subconsulta debe ser el mismo que el de la columna que vamos a actualizar.

Podría interesarte(sentencia update sql)

Sentencia DELETE

DELETE FROM Nombre_Tabla 
WHERE NombreColumna = (select Columna from NombreTabla where Condicion)

Si observamos una subconsulta en una sentencia DELETE se declara después de la cláusula WHERE. Al implementar una subconsulta en una sentencia DELETE debemos de tener en cuenta de aplicar un debido filtro para la eliminación de los registros ya que de no hacerlo nos veríamos en el error de comprometer los registros de toda la tabla seleccionada.

Podrías indagar un poco más de (delete from en sql)


Ejemplo de subconsultas en SQL Server

A continuación vamos a mostrar una serie de ejemplos utilizando subconsultas para eso vamos a utilizar  dos bases de datos de prueba denominadas "BDTutorial" y otra de un "sistema de ventas" la  primera cuenta con tres tablas que manejan la información de ventas de automóviles y la segunda contiene tablas de un sistema de inventarios y facturacion.

Para el primer ejemplo vamos a crear una consulta que no visualice el ID ,el precio y la cantidad vendida de autos cuyo año de lanzamiento haya sido 2020. veamos la consulta que crearemos para obtener esos registros.

SELECT AutoID,Precio,Cantidad 
FROM AutosVentas
WHERE AutoID IN (SELECT AutoID FROM Autos WHERE Año = '2020')

La consulta principal nos va a seleccionar el ID, Precio y Cantidad de la tabla "AutosVentas" y la subconsulta que la especificamos entre paréntesis nos va a buscar los autos cuyos años de lanzamiento sea 2020. Ejecutemos la consulta en SQL Server Management Studio.


Al ejecutar la consulta podemos observar que nos va a mostrar las ventas de los autos cuyo año de lanzamiento fue 2020.

Ahora vamos a crear otro ejemplo en el cual vamos a consultar el producto que contenga el total en existencia de productos. La subconsulta nos va a mostrar el producto cuyo lote contenga la mayor existencia registrada y por último la consulta principal va a mostrar el total del producto que tenga la mayor existencia. La consulta que vamos a crear es la siguiente.

SELECT NombreProducto,SUM(CantidadExistente) AS Stock_Total FROM SivProductos
 GROUP BY NombreProducto
 HAVING SUM(CantidadExistente) >= All(SELECT SUM(CantidadExistente) FROM SivProductoLote GROUP BY objProductoID)

A continuación vamos a ejecutar la consulta en SQL Server Management Studio:

El resultado Obtenido nos va mostrar la información del producto que contiene la mayor cantidad de existencia. para Obtener este resultamos hemos agrupado los productos de manera que sumamos las cantidad existente y mandamos a comprobar que esas existencias sean mayores o iguales en la tabla que almacena los lotes de cada producto.


Ejemplo de una subconsulta en una sentencia INSERT INTO SQL Server

Como ya vimos en la explicación al utilizar subconsultas para insertar registros en una tabla estas deben contener las misma cantidad de columnas que la tabla donde vamos a insertar los registros.

El siguiente ejemplo vamos a insertar el "ID" y el "AÑO" de un auto en la tabla "AutoRepuesto" utilizando una subconsulta.

INSERT INTO AutoRepuestos(AutoID,Modelo)
SELECT AutoID,Año AS Modelo FROM Autos

Como podemos observar la Subconsulta obtiene el ID y el Año de un auto y lo inserta en la tabla Autos repuestos. Ejecutemos la consulta en SQL Server Management Studio:


Ejejecutamos la consulta y podemos observar que se insertaron los registros. Por último vamos a realizar un select para verificar que se haya registrado los registros en la tabla.


Mediante el ejemplo anterior ya podemos entender que al utilizar una subconsulta podemos insertar registros provenientes de otra tabla.


Ejemplo de una subconsulta en una sentencia UPDATE SQL Server

las subconsulta también podemos utilizarlas en una sentencia update pero aca varia el uso ya que podemos declararla cuando usamos la sentencia WHERE o bien al momento de utilizar la cláusula SET la cual nos permite modificar la columna elegida. veamos 2 ejemplos del uso de subconsultas en un UPDATE.

Para el primer ejemplo vamos a actualizar la existencias de autos en base a la cantidad de autos vendidos y por ID de auto. La consulta queda de la siguiente manera:

UPDATE Autos
SET
 Existencias = Existencias-(SELECT sum(Cantidad) FROM AutosVentas WHERE AutoID = 6 )
 WHERE AutoID = 6

La consulta principal manda a actualizar la existencias de un auto, mediante la subconsulta obtenemos la cantidad de autos vendidos y restamos la cantidad a la existencia total. Si observamos en la subconsulta utilizamos la cláusula WHERE  para especificar el ID del auto que vamos a actualizar, si se omitiera la cláusula WHERE modificaríamos las existencias de todo los registros en la tabla Autos. Ejecutemos la consulta en Management Studio de SQL Server primeramente realicemos un select para observar las existencias del auto con ID= 6 cuya existencias son 22.


Las existencias a actualizar son las del auto con ID= 6, el cual tiene 22 en existencias ahora ejecutemos el UPDATE.


Se actualizaron los registros del auto con ID = 6. realicemos un select a la tabla "Autos" y verifiquemos si se realizó la modificación y de igual manera vamos a realizar un select a la tabla "AutosVentas" para ver la cantidad de autos que se vendieron y si coincide con lo descargado de las existencias.

Si observamos la figura anterior podemos observar que se actualizaron los registros en la tabla "Autos" específicamente las existencias del ID=6, previo a la actualización vimos que en las existencias total eran 22 autos, ahora después de haber actualizado en base a la cantidad vendida las cuales fueron 8 según los registros guardados en la tabla AutoVentas el total de autos se reduce a 14.

Ahora vamos a crear un segundo ejemplo pero esta vez la subconsulta la utilizaremos en la declaración de la sentencia WHERE. El siguiente ejemplo actualizáremos la columna "ParteRepuesto" de la tabla "AutosRepuestos" de los autos cuyo modelo sea 2020. veamos la consulta.

 UPDATE AutoRepuestos
 SET
  ParteRepuesto = 'Caja de Cambios'
 WHERE AutoID IN (SELECT AutoID FROM Autos WHERE Año = 2020)

La consulta que mostramos va actualizar la columna "ParteRepuesto" con valor "Caja de cambios" pero la actualizacion sera para aquellos autos cuyo año de lanzamiento sea 2020. Ejecutemos la consulta en Management Studio.


Los cambios fueron aplicados, ahora realicemos un select para verificar si se actualizaron los registros.


Verificado los registros podemos ver que se actualizaron los registros cuyo año de lanzamiento fue el 2020. La subconsultas en una sentencia update son muy útiles pero debemos de tener mucho cuidado al utilizarlas ya que si no utilizamos filtros adecuados en este caso el uso de la sentencia WHERE  podemos compromete y erróneamente actualizar todo los registros de una tabla.


Ejemplo de una subconsulta en una sentencia DELETE SQL Server

Una subconsulta en una sentencia DELETE  solamente la podemos usar cuando declaramos una cláusula WHERE. Ojo si omitimos la cláusula WHERE  trabajando con la sentencia delete podemos ocasionar que eliminemos por error todo los registros existente en una tabla.

A continuación vamos a crear un consulta que nos elimine los registros de ventas de autos cuya año de lanzamiento sea 2020. veamos la consulta.

DELETE FROM AutosVentas 
WHERE  AutoID IN(SELECT AutoID FROM Autos WHERE Año = 2020)

Ejecutemos la consulta en SQL Server Management Studio:

Primero realicemos un select con los registros antes de eliminar la información.


Ahora ejecutemos la consulta creada para eliminar los registros.


La consulta fue ejecutada y eliminó la información según el filtro creado en la cláusula WHERE, realicemos un select ala tabla "AutosVentas" y verifiquemos si se eliminaron los datos.


Verificamos la tabla "AutosVentas" y podemos ver que los registros fueron eliminados. Las subconsulta en una sentencia DELETE  deben trabajarse con mucho cuidado ya que de no realizar un filtro adecuado para el manejo de los registros podemos comprometer todo los datos almacenados en la tabla y eliminarlos por error.

Hemos visto que las subconsultas son una herramienta muy poderosa cuando necesitamos trabajar con múltiples registros, también hemos visto que podemos utilizarlas en muchas sentencias con las cuales trabajamos a diario(INSERT INTO, UPDATE, DELETE, SELECT). Esto ha sido todo en este tutorial hasta la próxima.





Publicar un comentario

0 Comentarios