Resuelvo 3 ejercicios de SQL en LeetCode
En este tutorial resolvemos tres problemas clásicos de SQL en LeetCode: uno con JOIN entre dos tablas, otro con self JOIN (misma tabla dos veces) y uno con GROUP BY + HAVING para duplicados. La idea es que veas cómo armar la lógica cuando te plantean algo similar en entrevistas o en el día a día.
Ejercicio 1: Person y Address (LEFT JOIN)
Enunciado
Reportar first name, last name, city y state de cada persona. Si una persona no tiene dirección, igual debe aparecer con NULL en city/state.
Tablas
| Tabla | Rol |
|---|---|
Person | Personas (PersonId, FirstName, LastName) |
Address | Direcciones (AddressId, PersonId, City, State) |
La relación es Person.PersonId = Address.PersonId.
Paso 1: JOIN básico (incompleto)
SELECT *
FROM Person P
JOIN Address A
ON P.PersonId = A.PersonId;
Esto une filas que existen en ambas tablas, pero:
- Devuelve demasiadas columnas (
PersonId,AddressId…). - Con
INNER JOINno aparecen personas sin dirección (ej. Allen con NULL).
Paso 2: Elegir solo las columnas pedidas
SELECT
P.FirstName,
P.LastName,
A.City,
A.State
FROM Person P
JOIN Address A
ON P.PersonId = A.PersonId;
Sigue faltando a quien no tiene address.
Solución: LEFT JOIN
SELECT
P.FirstName,
P.LastName,
A.City,
A.State
FROM Person P
LEFT JOIN Address A
ON P.PersonId = A.PersonId;
LEFT JOIN trae toda la tabla izquierda (Person) y, si no hay match en Address, rellena con NULL — exactamente lo que pide el enunciado.
Ejercicio 2: Empleados que ganan más que su manager
Enunciado
Título típico en LeetCode: Employees Earning More Than Their Managers.
Devolver una columna llamada employee con el nombre del empleado cuyo salario es mayor que el de su manager.
Tabla Employee
Columnas habituales: id, name, salary, managerId.
- Quienes tienen
managerIdNULL suelen ser managers (Sam, Max). - Joe y Henry son empleados con manager asignado.
Paso 1: Ver la tabla
SELECT * FROM Employee;
Paso 2: Self JOIN (la misma tabla dos veces)
Tratamos la tabla como dos roles:
E→ empleadoM→ manager
SELECT *
FROM Employee E
JOIN Employee M
ON E.managerId = M.id;
Esto empareja cada empleado con su manager (no con todos los managers del mundo).
Paso 3: Filtrar por salario
SELECT *
FROM Employee E
JOIN Employee M
ON E.managerId = M.id
WHERE E.salary > M.salary;
Solo quedan empleados que ganan más que su jefe directo.
Solución final (columna employee)
LeetCode pide el alias exacto employee (en MySQL/LeetCode se usa AS):
SELECT E.name AS employee
FROM Employee E
JOIN Employee M
ON E.managerId = M.id
WHERE E.salary > M.salary;
Repaso mental
- Alias
EyMsobre la misma tabla. ON E.managerId = M.id→ enlazar empleado con su manager.WHERE E.salary > M.salary→ condición de negocio.SELECT E.name AS employee→ formato del output.
Ejercicio 3: Emails duplicados
Enunciado
Duplicate Emails: devolver una columna email (con alias vía AS) con los correos que aparecen más de una vez en Person.
No hace falta JOIN: es agregación + filtro sobre grupos.
Idea
- Agrupar por
email. - Contar cuántas filas hay por email.
- Quedarse solo con los que tienen count > 1.
WHERE no sirve después de agrupar para esto; en SQL usás HAVING (el “WHERE del GROUP BY”).
Solución
SELECT email AS email
FROM Person
GROUP BY email
HAVING COUNT(*) > 1;
Variante equivalente mostrando el conteo (útil mientras practicás):
SELECT email, COUNT(*) AS total
FROM Person
GROUP BY email
HAVING COUNT(*) > 1;
Para LeetCode, la primera versión alcanza: solo la columna email duplicada.
Por qué funciona
| Paso | Qué hace |
|---|---|
GROUP BY email | Junta filas con el mismo correo |
COUNT(*) | Cuenta cuántas personas comparten ese email |
HAVING COUNT(*) > 1 | Deja solo emails repetidos |
Comparativa rápida de los 3 ejercicios
| # | Técnica | Cuándo usarla |
|---|---|---|
| 1 | LEFT JOIN | Traer filas de la tabla A aunque no existan en B |
| 2 | Self JOIN + WHERE | Comparar filas dentro de la misma tabla (empleado vs manager) |
| 3 | GROUP BY + HAVING | Detectar duplicados o agregados por grupo |
Próximos pasos
- Resolvé los tres en LeetCode y compará tu output con el esperado antes de
Submit. - Repasá JOIN desde cero si querés afianzar INNER, LEFT y FULL.
- Mirá el video completo en YouTube.
Si te sirven este tipo de ejercicios, en el canal seguimos con más SQL y lógica aplicada a entrevistas y trabajo real.