Nous avons vu en algèbre relationnelle ce qu'étaient les jointures. Nous allons nous pencher ici sur leur application en SQL.
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 :
SELECT DISTINCT e.num_etu FROM etudiant e,cours c WHERE e.sexe = 2 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 :
SELECT DISTINCT e.num_etu FROM ( etudiant e INNER JOIN cours c ON e.num_etu = c.num_etu ) INNER JOIN enseignants ens ON ens.num_ens = c.num_ens WHERE e.sexe = 2 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.
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).
Nous pouvons aussi trouver d'autres types de jointures :
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 :
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 :
SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM etudiant e INNER JOIN cours c ON e.num_etu = c.num_etu;
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 :
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 :
SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM 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 :
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é.
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 :
SELECT e.nom, e.prenom, c.date_cours, c.intitule FROM etudiant e RIGHT JOIN cours c ON e.num_etu = c.num_etu;
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 :
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.
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
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.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)