Escolar Documentos
Profissional Documentos
Cultura Documentos
Une requte imbrique (sous-requte interne, en anglais : inner subquery) est une requte classique utilise pour constituer un jeu de rsultat qui va servir dans une requte principale, la requte appelante (requte externe, en anglais : outer query), en gnral comme lment de comparaison dans la clause WHERE, parfois comme lment constitutif de valeur dune colonne. Syntaxe gnrale :
SELECT . . .[, (requte_imbrique) AS alias_colonne] FROM . . . WHERE nom_colonne operateur (requte_imbrique) [ GROUP BY . . . ] [ HAVING nom_colonne operateur (requte_imbrique) ] [ ORDER BY . . . ] ; (requte_imbrique) est une requte identique toute autre requte (elle devra tre
entre parenthses, sans point-virgule la fin).
Fait appel Requte im brique Requte principale produit Rsultat produit Rsultat final
La requte imbrique doit cependant produire un ensemble de rsultats conforme loprateur de comparaison utilis dans la requte appelante :
VALEUR UNIQUE (1 ligne et 1 colonne) : oprateurs de comparaison simples =, <, >, <=,>=, <>, BETWEEN, ou bien utilisation dans la constitution de la valeur dune colonne LIGNES MULTIPLES, COLONNE UNIQUE (0 N lignes une seule colonne) : oprateurs IN, ALL, ANY Un JEU DE DONNEES QUELCONQUE (0 N LIGNES 1 N COLONNES) : oprateur EXISTS PATDEZ-2006- Lordre SELECT utilisation des REQUETES IMBRIQUEES Page 1/14
Utilis dans
2
La requte imbrique est excute
(1, 2, 4, 5)
La requte principale sexcute et value la clause W HERE grce au rsultat retourn par la requte imbrique
CORRELATION
SELECT nom, prenom, titre, prix FROM t_artiste A INNER JOIN t_uvre O ON A.numartiste = O.numartiste W HERE prix < ( SELECT AVG(prix) 110 FROM t_uvre O2 W HERE O2.numartiste = A.numartiste );
(110)
1 2 3
La requte principale rcupre une ligne La requte imbrique sexcute et utilise dans sa clause W HERE une valeur de colonne de la requte principale La requte principale value la clause W HERE grce au rsultat retourn par la requte imbrique
Page 2/14
SELECT numartiste FROM t_artiste WHERE LOWER(nom) = picasso ; SELECT titre FROM t_oeuvre WHERE numartiste = ( SELECT numartiste FROM t_artiste WHERE LOWER(nom) = picasso ) ;
Exemple :
Requte indpendante
(2)_Retrouver la liste des uvres dont le numro dartiste est celui trouv en (1) :
Les nom et prnom des membres qui se sont inscrits une activit avant de sinscrire lactivit Paris expo.
(1)_Retrouver le numro de lactivit Paris Expo.
Requte indpendante
SELECT dateInscrire FROM t_inscrire WHERE numactivite = ( SELECT numactivite FROM t_activite WHERE LOWER(intitule) = paris expo. ) AND nummembre = <<MEMBRE DE LA TABLE APPELANTE>> ;
Page 3/14
SELECT DISTINCT nom, prenom FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre WHERE date_inscrire < CORRELATION ( SELECT dateInscrire FROM t_inscrire WHERE numactivite = ( SELECT numactivite FROM t_activite WHERE LOWER(intitule) = paris expo. ) AND nummembre = A.nummembre Requte ) corrle ;
Exemple :
Le titre des peintures (leur largeur et la largeur moyenne de toutes les peintures) dont la largeur est infrieure la moyenne
(1)_La largeur moyenne des peintures :
Requte indpendante
(2)_Les oeuvres dont la largeur est infrieure au rsultat trouv en (1) ;(on affiche galement la largeur et sa moyenne autre utilisation de la requte imbrique valeur unique - afin de vrifier la bonne excution de la requte) :
SELECT titre, largeur, ( SELECT AVG(largeur) FROM t_peinture ) AS largeur_moyenne FROM t_oeuvre A INNER JOIN t_peinture B ON A.numoeuvre = B.numoeuvre WHERE largeur < ( SELECT AVG(largeur) FROM t_peinture ) ;
Page 4/14
Le titre des peintures dont la largeur est suprieure la largeur moyenne de toutes les peintures
SELECT titre FROM t_oeuvre A INNER JOIN t_peinture B ON A.numoeuvre = B.numoeuvre WHERE largeur > (SELECT AVG(largeur) FROM t_peinture) ;
Exemple :
Le titre des peintures dont la largeur est gale la moyenne de toutes les peintures, plus ou moins 50%
SELECT titre FROM t_oeuvre A INNER JOIN t_peinture B ON A.numoeuvre = B.numoeuvre WHERE largeur BETWEEN ( SELECT AVG(largeur) * 0.50 FROM t_peinture ) AND ( SELECT AVG(largeur) * 1.5 FROM t_peinture ) ;
Exemple :
Le titre des peintures (leur largeur et la largeur moyenne des peintures pour chaque artiste) dont la largeur est suprieure la largeur moyenne des peintures du mme artiste
SELECT titre, largeur, (SELECT AVG(largeur) FROM t_oeuvre A2 INNER JOIN t_peinture B2 ON A2.numoeuvre = B2.numoeuvre WHERE A2.numartiste = A.numartiste ) CORRELATION AS moyenneParArtiste FROM t_oeuvre A INNER JOIN t_peinture B ON A.numoeuvre = B.numoeuvre WHERE largeur > ( SELECT AVG(largeur) CORRELATION FROM t_peinture WHERE numoeuvre IN
PATDEZ-2006- Lordre SELECT utilisation des REQUETES IMBRIQUEES Page 5/14
Le nom et le prnom des membres qui se sont inscrits au moins une fois une activit
(1)_les numros des membres qui se sont inscrits :
SELECT nom, prenom FROM membre WHERE nummembre IN (SELECT DISTINCT nummembre FROM t_inscrire ) ;
On aurait pu galement traiter la requte grce une jointure :
SELECT DISTINCT nom, prenom FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre ;
Exemple :
Page 6/14
SQL DML SELECT requtes imbriques Le nom et le prnom des membres qui NE se sont JAMAIS inscrits une activit
SELECT nom, prenom FROM t_membre WHERE nummembre NOT IN (SELECT DISTINCT nummembre FROM t_inscrire ) ;
ou bien
SELECT DISTINCT nom, prenom FROM t_membre A LEFT OUTER JOIN t_inscrire B ON A.nummembre = B.nummembre GROUP BY nom, prenom HAVING COUNT(B.nummembre) = 0 ;
Exemple :
Les nom et prnom des membres inscrits une activit consistant en une visite dexposition Paris
(1)_les numros des expositions ayant eu lieu Paris
SELECT numactivite FROM t_visiter WHERE numexpo IN (SELECT numexpo FROM t_exposition WHERE LOWER(ville) = 'paris' ) ;
(3)_les numros des membres qui se sont inscrits une activit dont le numro est lun des numros de (2)
SELECT nummembre FROM t_inscrire WHERE numactivite IN (SELECT numactivite FROM t_visiter WHERE numexpo IN (SELECT numexpo FROM t_exposition
PATDEZ-2006- Lordre SELECT utilisation des REQUETES IMBRIQUEES Page 7/14
SELECT nom, prenom FROM t_membre WHERE nummembre IN (SELECT nummembre FROM t_inscrire WHERE numactivite IN (SELECT numactivite FROM t_visiter WHERE numexpo IN (SELECT numexpo FROM t_exposition WHERE LOWER(ville) = 'paris' ) ) ) ;
Une jointure nous permet galement dobtenir ce rsultat :
SELECT DISTINCT nom, prenom FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre INNER JOIN t_visiter C ON B.numactivite = C.numactivite INNER JOIN t_exposition D ON C.numexpo = D.numexpo WHERE LOWER(D.ville) = 'paris' ;
Exemple :
le nombre, par anne de naissance, de membres qui se sont inscrits au moins une fois
(1)_les numros des membres qui se sont inscrits :
SELECT EXTRACT(YEAR FROM datenaissance), COUNT(*) FROM t_membre WHERE nummembre IN (SELECT DISTINCT nummembre FROM t_inscrire ) GROUP BY EXTRACT(YEAR FROM datenaissance);
ATTENTION : la jointure qui suit ne fournit pas le bon rsultat :
SELECT EXTRACT(YEAR FROM datenaissance), COUNT(DISTINCT A.nummembre) FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre GROUP BY EXTRACT(YEAR FROM datenaissance);
Oprateur ALL : Loprateur ALL est associ un oprateur de comparaison et permet de contrler une valeur de colonne de la requte appelante par rapport toutes les valeurs retournes par la requte imbrique. Avec loprateur ALL, TOUTES les valeurs de la sous requtes doivent rpondre au critre de comparaison. Exemple :
Les membres qui sont plus jeunes que tous les membres qui se sont inscrits (= dont la date de naissance est suprieure toutes les dates de naissance des membres qui se sont inscrits)
SELECT * FROM t_membre WHERE datenaissance > ALL (SELECT datenaissance FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre ) ; > ALL (SELECT colonne . . .) est quivalent > (SELECT MAX( colonne ). . .) SELECT * FROM t_membre WHERE datenaissance > (SELECT MAX(datenaissance) FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre ) ;
Exemple :
Les membres qui sont plus gs que tous les membres qui se sont inscrits (= dont la date de naissance est infrieure toutes les dates de naissance des membres qui se sont inscrits)
SELECT * FROM t_membre
PATDEZ-2006- Lordre SELECT utilisation des REQUETES IMBRIQUEES Page 9/14
Les membres qui ne sont pas ns la mme date que les membres qui se sont inscrits (= dont la date de naissance est diffrente de toutes les dates de naissance des membres qui se sont inscrits)
SELECT * FROM t_membre WHERE datenaissance <> ALL (SELECT datenaissance) FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre ) ; <> ALL (SELECT colonne . . .) est quivalent NOT IN (SELECT colonne . . .) SELECT * FROM t_membre WHERE datenaissance NOT IN (SELECT datenaissance) FROM t_membre A INNER JOIN t_inscrire B ON A.nummembre = B.nummembre ) ;
Oprateur ANY (ou SOME) : Loprateur ANY est associ un oprateur de comparaison et permet de contrler une valeur de colonne de la requte appelante par rapport toutes les valeurs retournes par la requte imbrique. Avec loprateur ANY, AU MOINS UNE des valeurs de la sous requte doit rpondre au critre de comparaison.
Page 10/14
ALL
ANY ou SOME
suprieur toutes les valeurs de la sous- suprieur au moins une des valeurs de requte la sous-requte quivalent : quivalent :
>
<
<>
quivalent :
quivalent :
IN (SELECT colonne. . .)
(est parmi les valeurs de la liste)
Page 12/14
la liste des artistes sil existe des membres dont lanniversaire est ft ce mois-ci
SELECT * FROM t_artiste WHERE EXISTS (SELECT * FROM t_membre WHERE EXTRACT(MONTH FROM dateNaissance) = EXTRACT(MONTH FROM CURRENT_DATE) ) ;
Exemple :
la liste des artistes sil existe certaines de leurs uvres qui ont t exposes
CORRELATION
SELECT * FROM t_artiste WHERE EXISTS (SELECT * FROM t_oeuvre A INNER JOIN t_exposer B ON A.numoeuvre = B.numoeuvre WHERE A.numartiste = t_artiste.numartiste ) ;
ATTENTION : si la sous requte comporte une fonction dagrgation, lapplication de loprateur EXISTS sera toujours vrifie : en effet, un COUNT(*) retourne forcment une valeur, qui peut tre 0 .
Page 13/14
Page 14/14