> lección 6/18 · 16 min

LEFT JOIN: no perder filas

Concepto

El JOIN de la lección anterior (se llama INNER JOIN) solo deja las filas que encuentran pareja en las dos tablas. Muchas veces eso es justo lo que no quieres: si preguntas "¿qué cursos tienen inscritos?", el curso sin inscritos es parte de la respuesta.

Sintaxis
SELECT a.columna, b.columna
FROM tabla_a AS a
LEFT JOIN tabla_b AS b ON b.a_id = a.id;

LEFT JOIN conserva la tabla de la izquierda. Todas las filas de la tabla que escribes en FROM quedan en el resultado. Las que no encuentran pareja aparecen con NULL (vacío) en las columnas de la otra tabla.

SELECT c.titulo, i.id AS inscripcion
FROM cursos AS c
LEFT JOIN inscripciones AS i ON i.curso_id = c.id;

Ejecútalo y busca "Python para análisis": aparece con la inscripción vacía, porque nadie se ha inscrito. Con JOIN a secas, ese curso desaparecería sin aviso.

Qué tabla va a la izquierda. La que no quieres perder. "Todos los cursos, con sus inscripciones si tienen" pone cursos en el FROM.

Varios LEFT JOIN. Si encadenas tablas, cada paso tiene que ser LEFT JOIN. Si el segundo es un JOIN normal, vuelve a descartar las filas que el primero había conservado, porque su NULL no calza con nada.

Contar las filas. Una forma rápida de ver la diferencia: cuenta las filas con JOIN y con LEFT JOIN. Si son iguales, no había nada que perder; si no, la diferencia son los registros sin pareja.

> tarea SQL

Lista a todos los estudiantes con el título de cada curso en que están inscritos. No pierdas a quienes todavía no se inscriben en ningún curso. Muestra nombre y titulo, ordenados por nombre y, si se repite el nombre, por título.

Tablas disponibles
  • cursos: id, titulo, nivel, horas
  • estudiantes: id, nombre, correo, edad, ciudad
  • inscripciones: id, estudiante_id, curso_id, nota, estado

Primero intenta: las pistas aparecen después de 2 intentos con un resultado incorrecto (los errores de código no cuentan). Llevas 0.

Aprueba las tareas de esta lección para ver el cierre.