¿Por qué están separados los datos?
Una base de datos relacional evita copiar la misma información en cada línea. La tabla clients almacena el nombre y la ciudad de cada cliente, mientras que la tabla commandes almacena las compras.
Para mostrar el nombre del cliente junto a un pedido, SQL debe combinar estas dos fuentes al leer. Esta es la función de un join.
La clave común hace posible la relación
En clients, id_client identifica de forma única a una persona: esta es la clave principal. En commandes, el mismo valor indica quién realizó el pedido: actúa como clave externa.
La relación por tanto no depende del nombre del cliente. Dos personas pueden tener el mismo nombre, mientras que su identificador sigue siendo único.
clients
- id_client INTEGER PRIMARY KEY
- nom VARCHAR
- ville VARCHAR
commandes
- id_commande INTEGER PRIMARY KEY
- id_client INTEGER
- montant DECIMALEscribe un INNER JOIN paso a paso
La consulta comienza en clients, agrega commandes y luego describe la coincidencia en la cláusula ON. INNER JOIN solo mantiene las filas para las que existe esta coincidencia.
Los alias c y co acortan las referencias. También evitan cualquier ambigüedad cuando ambas tablas tienen una columna con el mismo nombre.
FROM clients AS cestablece la primera fuente.INNER JOIN commandes AS coagrega la segunda tabla.ON c.id_client = co.id_clientespecifica qué líneas coinciden.SELECTelige solo las columnas útiles para el resultado.
SELECT
c.nom,
co.id_commande,
co.montant
FROM clients AS c
INNER JOIN commandes AS co
ON c.id_client = co.id_client
ORDER BY co.montant DESC;Lee y comprueba el resultado.
Un pedido asociado con un cliente produce una línea en el resultado. Si un cliente tiene tres pedidos, su nombre aparece tres veces: no se trata de duplicados accidentales, sino de tres hechos diferentes.
Antes de agregar cálculos, comprueba algunos identificadores manualmente. Un join correcto debe preservar el significado comercial de las líneas y no multiplicar su número sin motivo.
¿INNER JOIN o LEFT JOIN?
INNER JOIN responde a la pregunta "¿Qué pedidos tienen un cliente correspondiente?" ". Un cliente sin pedido desaparece del resultado.
LEFT JOIN por el contrario mantiene a todos los clientes de la mesa de la izquierda. Las columnas de pedido son NULL cuando ningún pedido coincide. Esta opción es útil para encontrar clientes inactivos.
SELECT c.nom, co.id_commande
FROM clients AS c
LEFT JOIN commandes AS co
ON c.id_client = co.id_client;Cinco errores comunes con joins
Una consulta puede ejecutarse sin errores técnicos pero aun así producir un resultado comercial incorrecto. Por lo tanto, el estado ON merece una relectura atenta.
- Olvídese de la cláusula
ONy crea todas las combinaciones posibles. - Vincula el nombre del cliente en lugar de su ID estable.
- Confundir
id_clientyid_commande. - Utiliza
INNER JOINmientras se deben conservar las filas no coincidentes. - Seleccionando todas las columnas con
*y dificultando la verificación del resultado.
El método para recordar
Primero identifica la pregunta de negocios, luego la tabla que representa cada objeto. Luego localiza la clave principal y la clave externa, escribe la condición ON y comprueba algunas líneas.
Cuando este resultado sea confiable, puede agregar un filtro, clasificación o agregación. El ejercicio de pedidos de clientes le permite aplicar este método de inmediato.
Pon esta guía en práctica.
Abre el ejercicio relacionado, ejecuta tu consulta y compara el resultado esperado.
