Tipos de Subqueries y Ejemplos en SQL
Post

Tipos de Subqueries y Ejemplos en SQL

image

En mi constante batalla como desarrollador, me encuentro diariamente con innumerables consultas diseñadas para diversas bases de datos, cada una con cientos de tablas. Una excelente manera de refinar las consultas y limitar los datos es mediante el uso de subconsultas. A lo largo de mi breve trayectoria trabajando con SQL, he notado que los subqueries suelen representar un desafío, especialmente para aquellos que están dando sus primeros pasos en el lenguaje. Bueno, ciertamente ha sido mi caso.

Las subconsultas son fundamentales para delimitar los datos en tus consultas. Y aunque hasta hace poco, mi principal herramienta para consultar bases de datos era Entity Framework Core, ORM quien se encarga de la “traducción” entre el mundo de los objetos y el de las bases de datos relacionales (puedes leer sobre mis hazañas creando una base de datos con Code First y Entity Framework Core), siempre es genial aprender algo nuevo y enriquecer nuestros conocimientos en SQL.

Sin más preámbulos, estos ejemplos te ayudarán a entender mejor, paso a paso, lo que a veces parece ser un misterioso arte oscuro en SQL.

Qué es un Subquery o Subconsulta

En pocas palabras un subquery es una consulta dentro de otra consulta. Al solicitar información de una base de datos, puede resultar necesario incluir una subconsulta en las cláusulas SELECT, FROM, JOIN o WHERE. Sin embargo, también se pueden usar subconsultas al actualizar la base de datos (por ejemplo, en declaraciones INSERT, UPDATE y DELETE).

Existen varios tipos de subconsultas en SQL:

  1. Subconsultas escalares: Devuelven un único valor o exactamente una fila y una columna.
  2. Subconsultas de varias filas: Devuelven o bien una columna con múltiples filas (una lista de valores), o varias columnas con múltiples filas (tablas).
  3. Subconsultas correlativas: Donde la consulta interna depende de información obtenida de la consulta externa.

5 Ejemplos de Subconsultas en SQL

Imaginemos que gestionamos una agencia de publicidad y vendemos videos para marcas. Tenemos una base de datos con cuatro tablas: Videos, Editores, Marcas y Ventas. Puedes ver los datos almacenados en cada tabla en las imágenes:

Tabla: Videos

image

Tabla: Editores

image

Tabla: Marcas

image

Tabla: Ventas

image

Ahora, exploremos estos datos mediante consultas SQL con diferentes tipos de subconsultas.

Ejemplo 1 - Subconsulta Escalar

Comencemos con un ejemplo simple: Queremos listar los videos que tienen un precio superior al promedio. Básicamente, queremos obtener los nombres y precios listados de los videos, pero solo de aquellos que cuestan más que el promedio. Esto significa que primero necesitamos encontrar este precio promedio; aquí es donde entra en juego la subconsulta escalar:

1
2
3
4
5
6
SELECT nombre, precio_listado
FROM videos
WHERE precio_listado > (
    SELECT AVG(precio_listado)
    FROM videos
);

Resultados:

image

Nuestra subconsulta está en la cláusula WHERE, donde filtra el conjunto de resultados según el precio listado. Esta subconsulta devuelve un único valor: el precio promedio por video. Cada precio listado se compara con este valor y solo los videos que tienen un precio por encima del promedio llegan al resultado final.

Ejemplo 2 - Subconsulta de Varias Filas

Ahora veamos subconsultas que devuelven una columna con múltiples filas. Estas subconsultas se incluyen a menudo en la cláusula WHERE para filtrar los resultados de la consulta principal.

Supongamos que queremos listar todos los editores que realizaron al menos un video. Podemos obtener la salida necesaria utilizando una subconsulta de varias filas. Específicamente, podemos usar una subconsulta interna para listar todos los IDs de los editores presentes en la tabla de ventas; estos serían los IDs correspondientes a los editores que realizaron al menos una venta. Luego, en la consulta externa, solicitamos el primer nombre y el puesto de todos los editores cuyo ID está en la salida de la subconsulta interna. Aquí está el código:

1
2
3
4
5
6
SELECT DISTINCT editores.primer_nombre, editores.posicion
FROM editores
WHERE editores.id IN (
    SELECT DISTINCT ventas.editor_id
    FROM ventas
);

