SQL : Jointures

Sommaire du document

Nous avons vu en algèbre relationnelle ce qu'étaient les jointures. Nous allons nous pencher ici sur leur application en SQL.

Exemples de jointure

Nous pouvons nous passer des opérateurs JOIN, et utiliser des SELECT imbriqués. Par exemple, pour trouver le numéro des élèves de sexe féminin qui ont suivi le cours de gymnastique de Mr Mégot, nous pouvons effectuer la requête suivante :


Code SQL (Requête 1) (3 lignes) :
  1. SELECT DISTINCT e.num_etu FROM etudiant e,cours c
  2. WHERE e.sexe = 2
  3. AND c.num_ens = (SELECT num_ens FROM enseignants WHERE UPPER(nom) = 'MEGOT');

Ce type de requête était fort utilisé auparavant. Parfois, nous retrouvons même plusieurs requêtes exécutées à la suite dans une transaction.

Il est possible d'optimiser nettement notre requête par l'utilisation des jointures :


Code SQL (Requête 2) (5 lignes) :
  1. SELECT DISTINCT e.num_etu FROM
  2. ( etudiant e INNER JOIN cours c ON e.num_etu = c.num_etu )
  3. INNER JOIN enseignants ens ON ens.num_ens = c.num_ens
  4. WHERE e.sexe = 2
  5. AND UPPER(ens.nom) = 'MEGOT';

Une jointure permet d'associer des colonnes de tables différentes pour étendre le champ des recherches, pour peu que chaque table contienne un champ dont les valeurs correspondent à celles d'une autre table. Dans le cadre de notre exemple, les valeurs du champ num_etu de la table cours correspondent à des valeurs du champ num_etu de la table etudiants.

Remarque

Dans cet exemple, nous avons une jointure naturelle, ce qui est beaucoup plus lisible car les deux champs portent le même nom (num_etu), mais la jointure fonctionne parfaitement même si les noms des champs sont différents (equi-jointure).

Autres types de jointures

Nous pouvons aussi trouver d'autres types de jointures :

  • Auto-jointure : jointure d'une table avec elle même dans le cas par exemple d'un système hiérarchique (un champ de la table référence un autre champ de cette même table).
  • Jointure hétérogène : jointure entre plusieurs bases de données.
  • Jointure externe : jointure qui permet de retourner une table sans concordance.
  • Jointure croisée : jointure qui retourne le produit cartésien de plusieurs tables.

 

INNER JOIN

INNER JOIN est le type de jointure par défaut, qui retourne les enregistrements dont les valeurs comparées sont égales.

Nous pouvons représenter la jointure INNER JOIN par le schéma suivant :
INNER JOIN

Nous pouvons par exemple demander le nom et prénom des étudiants qui ont suivi un cours, ainsi que les dates et intitulés des cours suivis :


Code SQL (Exemple d'INNER JOIN) (2 lignes) :
  1. SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM
  2. etudiant e INNER JOIN cours c ON e.num_etu = c.num_etu;
  • Nous n'avons pas la totalité des élèves, car ceux qui n'ont pas suivi de cours n'apparaissent pas.
  • Nous n'avons pas la totalité des cours, car nous n'avons pas les cours qui n'ont pas d'élèves (cours qui n'ont pas encore été donnés).

 

LEFT JOIN

La jointure LEFT JOIN nous permet non seulement de demander les enregistrements dont les valeurs comparées sont égales, mais aussi la totalité des enregistrements de la table de gauche.

Nous pouvons représenter la jointure LEFT JOIN par le schéma suivant :
LEFT JOIN

Nous pouvons demander tous les noms des élèves ainsi que les dates et intitulés des cours suivis par certains de ces élèves :


Code SQL (Exemple de LEFT JOIN) (2 lignes) :
  1. SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM
  2. etudiant e LEFT JOIN cours c ON e.num_etu = c.num_etu;

Cette requête différe seulement d'un mot par rapport à la précédente. En spécifiant que la requête comporte une jointure de type LEFT JOIN au lieu d'INNER JOIN, nous pouvons constater les effets suivants :

  • Nous avons la totalité des élèves, même ceux qui n'ont suivi aucun cours (aucune correspondance avec la table cours).
  • Nous n'avons pas la totalité des cours, car nous n'avons pas les cours qui n'ont pas d'élèves.

 

RIGHT JOIN

La jointure RIGHT JOIN repose sur le même principe que la jointure LEFT JOIN, mais c'est la totalité des enregistrements de la table de droite qui est retournée en plus des éléments qui satisfont à l'égalité.
RIGHT JOIN

Nous pouvons demander tous les noms des élèves qui ont suivi au moins un cours, et l'ensemble des dates et intitulés de tous les cours :


Code SQL (Exemple de RIGHT JOIN) (2 lignes) :
  1. SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM
  2. etudiant e RIGHT JOIN cours c ON e.num_etu = c.num_etu;
  • Nous avons seulement les élèves qui ont suivi au moins un cours.
  • Nous avons la totalité des cours, y compris ceux qui n'ont été donnés à aucun de ces élèves.

JOIN et les SGBD

Les jointures sont vivement conseillées, mais nous devons préalablement vérifier que la base de données supporte ce type de requête. Voici un petit résumé de la situation :

  • Oracle : depuis la version 9.
  • MySQL :
    • INNER JOIN depuis la version 3.23.17
    • UNION et CROSS JOIN depuis la version 4.0.11
  • PostGreSQL : LEFT et RIGHT seulement.
  • DB2 : LEFT seulement

Depuis la création de ce document, la prise en charge de ces opérateurs par les SGBD cités est peut-être plus étendue.

 

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

7 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-11340
Document créé le 17/03/07 22:02, dernière modification le Vendredi 17 Juin 2011, 12:12
Source du document imprimé : http:///www.gaudry.be/sql-join.html
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Apparence (afficher)
Stats (afficher)
15838 documents
455 astuces.
550 niouzes.
3107 definitions.
447 membres.
8121 messages.

Document genere en :
0,08 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
There are only two kinds of programmers: Those who code to live and those who live to code.

Venkat Subramaniam
 
l'infobrol
Nous sommes le Mardi 23 Mai 2017, 22:31, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)