Guia de Bases de Dades: Joins


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.

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 escriure a.columna en 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 simplement JOIN) només conserva les files que tenen parella a les dues taules.
  • LEFT JOIN conserva totes les files de la taula de l'esquerra; si no tenen parella, les columnes de la dreta surten a NULL.

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.

Tornar al problema