Les jointures
Principe :
– Joindre plusieurs tables
– On utilise les informations communes des tables
elazami © 2024-2025 1
Les jointures
Prenons pour exemple un ouvrage de V. Hugo
Si l'on souhaite des informations sur la cote d'un
exemplaire il faudrait le faire en 2 temps:
– 1) je récupère l'id de l'ouvrage :
SELECT id FROM ouvrage where auteur LIKE 'V. Hugo'
– 2) Je récupère la ou les cote avec l'id récupéré
SELECT cote FROM exemplaire WHERE ouvrageId = id_récupéré
elazami © 2024-2025 2
Les jointures
On peux faire tout ça (et plus encore) en une seule requête
C'est là que les jointures entrent en jeu:
SELECT [Link]
FROM exemplaire
INNER JOIN ouvrage ON [Link] = [Link]
WHERE [Link] LIKE 'V. Hugo' ;
elazami © 2024-2025 3
Les jointures
elazami © 2024-2025 4
Les jointures
Ville Email
INNER JOIN
LEFT JOIN
RIGHT JOIN
elazami © 2024-2025 5
SQL
Requêtes avec blocs emboîtés
elazami © 2024-2025 6
Jointure par blocs emboîtés
BD exemple:
Produit(np,nomp,couleur,poids,prix) les produits
Usine(nu,nomu,ville,pays) les usines
Fournisseur(nf,nomf,type,ville,pays) les fournisseurs
Livraison(np,nu,nf,quantité) les livraisons
np référence [Link]
nu référence [Link]
nf référence [Link]
elazami © 2024-2025 7
Jointure par blocs emboîtés
Requête: Nom et couleur des produits livrés par le fournisseur 1
Solution 1 : la jointure déclarative
SELECT nomp, couleur FROM Produit,Livraison
WHERE ([Link] = [Link]) AND nf = 1 ;
Solution 2 : la jointure procédurale (emboîtement)
Nom et couleur des produits livrés par le fournisseur 1
SELECT nomp, couleur FROM Produit
WHERE np IN
(SELECT np FROM Livraison WHERE nf = 1) ;
Numéros de produits livrés par le fournisseur 1
elazami © 2024-2025 8
Jointure par blocs emboîtés
SELECT nomp, couleur FROM Produit
WHERE np IN
( SELECT np FROM Livraison WHERE nf = 1) ;
IN compare chaque valeur de np avec l'ensemble (ou multi-ensemble)
de valeurs retournés par la sous-requête
IN peut aussi comparer un tuple de valeurs:
SELECT nu FROM Usine
WHERE (ville, pays) IN (SELECT ville, pays FROM Fournisseur);
elazami © 2024-2025 9
Composition de conditions
Requête: Nom des fournisseurs qui approvisionnent une usine de
Londres ou de Paris en un produit rouge
SELECT nomf
FROM Livraison, Produit, Fournisseur, Usine
WHERE
couleur = 'rouge'
AND [Link] = [Link]
AND [Link] = [Link]
AND [Link] = [Link]
AND ([Link] = 'Londres’ OR [Link] = 'Paris');
elazami © 2024-2025 10
Composition de conditions
Requête: Nom des fournisseurs qui approvisionnent une usine de Londres
ou de Paris en un produit rouge
SELECT nomf FROM Fournisseur
WHERE nf IN
(SELECT nf FROM Livraison
WHERE np IN (SELECT np FROM Produit
WHERE couleur = 'rouge')
AND nu IN
(SELECT nu FROM Usine
WHERE ville = 'Londres' OR ville = 'Paris')
);
elazami © 2024-2025 11
Quantificateur ALL
Requête: Numéros des fournisseurs qui ne fournissent que des
produits rouges
SELECT nf FROM Fournisseur
WHERE 'rouge' = ALL (SELECT couleur FROM Produit
WHERE np IN (SELECT np FROM Livraison
WHERE [Link] = [Link] ) ) ;
La requête imbriquée est ré-évaluée pour chaque tuple de la requête (ici
pour chaque nf)
ALL: tous les éléments de l'ensemble doivent vérifier la condition
elazami © 2024-2025 12
Condition sur des ensembles : EXISTS
Test si l’ensemble n’est pas vide (E )
Exemple : Noms des fournisseurs qui fournissent au moins un produit
rouge
SELECT nomf
FROM Fournisseur
WHERE EXISTS ce fournisseur
( SELECT *
FROM Livraison, Produit
WHERE [Link] = [Link]
AND [Link] = [Link] Le produit fourni
AND [Link] = 'rouge' ); est rouge
elazami © 2024-2025 13
Blocs emboîtés - récapitulatif
SELECT …
FROM …
WHERE …
attr IN requête
attr NOT IN requête
attr opérateur ALL requête
EXISTS requête
NOT EXISTS requête
elazami © 2024-2025 14
SQL
Traitement des résultat
elazami © 2024-2025 15
Fonctions sur les colonnes
Attributs calculés
Exemple : SELECT nom, population*1000/surface FROM Pays
Opérateurs sur attributs numériques
SUM: somme des valeurs des tuples sélectionnés
AVG: moyenne
Opérateurs
Opérateurs sur tous types d’attributs d'agrégation
MIN: minimum
MAX: maximum
COUNT: nombre de tuples sélectionnés
elazami © 2024-2025 16
Opérateurs d'agrégation
pays
Nom Capitale Population Surface Continent
Irlande Dublin 5 70 Europe
Autriche Vienne 10 83 Europe
UK Londres 50 244 Europe
Suisse Berne 7 41 Europe
USA Washington 350 441 Amérique
SELECT MIN(population), MAX(population), AVG(population),
SUM(surface), COUNT(*)
FROM Pays WHERE continent = ‘Europe’
Donne le résultat :
MIN(population) MAX(population) AVG(population) SUM(surface) COUNT(*)
5 50 18 438 4
elazami © 2024-2025 17
DISTINCT
pays
Nom Capitale Population Surface Continent
Irlande Dublin 5 70 Europe
Autriche Vienne 10 83 Europe
UK Londres 50 244 Europe
Suisse Berne 7 41 Europe
USA Washington 350 441 Amérique
Suppression des doubles
SELECT DISTINCT continent
FROM Pays
Donne le résultat : Continent
Europe
Amérique
elazami © 2024-2025 18
ORDER BY
Tri des tuples du résultat: 2 possibilités ASC / DESC
SELECT continent, nom, population
FROM Pays
Tri des tuples par condition:
WHERE surface > 60
ORDER BY continent, nom ASC SELECT continent, nom, population
FROM Pays
ORDER BY
Continent Nom Population (CASE
WHEN Capital IS NULL THEN continent
Amérique USA 350
ELSE Capital
Europe Autriche 10 END);
Europe Irlande 5
Europe UK 50
elazami © 2024-2025 19
GROUP BY
Partition de l'ensemble des tuples en groupes homogènes:
SELECT continent, MIN(population), MAX(population),AVG(population),
SUM(surface), COUNT(*)
FROM Pays GROUP BY continent ;
Continent MIN(population) MAX(population) AVG(population) SUM(surface) COUNT(*)
Europe 5 50 18 438 4
Amérique 350 350 350 441 1
A noter : cette commande doit toujours s’utiliser après la commande WHERE et avant la
commande HAVING.
elazami © 2024-2025 20
HAVING
Conditions sur les fonctions d'agrégation
• Il n'est pas possible d'utiliser la clause WHERE pour faire des conditions sur une
fonction d'agrégation.
• Donc, si l'on veut afficher les pays dont on possède plus de 3 individus, la requête
suivante ne fonctionnera pas.
SELECT continent, COUNT(*)
FROM Pays
WHERE COUNT(*) > 3
GROUP BY continent ;
• Il faut utiliser HAVING qui se place juste après le GROUP BY
SELECT continent, COUNT(*)
FROM Pays
GROUP BY continent
HAVING COUNT(*) > 3;
elazami © 2024-2025 21
Renommage des attributs : AS
SELECT MIN(population) AS min_pop,
MAX(population) AS max_pop,
AVG(population) AS avg_pop,
SUM(surface) AS sum_surface,
COUNT(*) AS count
FROM Pays
WHERE continent = ‘Europe’ ;
min_pop max_pop avg_pop sum_surface count
5 50 18 438 4
elazami © 2024-2025 22