Types de jountures en SQL (antisèche pour les débutants)

Il vaut mieux voir une fois qu'entendre cent fois. Cette petite article explique à quoi servent les différentes types des jointures en SQL.

Tout d'abord, il faut prendre en connaissance que SQL est un langage déclaratif de 4ème génération. Le meilleur façon de l'utiliser (et surtout pour le débutant), c'est bien déclarer la requête et laisser l'optimiseur SQL faire son boulot. Cela veut dire, pensez en termes ensemblistes, faites les jointures et évites les sous-requêtes.

On prend pour notre exemple les 2 tables : les compagnies et les contacts.

CREATE TABLE companies (
  company_id INT NOT NULL,
  company_name VARCHAR(64) NOT NULL,
  phone VARCHAR(16) NULL,
  CONSTRAINT pk_companies PRIMARY KEY (company_id)
)
 
CREATE TABLE contacts (
  contact_id INT NOT NULL,
  contact_name VARCHAR(64),
  phone VARCHAR(16) NULL,
  company_id INT NULL,
  CONSTRAINT pk_contacts PRIMARY KEY (contact_id),
  CONSTRAINT fk_contact_company
    FOREIGN KEY (company_id)
    REFERENCES companies(company_id)
)

Il nous faut remplir les tables par les données suivantes :

INSERT INTO companies VALUES (1, 'AT&T', null)
INSERT INTO companies VALUES (2, 'Microsoft', '322-223')
INSERT INTO contacts VALUES (1, 'Bjarne Stroustrup', null, 1)
INSERT INTO contacts VALUES (2, 'Niklaus Wirth', '322-223', null)
INSERT INTO contacts VALUES (3, 'Bill Gates', '322-223', 2)

Et voici nos tables remplies par ces données :

Companies

company_id company_name phone
1 AT&T NULL
2 Microsoft 322-223

Contacts

contact_id contact_name phone company_id
1 Bjarne Stroustrup NULL 1
2 Niklaus Wirth 322-223 NULL
3 Bill Gates 322-223 2

Maintenant, c'est le temps pour faire les requêtes.

INNER JOIN

La jointure interne.

SELECT contact_name, company_name
FROM contacts 
     INNER JOIN companies
     ON contacts.company_id = companies.company_id
ORDER BY contact_name
contact_name company_name
Bjarne Stroustrup AT&T
Bill Gates Microsoft

LEFT OUTER JOIN

SELECT contact_name, company_name
FROM contacts 
     LEFT OUTER JOIN companies
     ON contacts.company_id = companies.company_id
ORDER BY contact_name
contact_name company_name
Bjarne Stroustrup AT&T
Niklaus Wirth NULL
Bill Gates Microsoft

RIGHT OUTER JOIN

Dans cette exemple on joint par l'attribut non clé. Le modèle relationnel nous en permet faire sans avoir penser de l’existence des liens physiques.

SELECT contact_name, company_name
FROM contacts 
     RIGHT OUTER JOIN companies
     ON contacts.phone = companies.phone
ORDER BY contact_name
contact_name company_name
NULL AT&T
Niklaus Wirth Microsoft
Bill Gates Microsoft

Et la même jointure externe gauche (nous en avons besoins pour l'exemple suivante)

SELECT contact_name, company_name
FROM contacts 
     LEFT OUTER JOIN companies
     ON contacts.phone = companies.phone
ORDER BY contact_name
contact_name company_name
Bjarne Stroustrup NULL
Niklaus Wirth Microsoft
Bill Gates Microsoft

FULL JOIN

SELECT contact_name, company_name
FROM contacts 
     FULL OUTER JOIN companies
     ON contacts.phone = companies.phone
ORDER BY contact_name

Comme vous pouvez voir, c'est l'union des résultats obtenus précédemment dans les exemples de jointures externes LEFT et RIGHT

contact_name company_name
NULL AT&T
Bjarne Stroustrup NULL
Niklaus Wirth Microsoft
Bill Gates Microsoft

CROSS JOIN ou le produit cartésien

SELECT contact_name, company_name
FROM contacts 
     CROSS JOIN companies
ORDER BY contact_name
contact_name company_name
Bjarne Stroustrup AT&T
Bjarne Stroustrup Microsoft
Niklaus Wirth AT&T
Niklaus Wirth Microsoft
Bill Gates AT&T
Bill Gates Microsoft

Bon continuation !

C'est la traduction de mon article d'avril 2006 publié en "PC World (russian edition)", N°12, 2007