Les jointures

Nous travaillons sur un SGBD relationnel; les tables sont donc en relation, elles disposent d'une clé primaire, et les relations entre elles vont associer la clé primaire d'une des tables concernées avec un champ de même nature d'une autre table; ce dernier champ est appelé clé étrangère ou clé secondaire. L'intérêt du modèle relationnel n'est plus à démontrer, et nous allons en avoir un aperçu de suite.

On pourrait penser que l'expression suivante suffirait:

SELECT nom, prenom, titre FROM auteur, livre

Jointures simples

Une telle requête sans restriction entraîne un produit cartésien ce qui se traduit par un très grand nombre de lignes qui ne présente pas un grand intérêt. Concrètement on associe en procédant ainsi chaque auteur à chaque livre. Le nombre de lignes est alors égal au nombre d'auteur que multiplie le nombre de livres...Comme si tous les ouvrages avaient été écrits par chaque auteur...Il est évident qu'il faut exprimer des restrictions: les deux tables contiennent un champ commun: id_auteur, qui est clé primaire de la table auteur, et qui devient clé étrangère de la table livre. Ces deux colonnes sont de même nature, et on va demander l'affichage des noms prénoms de la table auteur, et titres de la table livre uniquement pour les enregistrements de ces deux tables qui ont un les même valeurs dans ce champ commun: id_auteur. La clause WHERE va nous permettre d'y arriver.

SELECT nom, prenom, titre , auteur.id_auteur, livre.id_auteur FROM auteur, livre WHERE (auteur.id_auteur=livre.id_auteur)

aronraymondLes Modernesaron1aron1
aronjean-paulLes désillusions du progrèsaron2aron2
perryanneUn plat qui se mange froidperr1perr1
hillermantonyMoonhill1hill1
pybernardStatistiques descriptivespy1py1
aronjean-paulIntroduction à la philosophie politiquearon2aron2
camusalbertL'étrangercamu1camu1
camusalbertLa pestecamu1camu1
zolaemileAu bonheur des dameszola1zola1
hillermantonyLe premier aiglehill1hill1
balzachonoreLa peau de chagrinbalz1balz1
balzachonoreEugénie grandetbalz1balz1
durasmargueriteL'amantdura1dura1
durasmargueriteUn barrage contre le pacifiquedura1dura1
garyromainLa vie devant soigary1gary1
fortabensqlfort1fort1
duboispaulMySQLdubo1dubo1
zolaemileLa debâclezola1zola1
perrypascal Le tourisme à la Martinique : sous la plage, les conflitsperr2perr2
balzachonoreLe père Goriotbalz1balz1
zolaemileNanazola1zola1

h3>On voit bien ci-dessus que les seuls enregistrements affichés sont ceux qui ont des valeurs communes dans leur champ id_auteur. Il n'est.bien sûr pas indispensable de les afficher:

SELECT nom, prenom, titre FROM auteur, livre WHERE (auteur.id_auteur=livre.id_auteur)

aronraymondLes Modernes
aronjean-paulLes désillusions du progrès
perryanneUn plat qui se mange froid
hillermantonyMoon
pybernardStatistiques descriptives
aronjean-paulIntroduction à la philosophie politique
camusalbertL'étranger
camusalbertLa peste
zolaemileAu bonheur des dames
hillermantonyLe premier aigle
balzachonoreLa peau de chagrin
balzachonoreEugénie grandet
durasmargueriteL'amant
durasmargueriteUn barrage contre le pacifique
garyromainLa vie devant soi
fortabensql
duboispaulMySQL
zolaemileLa debâcle
perrypascal Le tourisme à la Martinique : sous la plage, les conflits
balzachonoreLe père Goriot
zolaemileNana

Une autre syntaxe est possible avec l'opérateur INNER ...JOIN ....ON:

SELECT nom, prenom, titre FROM auteur INNER JOIN livre ON auteur.id_auteur=livre.id_auteur

aronraymondLes Modernes
aronjean-paulLes désillusions du progrès
perryanneUn plat qui se mange froid
hillermantonyMoon
pybernardStatistiques descriptives
aronjean-paulIntroduction à la philosophie politique
camusalbertL'étranger
camusalbertLa peste
zolaemileAu bonheur des dames
hillermantonyLe premier aigle
balzachonoreLa peau de chagrin
balzachonoreEugénie grandet
durasmargueriteL'amant
durasmargueriteUn barrage contre le pacifique
garyromainLa vie devant soi
fortabensql
duboispaulMySQL
zolaemileLa debâcle
perrypascal Le tourisme à la Martinique : sous la plage, les conflits
balzachonoreLe père Goriot
zolaemileNana

Bien sûr les éléments de tri, de filtrage et de calcul peuvent être intégrées.

Jontures et Tri

Même requête que ci-dessus mais avec un tri alphabétique du nom de l'auteur et du titre des ouvrages; On affiche également le nombre de pages.

SELECT nom, prenom, titre, nb_pages FROM auteur INNER JOIN livre ON auteur.id_auteur=livre.id_auteur ORDER BY nom, titre

