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

5 Ejemplos de Subconsultas SQL

Las subconsultas SQL son herramientas básicas si quieres comunicarte eficazmente con las bases de datos relacionales. En este artículo, proporciono cinco ejemplos de subconsultas que demuestran cómo utilizar subconsultas escalares, de varias filas y correlacionadas en las cláusulas WHERE, FROM/JOIN y SELECT.

Una subconsulta, o consulta anidada, es una consulta colocada dentro de otra consulta SQL. Al solicitar información de una base de datos, puede ser necesario incluir una subconsulta en la cláusula SELECT, FROM, JOIN, o WHERE. Sin embargo, también puede utilizar subconsultas al actualizar la base de datos (es decir, en las sentencias INSERT, UPDATE, y DELETE ).

Existen varios tipos de subconsultas SQL:

  • Las subconsultasescalares devuelven un solo valor, o exactamente una fila y exactamente una columna.
  • Las subconsultas de varias filas devuelven
    • Una columna con múltiples filas (es decir, una lista de valores), o
    • Varias columnas con varias filas (es decir, tablas).
  • Subconsultas correlacionadas, en las que la consulta interna se basa en la información obtenida de la consulta externa.

Puedes leer más sobre los diferentes tipos de subconsultas SQL en otro lugar; aquí quiero centrarme en los ejemplos. Como todos sabemos, siempre es más fácil comprender nuevos conceptos con casos de uso del mundo real. Así que empecemos.

5 ejemplos de subconsultas en SQL

Supongamos que tenemos una galería de arte. Tenemos una base de datos con cuatro tablas: paintings, artists, collectors, y sales. A continuación puede ver los datos almacenados en cada tabla.

paintings
idnameartist_idlisted_price
11Miracle1300.00
12Sunshine1700.00
13Pretty woman22800.00
14Handsome man22300.00
15Barbie3250.00
16Cool painting35000.00
17Black square #1000350.00
18Mountains41300.00

artists
idfirst_namelast_name
1ThomasBlack
2KateSmith
3NataliWein
4FrancescoBenelli

collectors
idfirst_namelast_name
101BrandonCooper
102LauraFisher
103ChristinaBuffet
104SteveStevenson

sales
iddatepainting_idartist_idcollector_idsales_price
10012021-11-011321042500.00
10022021-11-101421022300.00
10032021-11-10111102300.00
10042021-11-151631034000.00
10052021-11-22153103200.00
10062021-11-2217310350.00

Ahora vamos a explorar estos datos usando consultas SQL con diferentes tipos de subconsultas.

Ejemplo 1 - Subconsulta Escalar

Empezaremos con un ejemplo sencillo: Queremos listar los cuadros que tienen un precio superior a la media. Básicamente, queremos obtener los nombres de los cuadros junto con los precios listados, pero sólo para los que cuestan más que la media. Esto significa que primero tenemos que encontrar este precio medio; aquí es donde entra en juego la subconsulta escalar:

SELECT name, listed_price
FROM paintings
WHERE listed_price > (
    SELECT AVG(listed_price)
    FROM paintings
);

Nuestra subconsulta se encuentra en la cláusula WHERE, donde filtra el conjunto de resultados en función del precio de la lista. Esta subconsulta devuelve un único valor: el precio medio por cuadro de nuestra galería. Cada precio listado se compara con este valor, y sólo los cuadros que tienen un precio superior a la media llegan a la salida final:

namelisted_price
Pretty woman2800.00
Handsome man2300.00
Cool painting5000.00

Si esto le parece un poco complicado, puede consultar nuestro curso interactivo SQL para principiantes y repasar sus conocimientos esenciales de SQL.

Ejemplo 2 - Subconsulta de varias filas

Ahora veamos las subconsultas que devuelven una columna con múltiples filas. Estas subconsultas suelen incluirse en la cláusula WHERE para filtrar los resultados de la consulta principal.

Supongamos que queremos listar todos los coleccionistas que han comprado cuadros en nuestra galería. Podemos obtener el resultado necesario utilizando una subconsulta de varias filas. En concreto, podemos utilizar una consulta interna para enumerar todos los ID de los coleccionistas presentes en la tabla sales que corresponden a los coleccionistas que han realizado al menos una compra en nuestra galería. A continuación, en la consulta externa, solicitamos el nombre y los apellidos de todos los coleccionistas cuyo ID esté en la salida de la consulta interna. Este es el código:

SELECT first_name, last_name
FROM collectors
WHERE id IN (
    SELECT collector_id
    FROM sales
);

Y aquí está la salida:

first_namelast_name
LauraFisher
ChristinaBuffet
SteveStevenson

Curiosamente, podríamos obtener el mismo resultado sin una subconsulta utilizando una INNER JOIN (o simplemente JOIN). Este tipo de unión sólo devuelve los registros que pueden encontrarse en ambas tablas. Así, si unimos la tabla collectors y la tabla sales obtendremos una lista de colectores con los registros correspondientes en la tabla sales tabla. Nota: Aquí también he utilizado la palabra clave DISTINCT para eliminar los duplicados de la salida.

Esta es la consulta:

SELECT DISTINCT collectors.first_name, collectors.last_name
FROM collectors
JOIN sales
  ON collectors.id = sales.collector_id;

Puede leer más sobre la elección de la subconsulta frente al JOIN en otra parte de nuestro blog.

Ejemplo 3 - Subconsulta de varias filas con múltiples columnas

