Volver a la lista de artículos Artículos
Lectura de 7 minutos

¿Cuáles son los diferentes tipos de subconsultas SQL?

Las subconsultas se pueden utilizar en muchos casos empresariales. ¿Qué tipos de subconsultas ofrece SQL? ¿Y cómo se pueden utilizar de forma eficiente? En este artículo, te guiaré a través de los diferentes tipos de subconsultas y las situaciones típicas en las que son útiles.

¿Qué es una subconsulta SQL?

Una subconsulta, o consulta anidada, es una consulta colocada dentro de otra consulta SQL. Hay muchos escenarios diferentes en los que puede querer incluir una consulta en las cláusulas WHERE, FROM o SELECT de su consulta principal.

Siempre es más fácil comprender nuevos conceptos cuando se presentan con ejemplos. Así que, ¡comencemos! Imaginemos que gestionamos varias galerías de arte y tenemos las siguientes tablas en nuestra base de datos:

galleries

idcity
1London
2New York
3Munich

paintings

idnamegallery_idprice
1Patterns35000
2Ringer14500
3Gift13200
4Violin Lessons26700
5Curiosity29800

sales_agents

idlast_namefirst_namegallery_idagency_fee
1BrownDenis22250
2WhiteKate33120
3BlackSarah21640
4SmithHelen14500
5StewartTom32130

managers

idgallery_id
12
23
41

Uno de los casos de uso más sencillos de la subconsulta es incluirla en la cláusula WHERE para filtrar los resultados. Por ejemplo, si quiere ver información sobre sólo los agentes de ventas que recibieron una comisión de agencia superior a la media el mes pasado, podría utilizar la siguiente consulta SQL:

SELECT *
FROM sales_agents
WHERE agency_fee > 
(SELECT AVG(agency_fee)
 FROM sales_agents);

Aquí, su subconsulta calcula la comisión media de agencia que recibió su equipo de ventas el mes pasado y devuelve un único valor (2728 dólares). A continuación, utiliza este valor para filtrar los resultados de la consulta principal y devolver la información sólo de aquellos agentes de ventas cuyos honorarios de agencia fueron superiores a la media:

idlast_namefirst_namegallery_idagency_fee
2WhiteKate33120
4SmithHelen14500

Las subconsultas SQL pueden devolver valores individuales o tablas completas. Puede haber subconsultas anidadas o subconsultas correlacionadas. Cada uno de estos tipos de subconsultas funciona bien para determinados casos de uso. Si quieres información más detallada sobre esto, lee nuestra guía para principiantes sobre subconsultas SQL. En este artículo, proporcionaré ejemplos de diferentes tipos de subconsultas en SQL y te guiaré a través de los escenarios típicos en los que este tipo de subconsulta es particularmente útil.

Subconsultas Escalares

Cuando una subconsulta devuelve un solo valor, o exactamente una fila y exactamente una columna, la llamamos subconsulta escalar. Este tipo de subconsulta se utiliza con frecuencia en la cláusula WHERE para filtrar los resultados de la consulta principal. La subconsulta de nuestro ejemplo anterior es una subconsulta escalar, ya que devuelve un único valor (es decir, la tarifa media de la agencia).

Las subconsultas escalares también pueden utilizarse en la sentencia SELECT de la consulta principal. Por ejemplo, digamos que queremos ver el precio medio de todos nuestros cuadros junto al precio de cada cuadro.

SELECT name AS painting,
	 price,
	 (SELECT AVG(price)
  FROM paintings) AS avg_price
FROM paintings;

En este caso, la subconsulta devuelve un valor escalar (5840 dólares) que simplemente se añade a cada fila de la tabla resultante:

paintingpriceavg_price
Patterns50005840
Ringer45005840
Gift32005840
Violin Lessons67005840
Curiosity98005840

Observe que la subconsulta (también llamada consulta interna) en este ejemplo es totalmente independiente de la consulta principal (también llamada consulta externa) - puede ejecutar la consulta interna por sí sola y obtener un resultado significativo.

Subconsultas de varias filas

Si su subconsulta devuelve más de una fila, puede denominarse subconsulta de varias filas. Tenga en cuenta que este tipo de subconsulta incluye (1) subconsultas que devuelven una columna con múltiples filas (es decir, una lista de valores) y (2) subconsultas que devuelven múltiples columnas con múltiples filas (es decir, tablas).

Las subconsultas que devuelven una columna y varias filas suelen incluirse en la cláusula WHERE para filtrar los resultados de la consulta principal. En este caso, suelen utilizarse con operadores como IN, NOT IN, ANY, ALL, EXISTS o NOT EXISTS que permiten comparar un valor concreto con los valores de la lista devuelta por la subconsulta.

¿Quiere saber más sobre las subconsultas SQL con el operador IN? Vea un episodio de nuestra serie We Learn SQL en Youtube. Recuerda suscribirte a nuestro canal.

Por ejemplo, digamos que quiere calcular el promedio de los honorarios de los agentes que no son gerentes. Puede utilizar la siguiente subconsulta para responder a esta pregunta:

