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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clave foránea | un campo que guarda la clave primaria de otra tabla; también se llama clave ajena | category_id |
| Relación | el vínculo entre dos tablas por una clave | |
| JOIN | unir los registros de dos tablas que coinciden | |
| ON | la condición que dice qué registros se unen | a.id = b.a_id |
| Alias | un nombre corto que das a una tabla en la consulta | p |
| LEFT JOIN | una 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
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe 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
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
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
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: name | products: category_id | categories: id | categories: name |
|---|---|---|---|
| The Little Prince | 1 | 1 | Books |
| Kite | 8 | 8 | Toys |
| Trowel | 3 | 3 | Garden |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Los juguetes, con el nombre de su categoría
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
-- 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
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
-- 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
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.