Repaso
English
Bases de datos y SQLIntermedioDB-44

¿Qué consulta lista los clientes que NO tienen pedidos?

Opciones

  1. SELECT * FROM customers c WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id) (Opción correcta)
  2. SELECT * FROM customers c WHERE c.orders = 0 OR c.orders IS NULL OR c.order_count < 1
  3. SELECT * FROM customers c INNER JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULL
  4. SELECT c.* FROM customers c WHERE c.id NOT IN (SELECT o.id FROM orders o) AND c.active

Respuesta

SELECT * FROM customers c WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id)

Por qué

NOT EXISTS con una subconsulta correlacionada comprueba, para cada cliente, si alguna fila de pedido apunta a él. Si no hay ninguna, devuelve el cliente.

Equivalente: LEFT JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULL (anti-join).

Cuidado con NOT IN (subquery): si la subconsulta devuelve algún NULL, el resultado queda vacío. NOT EXISTS evita este problema.

SELECT c.*
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Recuerda

Clientes sin pedidos: LEFT JOIN ... IS NULL, o NOT EXISTS.

Términos clave

Practica esta pregunta en Repaso