Ir al contenido
wannacode

Subconsultas

En resumen: Una subconsulta es un SELECT dentro de otra consulta que devuelve un valor o una lista para WHERE y se usa con IN, EXISTS o NOT EXISTS.

Problema

Por encima del promedio

La gerencia quiere ver los productos que cuestan más que el precio promedio de la tienda. Ya conoces dos consultas: una encuentra el precio promedio y la otra busca productos por encima de un número dado.

Podrías ejecutar la primera, copiar el número y ejecutar la segunda. Pero mañana los precios serán otros, y el número copiado estará desactualizado.

La idea

Subconsulta

Primero, el precio promedio:

SQLbase de datos: tienda

Ahora la misma consulta, entre paréntesis, en lugar del número:

SQLbase de datos: tienda

Una consulta entre paréntesis dentro de otra consulta se llama subconsulta (subquery). La base de datos la ejecuta primero, obtiene 7,036 y luego revisa cada producto con price > 7.036. Salen ocho productos.

Esta subconsulta devuelve un número, así que va donde iría un número.

Más precisamente, para curiosos

Si una subconsulta dentro de una comparación devuelve varias filas, SQLite toma en silencio la primera. La categoría 8 («Cocina») tiene tres productos, pero la consulta compara con uno solo:

SQLbase de datos: tienda

No se promete cuál fila es «la primera». PostgreSQL y SQL Server dan un error en este caso: la subconsulta devolvió más de una fila. Si una subconsulta puede devolver varias filas, usa IN.

Pruébalo

Más caro que el kashkaval

Muestra el nombre y el precio de los productos que cuestan más que el queso kashkaval. No escribas su precio a mano: obtenlo con una subconsulta.

SQLbase de datos: tienda

La idea

IN con una lista que sale de una consulta

Ya conoces IN con una lista escrita a mano: city IN ('Varna', 'Burgas'). La lista también puede venir de una subconsulta.

¿Qué clientes hicieron pedidos en octubre de 2026? Sus números están en orders y sus nombres en customers:

SQLbase de datos: tienda

La subconsulta devuelve los números de los clientes con pedidos desde el 1 de octubre. La consulta exterior muestra los clientes cuyo id está en esa lista.

Las subconsultas se pueden anidar unas dentro de otras. Cada paso es una consulta aparte que puedes ejecutar y comprobar por sí sola.

Pruébalo

Quién compra café

El proveedor de café lanza un sabor nuevo y quiere escribir a las personas que ya compraron «Café en grano». Muestra sus nombres. El campo empieza con el primer paso: el número del producto.

SQLbase de datos: tienda

La idea

EXISTS

A veces no te importa qué devuelve la subconsulta, sino solo si devuelve algo. ¿Qué clientes todavía no tienen pedidos?

SQLbase de datos: tienda

EXISTS (…) es verdadero si la subconsulta devuelve al menos una fila. NOT EXISTS es lo contrario. Lo que va después de SELECT en la subconsulta no importa, por eso es SELECT 1.

Aquí la subconsulta mira la fila exterior: o.customer_id = c.id, donde c es el cliente que la consulta exterior está revisando en ese momento. Es una idea nueva, y la próxima lección la mira de cerca.

Míralo

NOT IN y un solo NULL

La gerencia está ordenando el menú del sitio web y pregunta qué categorías no tienen ningún producto. Espera «Alimentos» y «Hogar»: ahí solo hay subcategorías. Este es el primer intento:

SQLbase de datos: tienda
1. ¿Por qué NOT IN no devolvió nada en lugar de «Alimentos» y «Hogar»?

Es la trampa de la lección de NULL, pero ahora NULL viene de la subconsulta y no se ve en la consulta. NOT EXISTS no compara valores: pregunta si existe tal producto, y NULL no le estorba:

SQLbase de datos: tienda

Cuando la subconsulta recorre una columna que puede ser NULL, usa NOT EXISTS o añade WHERE category_id IS NOT NULL a la subconsulta.

Ejercicio

Dos tareas

1. El equipo de calidad quiere llamar a los clientes que tienen al menos un pedido cancelado.

Muestra los nombres de los clientes con al menos un pedido cancelado.

SQLbase de datos: tienda

2. Marketing prepara una campaña «Escribe una reseña» para los productos que nadie ha reseñado todavía.

Muestra los nombres de los productos sin una sola reseña (la tabla reviews).

SQLbase de datos: tienda

Test

Ponte a prueba

1. ¿Qué debe devolver la subconsulta en WHERE price > (…)?
2. ¿Qué comprueba EXISTS (subconsulta)?
3. La subconsulta de NOT IN (…) puede devolver NULL. ¿Qué es más seguro?
4. ¿Por qué WHERE price > (SELECT AVG(price) FROM products) es mejor que WHERE price > 7.036?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·