SELECT AVG(agency_fee)
FROM sales_agents
WHERE id NOT IN (SELECT id
                 FROM managers);

La consulta interna devolverá una lista de todos los ID de gestores. A continuación, la consulta externa filtra sólo los agentes de ventas que no están en la lista de gerentes y calcula una comisión media de agencia pagada a estos agentes. La consulta devuelve un único valor: la comisión media de agencia pagada a los no gestores (1885 dólares).

Consulte nuestra guía de subconsultas SQL para ver más ejemplos de subconsultas de varias filas.

Subconsultas correlacionadas

También existen subconsultas SQL en las que la consulta interna se basa en la información obtenida de la consulta externa. Estas son subconsultas correlacionadas. Debido a la interdependencia entre la consulta principal y la interna, este tipo de subconsulta puede ser más difícil de entender. Lea esta guía para principiantes para ser más hábil con las subconsultas correlacionadas en SQL.

Una vez más, vayamos directamente a los ejemplos. Las subconsultas correlacionadas se utilizan comúnmente en las sentencias SELECT, WHERE y FROM.

Si queremos calcular el número de cuadros encontrados en cada una de nuestras galerías, podemos utilizar la siguiente consulta. Observe la subconsulta correlacionada en la sentencia SELECT:

SELECT city, 
 (SELECT count(*)
  FROM paintings p
  WHERE g.id = p.gallery_id) total_paintings
FROM galleries g;

Aquí, la subconsulta devuelve un valor escalar con el número total de cuadros en la galería correspondiente. La consulta principal muestra esta información junto con la ciudad donde se encuentra esa galería de arte.

citytotal_paintings
London2
New York2
Munich1

También puedes ver que, en contraste con nuestros ejemplos anteriores, aquí la consulta interna depende de la consulta externa. Sacamos el ID de la galería de la tabla galleries que está en la consulta externa. En otras palabras, no se puede ejecutar la consulta interna como una consulta independiente - sólo arrojará un error.

Observe también que, en este caso, podría utilizar JOIN en lugar de una subconsulta y obtener el mismo resultado:

SELECT g.city, count(p.name) AS total_paintings
FROM galleries g
JOIN paintings p
ON g.id = p.gallery_id
GROUP BY g.city;

Los JOIN suelen ser más rápidos que las subconsultas. Sin embargo, si encuentra que las subconsultas son más intuitivas para su caso particular, está bien usarlas. Puede leer más sobre el uso de subconsultas vs. JOINs en nuestra guía completa.

Por último, las subconsultas correlacionadas también pueden utilizarse en la sentencia WHERE. Por ejemplo, digamos que queremos obtener información sobre aquellos agentes de ventas cuyos honorarios de agencia fueron iguales o superiores a los honorarios medios de su galería. Podemos ejecutar la siguiente consulta para obtener el resultado deseado:

SELECT last_name, 
       first_name, 
       agency_fee
FROM sales_agents sa1
WHERE sa1.agency_fee >= (SELECT avg(agency_fee)
                         FROM sales_agents sa2 
                         WHERE sa2.gallery_id = sa1.gallery_id);

La consulta interna, en este caso, devuelve la tarifa media de la galería del agente de ventas correspondiente. La consulta externa devuelve la información sólo de aquellos agentes de venta que cumplen la condición incluida en la sentencia WHERE (es decir, una comisión de agencia igual o superior a la media de su galería).

last_namefirst_nameagency_fee
BrownDenis2250
WhiteKate3120
SmithHelen4500

De nuevo, la subconsulta de este ejemplo es una subconsulta correlacionada, ya que no puede ejecutarse independientemente de la consulta externa. Si quiere saber más, consulte este sencillo tutorial sobre cómo escribir subconsultas correlacionadas.

Aunque los diferentes tipos de subconsultas SQL cubren muchas situaciones típicas, hay algunos casos en los que puede querer utilizar expresiones de tabla comunes (CTE) en lugar de subconsultas. Si estás interesado en aprender más sobre las CTEs, revisa este artículo que te guiará a través de las diferencias entre las subconsultas y las CTEs.

Hora de Practicar los Diferentes Tipos de Subconsultas SQL

Ha aprendido que hay muchos tipos de subconsultas en SQL. Dependiendo de la tarea a realizar, puede aplicar subconsultas escalares, de varias filas o correlacionadas para obtener el resultado que necesita.

Ya hemos visto varios ejemplos de subconsultas y hemos descubierto dónde se pueden utilizar. Sin embargo, para convertirte en un usuario de SQL realmente poderoso, necesitas más práctica con los diferentes tipos de subconsultas. Es hora de realizar ejercicios interactivos.

Nuestro curso SQL para principiantes tiene una sección muy completa sobre las subconsultas, en la que se combinan explicaciones y ejemplos detallados con docenas de ejercicios. ¡Compruébalo! Para obtener práctica adicional, también recomiendo completar la sección de subconsultas en el curso Ejercicios prácticos de SQL.

Más práctica = más consultas SQL profesionales. ¡Feliz aprendizaje!