Guia de Bases de Dades: Joins
Com abordar aquest problema
Aquí practiques el JOIN: combinar files de dues taules que estan relacionades per una clau. Una taula guarda només l'identificador de l'altra (una clau forana), i el JOIN serveix per "anar a buscar" la informació que hi ha a l'altra banda. A l'última pregunta també practiques el LEFT JOIN, que no perd les files sense parella.
La sintaxi que necessites
SELECT a.columna1, b.columna2
FROM taula_a a
INNER JOIN taula_b b ON a.clau_forana = b.clau_primaria
WHERE ...;
taula_a a: la lletra després del nom és un àlies; et permet escriurea.columnaen lloc del nom sencer.ON ...: diu quines files van juntes. Normalment s'iguala la clau forana d'una taula amb la clau primària de l'altra.INNER JOIN(o simplementJOIN) només conserva les files que tenen parella a les dues taules.LEFT JOINconserva totes les files de la taula de l'esquerra; si no tenen parella, les columnes de la dreta surten aNULL.
Pregunta per pregunta
Pregunta 1. La informació de la comanda i el nom de l'empresa són a taules diferents. Mira l'esquema: quina columna de orders identifica el client? Uneix les dues taules per aquesta relació i retorna dues columnes, primer l'identificador de comanda i després el nom.
Pregunta 2. La quantitat és a la taula de línies de comanda, però allà el producte només apareix com un número. Cal unir-la amb la taula de productes per obtenir-ne el nom, i filtrar per la comanda que et diuen amb un WHERE.
Pregunta 3. Aquí hi ha dues dificultats alhora: cal agrupar (GROUP BY) per client i comptar comandes, i a més han d'aparèixer els clients sense comandes. Pensa quina taula ha d'anar a l'esquerra perquè no es perdin, i què compta COUNT(*) respecte de COUNT(columna) quan la columna és NULL.
Un exemple semblant
Nom de cada producte amb el nom de la seva categoria:
SELECT p.product_name, c.category_name
FROM products p
INNER JOIN categories c ON p.category_id = c.category_id;
Nombre de productes de cada categoria, incloent-hi les categories sense cap producte:
SELECT c.category_name, COUNT(p.product_id)
FROM categories c
LEFT JOIN products p ON p.category_id = c.category_id
GROUP BY c.category_id, c.category_name;
Paranys habituals:
- Oblidar l'
ON(o posar-hi una condició equivocada): obtens un producte cartesià, cada fila combinada amb totes les de l'altra taula. - Columnes ambigües: si una columna (com
customer_id) existeix a les dues taules, cal escriure-la amb l'àlies (o.customer_id). - Amb
LEFT JOIN,COUNT(*)compta 1 per als elements sense parella; per obtenir un 0 cal comptar una columna de la taula de la dreta. - El jutge no mira els noms de les columnes ni l'ordre de les files, però sí el nombre de columnes i el seu ordre: no afegeixis columnes "de regal" (com l'identificador) si no te les demanen.