SQL: Subquery: lo que necesitas saber
Una subconsulta, también conocida como SUBQUERY o SUBSELECT, es una consulta incrustada dentro de otra consulta, de forma anidada, pasando los resultados de la consulta más interna a la consulta más externa a través de una cláusula WHERE o de la cláusula HAVING.
De esta forma, es posible restringir aún más los datos que devolverá una consulta, permitiéndonos crear filtros de consulta muy sofisticados. La subconsulta devolverá los datos que se colocarán en la consulta principal, seguidos de la información que se utilizará como condiciones de filtrado.
Podemos usar Subquery no solo en consultas con la cláusula SELECT, también podemos utilizar las operaciones. INSERT, UPDATE e DELETE.
Cuando utilizamos una subquery en una query, primero se resolverá la subquery y solo después se resolverá la consulta externa o principal según el resultado que regresará de la subconsulta.
Visión general
Por ejemplo, las subconsultas se dividieron en diferentes sesiones, lo que también se puede ver en SELECT AS FIELD y SELECT FROM SELECT, formas de realizar las subqueries.
Para nuestro ejemplo en este artículo, usaremos la estructura de tabla a continuación, donde tendremos lo siguiente:
Tabla 1: Productos - Será responsable de almacenar todos los productos en el stock del cliente.
Tabla 2: Categoría_producto - Responsable de almacenar las categorías existentes en tu base de datos.
Tabla 3: Venda_producto - Será responsable de la relación de los productos vendidos.
Tomando como ejemplo, supongamos que es necesario listar todos los registros de la tabla de productos que tienen un precio superior al promedio de otros productos, con la consulta de la siguiente manera:
Mirando el fragmento de código anterior, podemos ver en las líneas 1 a 3 que informamos que las columnas nombre y precio se traerán en la consulta, en las siguientes líneas 4 y 5 informamos que la consulta a realizar será en la tabla de productos.
De las líneas 6 a 11 informaremos que solo se traerán resultados en los que el valor de la columna de precios sea mayor que el resultado SELECT de la línea 8, que se encarga de traer el valor total del precio promedio de la tabla de productos.
El resultado de la query sería:
Tabla 4: Devolución de la tabla de consulta de productos con un precio superior a la media de otros productos.
A continuación, mostraré la parte sintáctica de las consultas:
Luego de comprender lo explicado anteriormente, practicaremos algunas situaciones para comprender mejor el contenido.
Ejemplo 1
En el siguiente ejemplo, realizaremos una consulta basada en el resultado de otra consulta.
Supongamos que necesitamos saber todos los productos existentes, cuántos se vendieron y luego también necesitaremos saber cuándo el producto tuvo la mayor cantidad de artículos vendidos. Usando la siguiente consulta:
Cuando miramos el fragmento de código de arriba, podemos ver que hicimos un SELECT dentro de otro SELECT, cuando seguimos analizando el código, vemos que en las líneas 2 a 4 informamos qué columnas aparecerán en la consulta. También tenga en cuenta que específicamente en la línea 4, se solicita el valor máximo de la columna TOTAL_VENDIDO.
Siguiendo con las líneas 5 a 19 dijimos que la consulta se realizará FROM en un segundo SELECT. En la línea 8 solicitamos que se haga el conteo product_id que está presente en la tabla product_sales y luego se agrupa el resultado por id de producto y en la línea 15 definimos que esta columna se llamará TOTAL_SOLD.
Y en la línea 19 usamos un ALIAS para la consulta que se está usando como tabla.
El resultado de la consulta anterior se verá así:
Ejemplo 2
Para el siguiente ejemplo, el escenario será el siguiente:
La empresa Robs Pães dispone de una mesa para Panaderos (Tabla 6) y una segunda mesa para asistentes (Tabla 7).
Tabla 6: Panaderos
Tabla 7: Auxiliares
Luego, la empresa Robs Pães tomó la decisión de ascender a los panaderos, todos los asistentes que estaban en la empresa antes de 2020 y también solicitó que los empleados promocionados se sumaran a la mesa del panadero. Mediante la siguiente consulta podremos cumplir con la solicitud de la empresa:
En la consulta anterior, en las líneas 1 y 2 informamos que los datos se insertarán en la tabla de panaderos y que se completarán las columnas nombre, departamento y fecha_admisión (data_admissão). En la línea 3 informamos que los datos que se están insertando se obtendrán mediante otra consulta, en las líneas 3 a 8 realizamos una segunda consulta, la cual solicita de la base de datos a todos los empleados de la tabla auxiliar que tengan el año de su fecha de ingreso, menos de 2020.
Cuando ejecutamos esta consulta, todos los datos que se encuentren en la tabla auxiliar correspondiente a la consulta se agregarán a la tabla de panaderos. Se parece a esto:
Tabla 8: Tabla panaderos con los auxiliares.
Ejemplo 3
Para o próximo exemplo, iremos utilizar a mesma estrutura de tabelas utilizada anteriormente, as tabelas de padeiro e auxiliar.
Considerando que con la ejecución de la consulta anterior, todos los asistentes que ascendieron a panadero fueron insertados en la tabla de panaderos, sin embargo, sus nombres permanecen en la tabla de asistentes. Para resolver este problema, usaremos otro ejemplo de subconsulta, en este caso usando el comando DELETE. La consulta se verá así:
Al observar la consulta anterior, utilizamos el comando DELETE en la tabla auxiliar con, como condición, que el nombre del auxiliar esté en el resultado de otra consulta, siendo el resultado de la consulta anterior:
Tabla 8
Cuando miramos el resultado anterior, vemos que los registros que fueron promovidos a panadero ya no forman parte de la tabla, después de todo los acabamos de eliminar.
Directrices para una subQuery
- Una subquery siempre debe colocarse entre paréntesis.
- Una subquery debe colocarse a la derecha del operador de comparación.
- Las subqueries no puede manipular sus datos de internamiento, por lo que la cláusula ORDER BY no se puede agregar a una subconsulta. Puedes usar la cláusula ORDER BY en tu declaración SELECT principal, que será la última cláusula.
- Utiliza operadores de una sola línea para subconsultas de una sola línea.
- En caso de que una subquery (interna) devuelve un valor nulo para la consulta externa, la consulta externa no devolverá ninguna fila cuando se utilizan ciertos operadores de comparación en una cláusula WHERE.
- Es posible que utilicemos la cláusula GROUP BY en una subquery.
- No es posible utilizar el operador BETWEEN con una subquery en caso de que sea en la consulta principal, pero podemos utilizar ese operador dentro de la subquery.
Tipos de Subqueries
- Subquery de línea única: retornará zero o una línea.
- Subquery de varias líneas: retornará una o más líneas.
- Subquery de varias columnas: retornará una o más columnas.
- Subquery correlacionada: hará referencia a una o más columnas en la declaración SQL externa. Esta subconsulta se conoce como subconsulta correlacionada porque está relacionada con la declaración SQL externa.
- Subquery anidada: Estas son subconsultas que se colocan dentro de otra subconsulta.
Conclusión
Podemos utilizar subconsultas para resolver problemas simples y complejos. Es una instrucción muy versátil y puede usarse en diferentes escenarios, generalmente sirve para resolver problemas que necesitan resolverse con 2 o más consultas.
Podemos usar subconsultas en varias declaraciones diferentes como SELECT, INSERT, UPDATE y DELETE. Usando estas instrucciones podemos usar subconsultas en varias cláusulas como INTO, VALUES, SET, WHERE y HAVING. O Oracle también nos permitirá utilizar la Subconsulta tanto en el lado derecho como en el izquierdo del operador “=".
Próximamente traeré un nuevo artículo hablando detalladamente de cada tipo de Subconsulta y explicando cómo utilizar cada una de ellas, utilizando como base una base de datos proporcionada por Oracle para que los ejemplos sean lo más asertivos posible.
Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.