Subconsultas en SQL
¿Qué es una Subconsulta?
- 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
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:
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.
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.
0 Comentarios