¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo unir tablas con JOIN

Después de esta lección: Puedo unir dos tablas con JOIN para ver los datos de las dos a la vez.

Lección de 45 min7 comandosLaboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

El préstamo que solo dice un número

La tabla de préstamos de una biblioteca dice que el socio 12 se llevó el libro 7. Ni el nombre del socio ni el título del libro están ahí.

Esos datos viven en otras tablas. Un JOIN une las tablas por un número que tienen en común, y así una sola consulta muestra "Lucia se llevó Don Quijote".

Al terminar esta lección

Nota

Puedo unir dos tablas con JOIN para ver los datos de las dos a la vez.

Palabras clave

PalabraQué significaEjemplo
Clave foráneaun campo que guarda la clave primaria de otra tabla; también se llama clave ajenacategory_id
Relaciónel vínculo entre dos tablas por una clave
JOINunir los registros de dos tablas que coinciden
ONla condición que dice qué registros se unena.id = b.a_id
Aliasun nombre corto que das a una tabla en la consultap
LEFT JOINuna unión que conserva todos los registros de la tabla de la izquierda

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una clave foránea apunta a otra tabla

Un producto de la tienda pertenece a una categoría. La tabla de productos no copia el nombre de la categoría. Guarda su número, en el campo category_id.

Ese campo es una clave foránea: guarda la clave primaria de otra tabla. La base comprueba que ese número exista allí. Así se evita escribir el mismo dato en mil sitios.

Preparar el terminal

Nota

Con el laboratorio iniciado, ejecuta las dos líneas siguientes. Ya las usaste antes, y repetirlas no hace daño.

Aceptar el certificado del servidor

Comando
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un nombre corto para la tienda

Comando
alias sql='mariadb -h db -u student -pstudent shop -t -e'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un producto guarda un número de categoría

Comando
sql "SELECT id, name, category_id FROM products ORDER BY id LIMIT 3"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una categoría que no existe

Comando
sql "INSERT INTO products (name, category_id, supplier_id, price) VALUES ('Prueba', 99, 1, 1.00)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

JOIN une los registros que coinciden

Para ver el producto con el nombre de su categoría, une las dos tablas. Después de JOIN va la otra tabla. Después de ON va la condición: la clave foránea es igual a la clave primaria.

La base une cada producto con la categoría que tiene su número. Los alias acortan la consulta: products p te deja escribir p.name.

Ejemplo resuelto: unir tres productos con su categoría

products: nameproducts: category_idcategories: idcategories: name
The Little Prince11Books
Kite88Toys
Trowel33Garden

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Los juguetes, con el nombre de su categoría

Comando
sql "SELECT p.name, c.name AS category FROM products p JOIN categories c ON c.id = p.category_id WHERE c.name = 'Toys' ORDER BY p.name"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pruébalo: jugadores y equipos

Código: sql
-- Cada jugador, con el nombre de su equipo.
SELECT players.name, teams.name AS team
FROM players
JOIN teams ON teams.id = players.team_id
ORDER BY players.name;
-- Fíjate en que Dani no sale: no tiene equipo.
-- Añade WHERE teams.sport = 'Balonmano'.

LEFT JOIN conserva los que no tienen pareja

Dos productos de la tienda no tienen categoría: su category_id es NULL. Un JOIN normal los deja fuera, porque no encuentra pareja.

Un LEFT JOIN conserva todos los registros de la tabla de la izquierda. Donde no hay pareja, pone NULL.

Los productos sin categoría

Comando
sql "SELECT p.name, c.name AS category FROM products p LEFT JOIN categories c ON c.id = p.category_id WHERE c.id IS NULL ORDER BY p.name"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pruébalo: jugadores sin equipo

Código: sql
-- Todos los jugadores, tengan equipo o no.
SELECT players.name, teams.name AS team
FROM players
LEFT JOIN teams ON teams.id = players.team_id
ORDER BY players.name;
-- Ahora Dani sale, con un NULL donde iría el equipo.

Un error frecuente

Advertencia

Mucha gente cree que basta con nombrar las dos tablas. Sin ON, la base empareja cada registro con todos los del otro lado, y el resultado es enorme y falso. Escribe siempre la condición de unión.

Qué pasa sin la condición

Comando
sql "SELECT COUNT(*) AS filas FROM products, categories"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos: tres tablas

En la tienda, un pedido tiene un cliente, y el cliente tiene una ciudad. Escribe en papel una consulta que muestre la fecha de cada pedido y el apellido de su cliente.

Después compruébala en el laboratorio con orders y customers. Para tres tablas, pones un segundo JOIN detrás del primero.

Sobre este laboratorio y su código: Laboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.