Cuando una subconsulta devuelve una tabla con múltiples filas y múltiples columnas, esa subconsulta se encuentra generalmente en la cláusula FROM o JOIN. Esto permite obtener una tabla con datos que no estaban disponibles en la base de datos (por ejemplo, datos agrupados) y luego unir esta tabla con otra de la base de datos, si es necesario.

Digamos que queremos ver el importe total de las ventas de cada artista que ha vendido al menos un cuadro en nuestra galería. Podemos empezar con una subconsulta que se base en la tabla sales y calcule el importe total de las ventas de cada ID de artista. Luego, en la consulta externa, combinamos esta información con los nombres y apellidos de los artistas para obtener el resultado deseado:

SELECT
  artists.first_name, 
  artists.last_name, 
  artist_sales.sales
FROM artists
JOIN (
    SELECT artist_id, SUM(sales_price) AS sales
    FROM sales
    GROUP BY artist_id
  ) AS artist_sales
  ON artists.id = artist_sales.artist_id;

Asignamos un alias significativo a la salida de nuestra subconsulta (artist_sales). De esta manera, podemos referirnos fácilmente a ella en la consulta externa, al seleccionar la columna de esta tabla, y al definir la condición de unión en la cláusula ON. Nota: Las bases de datos arrojarán un error si no se proporciona un alias para la salida de la subconsulta.

Este es el resultado de la consulta:

first_namelast_namesales
ThomasBlack300
KateSmith4800
NataliWein4250

Así, en una breve consulta SQL, pudimos calcular las ventas totales de cada artista basándonos en los datos brutos de una tabla (sales), y luego unir este resultado con los datos de otra tabla (artists).

Las subconsultas pueden ser muy potentes cuando necesitamos combinar información de varias tablas. Veamos qué más podemos hacer con las subconsultas.

Ejemplo 4 - Subconsulta correlacionada

El siguiente ejemplo demostrará cómo las subconsultas:

  • Pueden utilizarse en la cláusula SELECT, y
  • Pueden estar correlacionadas (es decir, la consulta principal o externa se basa en la información obtenida de la consulta interna).

Para cada coleccionista, queremos calcular el número de cuadros comprados a través de nuestra galería. Para responder a esta pregunta, podemos utilizar una subconsulta que cuente el número de cuadros comprados por cada coleccionista. Esta es la consulta completa:

SELECT
  first_name, 
  last_name,
  (
    SELECT count(*) AS paintings
    FROM sales
    WHERE collectors.id = sales.collector_id
  )
FROM collectors;

Observe cómo la consulta interna de este ejemplo se ejecuta realmente para cada fila de la tabla collectors:

  • La subconsulta se coloca en la cláusula SELECT porque queremos tener una columna adicional con el número de cuadros comprados por el coleccionista correspondiente.
  • Para cada registro de la tabla collectors la subconsulta interna calcula el número total de cuadros comprados por un coleccionista con el ID correspondiente.

Este es el resultado:

first_namelast_namepaintings
BrandonCooper0
LauraFisher2
ChristinaBuffet3
SteveStevenson1

Como ve, la salida de la subconsulta (es decir, el número de cuadros) es diferente para cada registro y depende de la salida de la consulta externa (es decir, el coleccionista correspondiente). Por lo tanto, se trata de una subconsulta correlacionada.

Consulte esta guía si desea aprender a escribir subconsultas correlacionadas en SQL. Por ahora, veamos un ejemplo más de subconsulta correlacionada.

Ejemplo 5 - Subconsulta correlacionada

Esta vez, queremos mostrar los nombres y apellidos de los artistas que han tenido cero ventas con nuestra galería. Vamos a intentar realizar esta tarea utilizando una subconsulta correlacionada en la cláusula WHERE:

SELECT first_name, last_name
FROM artists
WHERE NOT EXISTS (
  SELECT *
  FROM sales
  WHERE sales.artist_id = artists.id
);

Esto es lo que ocurre en esta consulta:

  • La consulta externa enumera la información básica sobre los artistas, comprobando primero si hay registros correspondientes en la tabla sales
  • La consulta interna busca registros que se correspondan con el ID del artista que está siendo comprobado por la consulta externa.
  • Si no hay registros correspondientes, se añaden a la salida el nombre y el apellido del artista correspondiente:
first_namelast_name
FrancescoBenelli

En nuestro ejemplo, sólo tenemos un artista sin ninguna venta todavía. Esperemos que pronto consiga una.

¡Es hora de practicar las subconsultas SQL!

En este artículo, he cubierto varios ejemplos de subconsultas SQL para darle una comprensión general de cómo las subconsultas pueden ser aprovechadas en SQL. Sin embargo, a menudo las expresiones comunes de tabla (CTEs) pueden ser mejores que las subconsultas.

Si quieres practicar las subconsultas SQL y otros temas básicos de SQL, prueba nuestro SQL para principiantes curso interactivo. Incluye 129 desafíos de codificación sobre la consulta de múltiples tablas, la agregación y agrupación de datos, la unión de tablas, la escritura de subconsultas y mucho más.

¿Quieres convertirte en un maestro de SQL? Consulte nuestro curso de aprendizaje SQL de la A a la Z. Va más allá de lo básico e incluye 7 cursos interactivos que cubren las funciones estándar de SQL, el lenguaje de manipulación de datos (DML) de SQL, los informes básicos de SQL, las funciones de ventana, las expresiones comunes de tabla (CTE) y las extensiones GROUP BY.

Gracias por leer y ¡feliz aprendizaje!