Resultados:

image

Curiosamente, podríamos obtener el mismo resultado sin una subconsulta utilizando un INNER JOIN (o simplemente JOIN). Este tipo de unión devuelve solo los registros que se pueden encontrar en ambas tablas. Entonces, si unimos las tablas de editores y ventas, obtendremos una lista de editores con registros correspondientes en la tabla de ventas. Nota: También he utilizado la palabra clave DISTINCT aquí para eliminar duplicados del resultado.

Aquí está la consulta:

1
2
3
4
SELECT DISTINCT editores.primer_nombre, editores.apellido
FROM editores
JOIN ventas
  ON editores.id = ventas.editor_id;

Puedes leer más sobre la elección entre subconsulta vs. JOIN en otro lugar de nuestro blog.

Ejemplo 3 - Subconsulta de Varias Filas con Múltiples Columnas

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

Digamos que queremos ver el monto total de ventas para cada editor que haya realizado al menos un video. Podemos comenzar con una subconsulta que se basa en la tabla de ventas y calcula el monto total de videos realizados para cada ID de editor. Luego, en la consulta externa, combinamos esta información con los nombres y posiciones de los editores para obtener la salida requerida:

1
2
3
4
5
6
7
8
9
10
11
SELECT
  editores.primer_nombre,
  editores.posicion,
  ventas_editor.ventas
FROM editores
JOIN (
    SELECT editor_id, SUM(precio_venta) AS ventas
    FROM ventas
    GROUP BY editor_id
) AS ventas_editor
ON editores.id = ventas_editor.editor_id;

Resultados:

image

Asignamos un alias significativo a la salida de nuestra subconsulta (ventas_editor). 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 proporcionas un alias para la salida de tu subconsulta.

Ejemplo 4 - Subconsulta Correlativa

El siguiente ejemplo demostrará cómo las subconsultas:

  1. Se pueden utilizar en la cláusula SELECT, y
  2. Pueden ser correlativas (es decir, la consulta principal o externa depende de información obtenida de la consulta interna).

Queremos calcular, para cada editor, el número de videos realizados a través de nuestra agencia de publicidad. Para responder a esta pregunta, podemos usar una subconsulta que cuente el número de videos realizados por cada editor. Aquí está la consulta completa:

1
2
3
4
5
6
7
8
9
SELECT
  primer_nombre,
  posicion,
  (
    SELECT COUNT(*) AS videos
    FROM ventas
    WHERE editores.id = ventas.editor_id
  )
FROM editores;

Resultados:

image

Ejemplo 5 - Subconsulta Correlativa

En esta ocasión, queremos mostrar los nombres y el puesto de los editores que no realizaron ningún video en nuestra agencia de publicidad. Intentemos lograr esta tarea utilizando una subconsulta correlativa en la cláusula WHERE:

1
2
3
4
5
6
7
SELECT primer_nombre, posicion
FROM editores
WHERE NOT EXISTS (
  SELECT *
  FROM ventas
  WHERE ventas.editor_id = editores.id
);

Resultados:

image

Esto es lo que sucede en esta consulta:

  • La consulta externa enumera información básica sobre los editores, verificando primero si hay registros correspondientes en las ventas.
  • La subconsulta interna busca registros que se correspondan con el ID del editor que se está comprobando actualmente en la consulta externa.
  • Si no hay registros correspondientes, se agregan el nombre y el puesto del editor correspondiente al resultado.

En nuestro ejemplo, solo tenemos un editor en posición freelance sin ningún video realizado hasta ahora; esperemos que lleguen más.


Recursos de Aprendizaje y Documentación Oficial

Documentación Oficial de SQL:

Tutoriales y Cursos en Línea:

  1. W3Schools SQL Tutorial:
  2. Codecademy SQL Courses:
  3. Khan Academy - Intro to SQL:
  4. Coursera - SQL for Everybody Specialization (University of Michigan):
  5. SQLZoo:

Comunidades y Foros:

Estos recursos proporcionan una variedad de opciones para aprender SQL, desde la documentación oficial hasta tutoriales interactivos y cursos en línea. También puedes participar en comunidades y foros para obtener ayuda y discutir preguntas relacionadas con SQL. ¡Qué nunca te fallen los queries!