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