Recette #3:
Informations complémentaires sur les jointures

Février 2011


Précédent

Table des matières

Suivant


SQL dispose d'une autre syntaxe pour les opérations de jointure.
Les deux écritures sont plus ou moins équivalents et l'utilisation de l'une ou l'autre est une affaire de préférences personnelles dans la plupart des cas.
Cependant, cette deuxième méthode offre des possibilités uniques et très intéressantes dans certains cas.



SELECT lc.lc_id AS lc_id,
  lc.lc_name AS lc_name,
  lc.population AS population,
  c.county_id AS county_id,
  c.county_name AS county_name,
  c.car_plate_code AS car_plate_code,
  r.region_id AS region_id,
  r.region_name AS region_name
FROM local_councils AS lc,
  counties AS c,
  regions AS r
WHERE lc.county_id = c.county_id
  AND c.region_id = r.region_id;

La requête ci-dessus à un air de déjà vu non ? vous avez raison, nous l'avons déjà utilisé ...

SELECT lc.lc_id AS lc_id,
  lc.lc_name AS lc_name,
  lc.population AS population,
  c.county_id AS county_id,
  c.county_name AS county_name,
  c.car_plate_code AS car_plate_code,
  r.region_id AS region_id,
  r.region_name AS region_name
FROM local_councils AS lc
JOIN counties AS c ON (
  lc.county_id = c.county_id)
JOIN regions AS r ON (
  c.region_id = r.region_id);


Bien, cette nouvelle requête est identique à la première, mais a été écrite en suivant la deuxième syntaxe:



SELECT r.region_name AS region,
  c.county_name AS county,
  lc.lc_name AS local_council,
  lc.population AS population
FROM regions AS r
JOIN counties AS c ON (
  c.region_id = r.region_id)
JOIN local_councils AS lc ON (
  c.county_id = lc.county_id
  AND lc.population > 100000)
ORDER BY r.region_name,
  county_name;


region

county

local_council

population

ABRUZZO

PESCARA

PESCARA

116286

CALABRIA

REGGIO DI CALABRIA

REGGIO DI CALABRIA

180353

CAMPANIA

NAPOLI

NAPOLI

1004500

CAMPANIA

SALERNO

SALERNO

138188

EMILIA-ROMAGNA

BOLOGNA

BOLOGNA

371217

...

...

...

...

Rien d'étrange dans cette requête:

SELECT r.region_name AS region,
  c.county_name AS county,
  lc.lc_name AS local_council,
  lc.population AS population
FROM regions AS r
JOIN counties AS c ON (
  c.region_id = r.region_id)
LEFT JOIN local_councils AS lc ON (
  c.county_id = lc.county_id
  AND lc.population > 100000)
ORDER BY r.region_name,
  county_name;


region

county

local_council

population

ABRUZZO

CHIETI

NULL

NULL

ABRUZZO

L'AQUILA

NULL

NULL

ABRUZZO

PESCARA

PESCARA

116286

ABRUZZO

TERAMO

NULL

NULL

BASILICATA

MATERA

NULL

NULL

BASILICATA

POTENZA

NULL

NULL

...

...

...

...

En apparence, cette requête est la même que la précédente.
Mais il y a pourtant une différence remarquable:

Cette différence entre JOIN et LEFT JOIN est fondamentale.
Dans l'exemple précédent, la clause  LEFT JOIN permet de s'assurer que toutes les Regions et tous les Counties vont être insérées dans les résultats, même ceux qui ne satisfont pas la limite de population pour Local Councils.


Précédent

Table des matières

Suivant


Author: Alessandro Furieri a.furieri@lqt.it
Traduced from English by RIVIERE Romain

This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.


Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.