aronjean-paulIntroduction à la philosophie politique450
aronjean-paulLes désillusions du progrès286
aronraymondLes Modernes376
balzachonoreEugénie grandet315
balzachonoreLa peau de chagrin280
balzachonoreLe père Goriot360
camusalbertL'étranger220
camusalbertLa peste330
duboispaulMySQL735
durasmargueriteL'amant185
durasmargueriteUn barrage contre le pacifique380
fortabensql234
garyromainLa vie devant soi285
hillermantonyLe premier aigle325
hillermantonyMoon340
perrypascal Le tourisme à la Martinique : sous la plage, les conflits250
perryanneUn plat qui se mange froid84
pybernardStatistiques descriptives330
zolaemileAu bonheur des dames350
zolaemileLa debâcle225
zolaemileNana350

Les auteurs sont donc classée par ordre alphabétique. Pour ceux qui ont écrit plusieurs livres, les titres sont classés également par ordre alphabétique

Jointures et filtre

Même requête que la précédente mais on se limite aux auteurs suivants: Aron, Balzac, Perry, Zola:

SELECT nom, prenom, titre, nb_pages FROM livre, auteur WHERE (auteur.id_auteur=livre.id_auteur AND nom IN ('aron', 'balzac','perry', 'zola') ORDER BY nom, titre

aronjean-paulIntroduction à la philosophie politique450
aronjean-paulLes désillusions du progrès286
aronraymondLes Modernes376
balzachonoreEugénie grandet315
balzachonoreLa peau de chagrin280
balzachonoreLe père Goriot360
perrypascal Le tourisme à la Martinique : sous la plage, les conflits250
perryanneUn plat qui se mange froid84
zolaemileAu bonheur des dames350
zolaemileLa debâcle225
zolaemileNana350

Constatons qu'il suffit de combiner les restrictions (WHERE) en utilsant l'opérateur logique AND et des parenthèses (pas obligatoires) pour arriver simplement à ce résultat.

Jointures et calculs

Objectif: déterminer le nombre d'ouvrages écrits par chaque auteur. Nous avons la réponse en comptant manuellement les lignes dans les réponses ci-dessus...:) On préfèrera une réponse avec le nom, le prénom de chaque auteur et le nombre d'ouvrages par auteur.

SELECT nom, prenom, COUNT(titre) AS Nb_Ouvrages FROM auteur, livre WHERE (auteur.id_auteur=livre.id_auteur) GROUP BY nom, prenom

aronjean-paul2
aronraymond1
balzachonore3
camusalbert2
duboispaul1
durasmarguerite2
fortaben1
garyromain1
hillermantony2
perryanne1
perrypascal1
pybernard1
zolaemile3

Ajoutons un filtre et un tri: même requête mais pour les ouvrages dont le nombre de pages est supérieur à 300. L'afichage se fera en tenant compte de l'ordre décroissant du nombre d'ouvrages, puis par nom d'auteurs croissant.

SELECT nom, prenom, COUNT(titre) AS Nb_Ouvrages FROM auteur, livre WHERE (auteur.id_auteur=livre.id_auteur AND nb_pages>300) GROUP BY nom, prenom ORDER BY Nb_Ouvrages DESC, nom

balzachonore2
hillermantony2
zolaemile2
aronjean-paul1
aronraymond1
camusalbert1
duboispaul1
durasmarguerite1
pybernard1

Jointures avec plus de deux tables

L'écriture est plus longue mais le principre reste le même. Nous souhaitons disposer des renseignements suivants: Nom et prénoms des auteurs, titres des ouvrages consernés et éditeurs (Tri croissant sur le nom des auteurs qui sera écrit en majuscule).

SELECT UCASE(nom), prenom, titre, nom_editeur FROM auteur, livre, editeur WHERE (auteur.id_auteur=livre.id_auteur AND livre.id_editeur=editeur.id_editeur)ORDER BY nom, prenom

jean-paulLes désillusions du progrèsGallimard
jean-paulIntroduction à la philosophie politiqueGallimard
raymondLes ModernesGallimard
honoreLa peau de chagrinLivre de poche
honoreEugénie grandetLivre de poche
honoreLe père GoriotLivre de poche
albertL'étrangerGallimard
albertLa pesteGallimard
paulMySQLCampus Press
margueriteUn barrage contre le pacifiqueGallimard
margueriteL'amantMinuit
bensqlCampus Press
romainLa vie devant soiGallimard
tonyLe premier aigleSeuil
tonyMoonSeuil
anneUn plat qui se mange froidSeuil
pascal Le tourisme à la Martinique : sous la plage, les conflitsKhartala
bernardStatistiques descriptivesEconomica
emileNanaLivre de poche
emileLa debâcleGallimard
emileAu bonheur des damesLivre de poche

A vous

1 - Trouver le code SQL pour parvenir au résultat suivant:

Economica25.00
Khartala15.00
Seuil11.67
Minuit10.00
Livre de poche7.20
Gallimard6.50
Campus Press4.00

2 - Nombre de pages maximum, moyen, et minimum des ouvrages publiés par Gallimard.
3 - Titre, genre, editeur, nom, prenom des ouvrages écrits par les auteurs dont le nom ne comprend pas la lettre E.
4 - Nombre de pages moyen par editeur pour les ouvrages dont le type comprend le mot Roman.