cours 1 : requêtes imbriquées
TRANSCRIPT
![Page 1: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/1.jpg)
Cours 1 : Requêtes imbriquées
2018-2019 Bases de données 1
![Page 2: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/2.jpg)
2018-2019 Bases de données 2
Rappel
�Une condition de sélection utilisée dans une clause WHERE ou dans une clause HAVING s’exprime sous la forme d’une comparaison entre la valeur d’un attribut (ou expression) et une valeur de référence qui, dans le cas des requêtes simples, est soit un attribut (ou expression), soit une constante
![Page 3: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/3.jpg)
Exemple 1
SELECT titreFROM filmWHERE numfilm <= 2908
numfilm � valeur d’attribut<= � compairaison2908 � constante
2018-2019 Bases de données 3
![Page 4: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/4.jpg)
Exemple 2
SELECT *FROM film, individuWHERE realisateur = numindividu
realisateur � valeur d’attribut= � compairaisonnumindividu � valeur d’attribut
2018-2019 Bases de données 4
![Page 5: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/5.jpg)
Exemple 3
SELECT *
FROM location
WHERE TO_CHAR(dateretour, 'YYYY') = '2019'
TO_CHAR(…) � expression= � comparaison'2019' � constante
2018-2019 Bases de données 5
![Page 6: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/6.jpg)
2018-2019 Bases de données 6
SOUS-SELECT
�Le langage SQL étend la notion de valeur de référence au résultat d’une requête. Ainsi, l’expression d’une clause WHEREpeut prendre la forme :
WHERE attribut/expression opérateur (SELECT …)
�On dit alors que la requête, dont le résultat sert de valeur de référence, est une requête imbriquée ou une sous-requête
![Page 7: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/7.jpg)
2018-2019 Bases de données 7
Requêtes imbriquées
�Il est possible d’imbriquer plusieurs requêtes et il n’y a pas de limite dans le nombre de niveaux d’imbrication
�Le résultat de chaque requête imbriquée sert de valeur de référence dans la condition de sélection de la requête de niveau supérieur, appelée requête principale
![Page 8: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/8.jpg)
2018-2019 Bases de données 8
Types de requêtes imbriquées
�La sous-requête peut renvoyer soit une ligne, soit plusieurs
�Si la sous-requête renvoie plusieurs lignes, nous avons deux cas, selon que la sous-requête est indépendante de la requête principale ou synchronisée avec elle
�Si la sous-requête est synchronisée avec la requête principale, on parle de requête corrélée
![Page 9: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/9.jpg)
2018-2019 Bases de données 9
EtapenumVoyage
numVille
numOrdre
duree
VoyagenumVoyage
nomVoyage
nbMin
nbMax
typePension
VillenumVille
nomVille
numPays
PaysnumPays
nomPays
formalite
vaccin
TarifnumVoyage
dateDepart
prix
Exemple de base : VOYAGES
![Page 10: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/10.jpg)
2018-2019 Bases de données 10
Exemple de requête imbriquée renvoyant une seule ligne
�Donner les numéros des voyages ayant le même type de pension que le voyage numéro 4SELECT numVoyage FROM voyage
WHERE typePension = (
SELECT typePension
FROM voyage
WHERE numVoyage = 4
)
![Page 11: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/11.jpg)
2018-2019 Bases de données 11
Requête imbriquée renvoyant une seule ligne
�Si la requête ne renvoie rien ou si elle renvoie plusieurs lignes, SQL génère une erreur
�L’attribut et la valeur de référence renvoyée par la sous-requête doivent avoir des types compatibles
![Page 12: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/12.jpg)
Bases de données 12
Exemple de requête imbriquée renvoyant une seule ligne (2)
�Donner les numéros et les dates de départ des voyages ayant le prix le plus bas sur l’ensemble de tous les prixSELECT numVoyage, dateDepart
FROM tarif
WHERE prix = (
SELECT MIN(prix)
FROM Tarif
)
12Bases de données2018-2019
![Page 13: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/13.jpg)
Bases de données 13
Exemple de requête imbriquée renvoyant une seule ligne (2bis)
�Donner les numéros et les dates de départ des voyages ayant le prix le plus bas sur l’ensemble de tous les prixSELECT numVoyage, dateDepart
FROM tarif
WHERE prix <= ALL(
SELECT prix
FROM Tarif
)
13Bases de données2018-2019
![Page 14: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/14.jpg)
2018-2019 Bases de données 14
Requêtes imbriquées renvoyant plusieurs lignes
�La condition de sélection emploie alors :• L’opérateur IN (équivalent à = ANY)• L’opérateur NOT IN (équivalent à != ALL)• Un opérateur simple ( =, !=, <>, <, >, <=,
>=) suivi de ALL ou ANY• L’opérateur EXISTS
![Page 15: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/15.jpg)
2018-2019 Bases de données 15
Rappel
�ANY : la condition est vraie si elle est vérifiée pour au moins une des valeurs renvoyées par la sous-requête
�ALL : la condition est vraie si elle est vérifiée pour chacune des valeurs renvoyées par la sous-requête
�IN : la condition est vraie si elle est vérifiée pour une des valeurs renvoyées par la sous-requête
![Page 16: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/16.jpg)
16
Exemple de requête imbriquée renvoyant plusieurs lignes
�Donner les numéros des voyages passant pour une ville où passe aussi le voyage numéro 4SELECT DISTINCT numVoyage
FROM Etape WHERE numVille IN (
SELECT numVille FROM Etape
WHERE numVoyage = 4
)
AND numVoyage != 4 16
![Page 17: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/17.jpg)
Jointure interne ou requête imbriquée ?
SELECT DISTINCT nomVoyage
FROM voyage V, tarif T
WHERE V.numVoyage = T.numVoyage
AND dateDepart > '31-08-19'
2018-2019 Bases de données 17
![Page 18: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/18.jpg)
Jointure interne ou requête imbriquée ? (bis)
SELECT nomVoyage
FROM voyage
WHERE numVoyage IN (
SELECT numVoyage
FROM Tarif
WHERE dateDepart > '31-08-19‘
)
2018-2019 Bases de données 18
![Page 19: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/19.jpg)
2018-2019 Bases de données 19
Jointure interne ou requête imbriquée ? (ter)
�Dans le premier cas on pourrait obtenir la date de départ comme résultat du SELECT alors que c’est impossible dans le deuxième cas
![Page 20: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/20.jpg)
Bases de données 20
GROUP BY dans un sous-select rendant plusieurs lignes
�Dates de départ des voyages dont la durée totale est de moins de 10 joursSELECT DISTINCT dateDepart
FROM tarif WHERE numVoyage IN (
SELECT numVoyage FROM etape
GROUP BY numVoyage
HAVING SUM(duree) < 10
)
2018-2019 20Bases de données
![Page 21: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/21.jpg)
Bases de données 21
GROUP BY dans un sous-select rendant plusieurs lignes (2)
�Nombre de voyages dont la durée totale est de moins de 10 joursSELECT COUNT(*)
FROM voyage WHERE numVoyage IN (
SELECT numVoyage FROM etape
GROUP BY numVoyage
HAVING SUM(duree) < 10
)
2018-2019 21Bases de données
![Page 22: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/22.jpg)
2018-2019 Bases de données 22
Exemple de requête imbriquée avec NOT IN
�Numéros des voyages dont il n’y a pas eu de départs après le mois de septembre 2018SELECT numVoyage FROM voyage
WHERE numVoyage NOT IN (
SELECT numVoyage FROM tarif
WHERE dateDepart > '30-09-18'
)
![Page 23: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/23.jpg)
2018-2019 Bases de données 23
Exemple de requête imbriquée avec NOT IN (suite)�Remarque : NOT IN n’est pas équivalent à IN
plus la négation de la conditionSELECT numVoyage FROM voyage
WHERE numVoyage IN (
SELECT numVoyage FROM tarif
WHERE dateDepart <= '30-09-18'
)
�Cela renvoie plutôt les numéros des voyages qui ont au eu moins un départ avant 1er
octobre 2018
![Page 24: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/24.jpg)
2018-2019 Bases de données 24
Extension SQL2
�Les lignes résultats peuvent être des listes d’attributs
WHERE (attribut1, attribut2, …) opérateur (
SELECT attribut1, attribut2, ...
…
)
![Page 25: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/25.jpg)
Exemple
SELECT DISTINCT numVoyage
FROM etape WHERE (numVille, duree) = (
SELECT numVille, duree
FROM etape
WHERE numOrdre = 1
AND numVoyage = 10
)
2018-2019 Bases de données 25
![Page 26: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/26.jpg)
Exemple de requête imbriquée et corrélée
�Pour chaque voyage, donner les dates de départ pour lesquelles le prix est le moins cherSELECT numVoyage, dateDepart
FROM tarif T1 WHERE prix = (
SELECT MIN(prix)
FROM Tarif T2
WHERE T2.numVoyage = T1.numVoyage
)2018-2019 Bases de données 26
![Page 27: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/27.jpg)
Exemple de requête imbriquée et corrélée (bis)
�Pour chaque voyage, donner les dates de départ pour lesquelles le prix est le moins cherSELECT numVoyage, dateDepart
FROM tarif T1 WHERE prix <= ALL (
SELECT prix
FROM Tarif T2
WHERE T2.numVoyage = T1.numVoyage
)2018-2019 Bases de données 27
![Page 28: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/28.jpg)
Solution sans corrélation (SQL2)
SELECT numVoyage, dateDepart
FROM tarif WHERE (numVoyage, prix) IN (
SELECT numVoyage, MIN(prix)
FROM Tarif
GROUP BY numVoyage
)
2018-2019 Bases de données 28
![Page 29: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/29.jpg)
Exemple de requête imbriquée et corrélée (2)
�Pour chaque voyage, donner les numéros de ses étapes qui durent plus longtemps que sa première étapeSELECT numVoyage, numOrdre
FROM etape E1 WHERE duree > (
SELECT duree FROM Etape E2
WHERE E2.numVoyage = E1.numVoyage
AND numOrdre = 1
)
2018-2019 Bases de données 29
![Page 30: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/30.jpg)
Exemple de requête imbriquée et corrélée (3)
�Pour chaque voyage, donner les numéros de ses étapes qui durent plus longtemps que sa dernière étape
2018-2019 Bases de données 30
![Page 31: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/31.jpg)
Exemple de requête imbriquée et corrélée (3bis)
SELECT numVoyage, numOrdre
FROM etape E1 WHERE duree > (
SELECT duree FROM Etape E2
WHERE E1.numVoyage = E2.numVoyage
AND numOrdre = ???
)
2018-2019 Bases de données 31
![Page 32: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/32.jpg)
Exemple de requête imbriquée et corrélée (3ter)
SELECT numVoyage, numOrdre
FROM etape E1 WHERE duree > (
SELECT duree FROM Etape E2
WHERE E1.numVoyage = E2.numVoyage
AND numOrdre = (
SELECT MAX(numOrdre) FROM etape E3
WHERE E3.numVoyage = E1.numVoyage
)
)
2018-2019 Bases de données 32
![Page 33: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/33.jpg)
Exemple de requête imbriquée et corrélée (4)
�Donner les numéros des voyages ayant plus de deux dates de départSELECT DISTINCT numVoyage
FROM tarif T1 WHERE 2 > (
SELECT COUNT(*) FROM tarif T2
WHERE T2.numVoyage = T1.numVoyage
)
2018-2019 Bases de données 33
![Page 34: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/34.jpg)
Exemple de requête imbriquée et corrélée (4bis)
�Donner les numéros des voyages ayant plus de deux dates de départ (sans correlation)SELECT numVoyage
FROM tarif
GROUP BY numVoyage
HAVING COUNT(*) > 2
2018-2019 Bases de données 34
![Page 35: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/35.jpg)
2018-2019 Bases de données 35
Opérateur EXISTS
... WHERE EXISTS (sous-select)
�Cet opérateur permet de construire un prédicat évalué à vrai si la sous-requête renvoie au moins une ligne
![Page 36: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/36.jpg)
36
Exemple
�Y a-t-il des voyages qui font au moins 6 étapes ?SELECT 'OUI' FROM DUAL
WHERE EXISTS (
SELECT * FROM etape
WHERE numOrdre = 6
)
![Page 37: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/37.jpg)
37
Remarque
�DUAL est une table « dummy » qui sert, de manière générale, à faire de test
SELECT SYSDATE FROM DUAL
SELECT 25+18 FROM DUAL
…
![Page 38: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/38.jpg)
2018-2019 Bases de données 38
Exemple 2
�Numéros des voyages qui font moins de 6 étapes
SELECT numVoyage FROM voyage V
WHERE NOT EXISTS (
SELECT * FROM etape E
WHERE numOrdre = 6
AND E.numVoyage = V.numVoyage
)
![Page 39: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/39.jpg)
2018-2019 Bases de données 39
�Pour chaque ville de Grèce, donnée par son numéro et son nom, trouver le nombre de voyages qu’y passent
Question 1
![Page 40: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/40.jpg)
2018-2019 Bases de données 40
�Pour la période du second semestre 2019, donner les noms et numéros des villes où passent des voyages dont le prix moyen sur cette période est inférieur à 900 €
Question 2
![Page 41: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/41.jpg)
41
�Pour la période du second semestre 2019, donner les numéros et noms des villes où passent des voyages dont le prix moyen sur cette période est inférieur au prix moyen de ce voyage pendant tout 2019
Question 3
![Page 42: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/42.jpg)
Bases de données 42
�Donner les numéros et les noms des voyages en demi-pension qui ne font pas étape en Grèce
Question 4
![Page 43: Cours 1 : Requêtes imbriquées](https://reader036.vdocuments.site/reader036/viewer/2022062409/62ac9d607347db4afb3576b9/html5/thumbnails/43.jpg)
�Pour chaque voyage donné par son numéro et son nom, donner le numéro et le nom de la ville où ce voyage fait sa dernière étape
Question 5
2018-2019 Bases de données 43