Emular operaciones de conjuntos con joins
Reescriba EXCEPT e INTERSECT en dialectos que no los admiten
Emular operaciones de conjuntos con joins es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Por qué emular las operaciones de conjuntos
No todas las bases de datos admiten INTERSECT y EXCEPT. Por ejemplo, las versiones antiguas de MySQL no los admitían en absoluto. Los entrevistadores comprueban si puede reproducir la lógica de conjuntos con combinaciones y subconsultas cuando el operador no está disponible.
Conocer tanto el operador de conjuntos como su equivalente con combinaciones demuestra que entiende lo que calcula realmente el operador.
INTERSECT como INNER JOIN
INTERSECT encuentra las filas comunes a ambos conjuntos. El equivalente mediante una combinación es un INNER JOIN sobre todas las columnas comparadas, además de DISTINCT para reproducir el comportamiento de eliminación de duplicados.
Cada columna de la comparación pasa a formar parte del predicado de la combinación.
-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
ON a.customer_id = b.customer_id;Por qué se necesita DISTINCT para INTERSECT
Un INNER JOIN simple puede multiplicar filas: si un valor aparece varias veces en cualquiera de los dos lados, la combinación multiplica las filas. El INTERSECT estándar devuelve cada fila común una sola vez, por lo que debe añadir DISTINCT para eliminar los duplicados que introduce la combinación.
Olvidar DISTINCT en este caso es un error habitual en las entrevistas.
-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the joinEXCEPT como LEFT JOIN / IS NULL
EXCEPT (A pero no B) es el anti-join. La forma portable consiste en hacer un LEFT JOIN de A con B usando todas las columnas, conservar solo las filas en las que el lado de B sea NULL (sin coincidencia) y aplicar después DISTINCT.
Este patrón LEFT JOIN / IS NULL es uno de los trucos más reutilizados en las entrevistas de SQL.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;EXCEPT con NOT EXISTS
Un EXCEPT igual de portable utiliza NOT EXISTS. Se interpreta como «conservar cada fila de A para la que no exista ninguna fila coincidente de B» y gestiona los NULL de forma robusta.
Muchos ingenieros prefieren NOT EXISTS porque su intención es explícita y evita la trampa de NOT IN + NULL.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);INTERSECT con EXISTS
De forma simétrica, INTERSECT puede escribirse con EXISTS: conserve cada fila distinta de A para la que exista una fila coincidente de B.
EXISTS se detiene al encontrar la primera coincidencia, por lo que puede ser eficiente y evita la multiplicación de filas del join; a veces incluso elimina la necesidad de usar DISTINCT en el lado del join.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);La trampa de NULL con NOT IN
Una emulación tentadora de EXCEPT es NOT IN, pero resulta peligrosa: si la subconsulta devuelve cualquier NULL, NOT IN no devuelve ninguna fila porque la comparación pasa a ser UNKNOWN.
Esta es una trampa muy habitual en las entrevistas. Prefiera NOT EXISTS o LEFT JOIN / IS NULL, que son seguros frente a NULL.
-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
SELECT customer_id FROM orders_2024
);Coincidencias en varias columnas
Cuando la comparación de conjuntos abarca varias columnas, todas deben participar en el predicado del join. En un anti-join también debe gestionar la posibilidad de que esas columnas contengan NULL, que es precisamente donde NOT EXISTS destaca.
Especifique cada columna en la cláusula ON; omitir una cambia silenciosamente el significado de «fila igual».
SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;Emular UNION sin el operador
UNION ALL es simplemente una concatenación, que todos los dialectos admiten directamente. Para emular UNION con eliminación de duplicados cuando sea necesario, concatene mediante UNION ALL dentro de una subconsulta y envuélvalo con SELECT DISTINCT o con GROUP BY de todas las columnas.
Esto demuestra que UNION no es más que UNION ALL seguido de un paso de eliminación de duplicados.
SELECT DISTINCT * FROM (
SELECT city FROM a
UNION ALL
SELECT city FROM b
) combined;Elegir la emulación adecuada
Guía para decidir:
- INTERSECT →
EXISTSo INNER JOIN + DISTINCT. - EXCEPT →
NOT EXISTSo LEFT JOIN / IS NULL. - Evite
NOT INcuando pueda haber NULL. - UNION → UNION ALL envuelto en DISTINCT.
EXISTS / NOT EXISTS son las opciones más portables y seguras frente a NULL, por lo que constituyen las respuestas más seguras en una entrevista.
Cómo encaja todo
Poder traducir los operadores de conjuntos a joins demuestra que los entiende como lógica de conjuntos, no solo como sintaxis. El anti-join (LEFT JOIN / IS NULL o NOT EXISTS) es el patrón de mayor valor: aparece al emular EXCEPT, al buscar filas huérfanas y en preguntas sobre registros faltantes.
Dé prioridad a NOT EXISTS por corrección y mencione después la forma con join para hablar del rendimiento.
Comprobación rápida
Su base de datos no admite EXCEPT. Necesita los customer_ids de orders_2023 que no estén en orders_2024, y la columna puede contener NULL.
Resumen
Conclusiones clave:
INTERSECT→ INNER JOIN + DISTINCT, oEXISTS.EXCEPT→ LEFT JOIN / IS NULL, oNOT EXISTS(anti-join).- Añada
DISTINCTpara reproducir el comportamiento de eliminación de duplicados de los operadores de conjuntos y controlar la multiplicación de filas del join. - Evite
NOT INcuando pueda haber NULL; prefiera NOT EXISTS. UNION= UNION ALL envuelto en DISTINCT.
Preguntas frecuentes
¿La lección «Emular operaciones de conjuntos con joins» es gratis?
Sí — el texto completo de «Emular operaciones de conjuntos con joins» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Emular operaciones de conjuntos con joins»?
Reescriba EXCEPT e INTERSECT en dialectos que no los admiten Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Emular operaciones de conjuntos con joins»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- UNION frente a UNION ALL
- Compatibilidad de cantidad y tipos de columnas
- INTERSECT y EXCEPT para comparar
- Emular operaciones de conjuntos con joins