Sie sind auf Seite 1von 32

SQL

Requêtes avancées : imbrication de requêtes,


agrégats

BD4 S.B. F.C. N. G.d.R.

Licence MASS, Master ISIFAR, Paris-Diderot

Février 2015

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 1/45 Février 2015 1 / 45
Requêtes avancées

Manipulations ensemblistes

Le résultat d’une requête SQL est un ensemble de tuples... donc


une relation (virtuelle)
On peut utiliser ces résultats comme données d’une autre requête
Moyens : utiliser des fonctions ensemblistes dans la clause WHERE.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 2/45 Février 2015 2 / 45
Requêtes avancées Opérateur IN

Utilisation de sous-requêtes : IN

Opérateur IN déjà vu pour exprimer que l’attribut est à valeur dans


une certain liste.
Nouvelle utilisation de IN avec des sous-requêtes.

< attribut > [ NOT ] IN ( < sous - requête >)

Evaluée à vraie si <attribut> appartient au résultat de la sous-requête.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 3/45 Février 2015 3 / 45
Requêtes avancées Opérateur IN

Utilisation de sous-requêtes : IN

Exemples
Liste des joueurs cancadiens.
SELECT DISTINCT last_name , f i r s t _ n a m e
FROM p l a y e r
WHERE code IN ( S E L E C T code FROM
country_codes
WHERE c o u n t r y = ’ C a n a d a ’ ) ;

est équivalente à :
SELECT DISTINCT last_name , f i r s t _ n a m e
FROM p l a y e r p , c o u n t r y _ c o d e s cc
WHERE ( p . code = cc . code )
AND ( cc . c o u n t r y = ’ C a n a d a ’ )

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 4/45 Février 2015 4 / 45
Requêtes avancées Opérateur IN

Utilisation de sous-requêtes : IN

Exemples : Lister les tournois auxquels a participé Federer


SELECT D I S T I N C T ON ( name ) name , location ,
d a t e _ p a r t ( ’ YEAR ’ , s t a r t d a t e ) , s u r f a c e
FROM t o u r n a m e n t _ b i g WHE R E tid IN
( S E L E C T tid
FROM p l a y e d _ i n _ b i g
WH E RE r e g i s t r n u m IN
( SELECT registrnum
FROM r e g i s t r a t i o n _ b i g
WH E RE pid IN
( S E L E C T pid
FROM p l a y e r _ b i g
WHE R E l a s t _ n a m e
= ’ F e d e r e r ’ )))

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 5/45 Février 2015 5 / 45
Requêtes avancées Opérateur IN

Utilisation de sous-requêtes : IN
Pratique à utiliser sous la forme NOT IN

Les tournois auxquels Federer n’a pas participé


SELECT D I S T I N C T ON ( name ) name , location ,
d a t e _ p a r t ( ’ YEAR ’ , s t a r t d a t e ) , s u r f a c e
FROM t o u r n a m e n t WHER E tid NOT IN
( S E L E C T tid
FROM p l a y e d _ i n
WH E RE r e g i s t r n u m IN
( SELECT registrnum
FROM r e g i s t r a t i o n
WH E RE pid IN
( S E L E C T pid
FROM p l a y e r
WHE R E l a s t _ n a m e
= ’ F e d e r e r ’ ))) . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 6/45 Février 2015 6 / 45
Requêtes avancées Opérateur ALL et ANY

Utilisation de sous-requêtes : ANY, ALL

Deux nouveaux opérateurs manipulant des sous-requêtes : ANY, ALL


< attributs > =| < >| <=| <| >|= > ANY ( < sous - requête >)

évaluée à vraie si au moins un des résultats de la sous requête vérifie la


comparaison avec <attributs>
< attributs > =| < >| <=| <| >|= > ALL ( < sous - requête >)

évaluée à vraie si tous les résultats de la sous requête vérifient la


comparaison avec <attributs>

Nota
< attributs > : peut être une liste d’attributs.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 7/45 Février 2015 7 / 45
Requêtes avancées Opérateur ALL et ANY

Utilisation de sous-requêtes : ANY, ALL

Exemple (alternative au IN) :

SELECT D I S T I N C T ON ( name ) name , location ,


d a t e _ p a r t ( ’ YEAR ’ , s t a r t d a t e ) , s u r f a c e
FROM t o u r n a m e n t _ b i g WHE R E tid = ANY
( S E L E C T tid
FROM p l a y e d _ i n _ b i g
WH E RE r e g i s t r n u m IN
( SELECT registrnum
FROM r e g i s t r a t i o n _ b i g
WH E RE pid IN
( S E L E C T pid
FROM p l a y e r _ b i g
WHE R E l a s t _ n a m e = ’ F e d e r e r ’ ))

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 8/45 Février 2015 8 / 45
Opérateur EXISTS

Utilisation de sous-requêtes : EXISTS

[NOT] EXISTS (<sous-requête>)


évaluée à vraie si la sous-requête renvoie au moins un résultat.
Exemple : Nom, Prenom des joueurs défaits par Nadal
Il faut d’abord déterminer les rencontres où Nadal a gagné et en
déduire les numéro d’inscription des perdants de ces rencontres.

Différence avec ANY


utilisation de EXISTS s’apparente à une condition Booléenne. Pas de
test sur la valeur d’un attribut particulier.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 11/45 Février 2015 11 / 45
Opérateur EXISTS

Les joueurs vaincus par Nadal

S E L E C T D I S T I N C T ON ( last_name , f i r s t _ n a m e ) *
FROM atp . p l a y e r p2
WHERE E X I S T S
( SELECT *
FROM atp . r e g i s t r a t i o n r2 JOIN atp . game g
ON ( r2 . r e g i s t r n u m = g . r e g i s t r n u m 2 )
JOIN atp . r e g i s t r a t i o n r1
ON ( r1 . r e g i s t r n u m = g . r e g i s t r n u m 1 )
W HE RE p2 . pid = r2 . pid
AND r1 . pid =1)

Remarques
pid=1 est le numéro de Rafael Nadal et dans la relation game. Dans
l’état actuel de la base, le numéro d’inscription du vainqueur est
registrnum1.
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 12/45 Février 2015 12 / 45
Opérateur EXISTS Intersection, Union, Différence

Opérateurs ensemblistes

On peut disposer (suivant les implémentations) des opérateurs


ensemblistes
Intersection
< requête1 > I N T E R S E C T < requête2 >

Union
< requête1 > UNI ON < requête2 >

Différence
< requête1 > E X C E P T < requête2 >

En PostgreSQL : UNION, INTERSECT et EXCEPT sont proposés.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 14/45 Février 2015 14 / 45
Opérateur EXISTS Intersection, Union, Différence

NOT EXISTS versus NOT IN

Sur le papier ...


L’utisation de NOT EXISTS et des sous-requêtes corrélées permet
d’émuler complètement la différence. NOT IN convient lorsque le
critère d’élimination porte sur une seule colonne.

Le procédé NOT EXISTS peut s’avérer couteux si les tables ne sont pas
convenablement indexées.

Si les deux tables disposent d’une clé primaire commune, NOT IN


opérant sur les clés primaires suffit.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 17/45 Février 2015 17 / 45
Sous requêtes : WITH

Sous-requêtes nommées, clause WITH

WITH w i t h _ q u e r y _ n a m e [ ( c o l u m n _ n a m e [ , ...] )
AS ( S E L E C T ... )
S E L E C T ....
FROM ...
WH ER E ...
GR OU P BY ...
H A V I N G ...
OR DE R BY ...

Rôle de la sous-requête nommée

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 18/45 Février 2015 18 / 45
La division

Division

Rappel d’algèbre relationnelle : division de R par S


- relation R de schéma R(A1 , A2 , . . . , Ak )
- relation S de schéma S(Ap+1 , . . . , Ak ) (Schema de S ⊂ Schema de R)
La division (ou le quotient) de R par S est une relation T de schéma
T (A1 , . . . , Ap ) formée des tuples qui, concaténés à chaque tuple de S,
donnent un tuple de R.
On note
T =R÷S

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 20/45 Février 2015 20 / 45
La division

Définition de la division
Arbre de requêtes
- R de schéma R(A1 , A2 , . . . , Ak ), S de schéma S(Ap+1 , . . . , Ak )
est la relation T = R ÷ S de schéma T (A1 , . . . , Ap ).

πA1 ,...,Ap πA1 ,...,Ap

R −

× R

πA1 ,...,Ap S

R . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 21/45 Février 2015 21 / 45
La division

Division en SQL (PostgreSQL)

WITH Rp AS (
S E L E C T A1 ,... , Ap
FROM R
)
S E L E C T * FROM Rp
EXCEPT
SELECT A1 ,... , Ap
FROM (
S E L E C T * FROM Rp , S
EXCEPT
S E L E C T * FROM R) R2 ;

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 22/45 Février 2015 22 / 45
La division

Exemple

WITH R AS
( S E L E C T tid , pid
FROM atp . p a r t i c i p a t i o n s
WH E R E d a t e _ p a r t = 2 008 AND s u r f a c e = ’ Clay ’ ) ,
S AS
( S E L E C T D I S T I N C T tid
FROM R ) ,
Rp AS
( S E L E C T D I S T I N C T pid FROM R )
S E L E C T pid
FROM Rp
EXCEPT
S E L E C T pid
FROM
( S E L E C T tid , pid
FROM Rp , S
EXCEPT
SELECT *
FROM R ) U ;

La construction WITH permet de simplifier l’écriture.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 23/45 Février 2015 23 / 45
La division

Illustration de la division

Lister les joueurs qui participé à tous les tournois sur terre battue en 2008
On construit une table intermédiaire, la table des couples pid,tid où
tid est le numéro d’un tournoi disputé en 2008 sur terre battue et pid .

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 25/45 Février 2015 25 / 45
La division

Exemples

Nom, prénom des joueurs qui ont participé à tous les tournois à plus de 5 tours disputés en 2008 sur
terre battue.

S E L E C T last_name , f i r s t _ name , pid


FROM atp . p l a y e r
W HERE pid IN ( WITH R AS
( S E L E C T tid , pid
FROM atp . p a r t i c i p a t i o n s
W HER E d a t e _ p a r t = 2 0 0 8 AND s u r f a c e = ’ Clay ’ AND numrounds >5) ,
S AS
( S E L E C T D I S T I N C T tid
FROM R ) ,
Rp AS
( S E L E C T D I S T I N C T pid FROM R )
S E L E C T pid FROM Rp
EXCEPT
S E L E C T pid FROM
( S E L E C T tid , pid FROM Rp , S
EXCEPT
S E L E C T * FROM R ) U )
O RDER by l a s t _ n a m e
;

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 26/45 Février 2015 26 / 45
Agrégats Fonctions SUM et AVG

Fonctions d’agrégation en SQL

Possibilité de compter, de faire des moyennes, de prendre un


maximum en SQL (contrairement à l’algèbre relationnelle
”classique”)
Possibilité de partitionner et regrouper les données

Dans la partie SELECT


SUM ( D I S T I N C T | ALL < n o m a t t r i b u t >)

Somme des valeurs prises par nomattribut


AVG ( D I S T I N C T | ALL < n o m _ a t t r i b u t >)

Moyenne des valeurs prises par nomattribut


Le type des attributs doit être un nombre ou un entier (sinon, pas
possible de compter...).
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 27/45 Février 2015 27 / 45
Agrégats Fonctions SUM et AVG

Fonctions d’agrégation : SUM et AVG

Exemple : nombre moyen de sets par rencontre pour les tournois


disputés sur terre battue
SELECT AVG ( n u m s e t s )
FROM t o u r n a m e n t t JOIN
game g ON ( t . tid = g . tid ) JOIN
match_results m ON ( g . mid = m . mid )
WHERE t . s u r f a c e = ’ Clay ’ ;

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 28/45 Février 2015 28 / 45
Agrégats Fonctions MAX et MIN

Fonctions de calcul : MAX,MIN

Usage
MAX ( < n o m a t t r i b u t >)

maximum des valeurs prises par <nomattribut>


MIN ( < n o m a t t r i b u t >)

minimum des valeurs prises par <nomattribut>

Nombre maximal de jeux disputés dans un set.


S E L E C T MAX ( w i n n e r g a m e s + l o s e r g a m e s )
FROM s e t s c o r e

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 30/45 Février 2015 30 / 45
Agrégats Fonction COUNT

Fonctions de calcul : COUNT

On peut aussi compter le nombre de tuples dans un résultat de requête


COUNT (*|[ ALL | D I S T I N C T < n o m a t t r i b u t >])

nombre de valeurs prises par le résultat

DISTINCT : sans les doublons


ALL : avec les doublons
* : y compris les valeurs nulles

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 31/45 Février 2015 31 / 45
Agrégats Fonction COUNT

Exemple : Nombre de tournois disputés par


Federer

SELECT CO UN T (*)
FROM t o u r n a m e n t _ b i g WHE R E tid = ANY
( S E L E C T tid
FROM p l a y e d _ i n _ b i g
WH E RE r e g i s t r n u m IN
( SELECT registrnum
FROM r e g i s t r a t i o n _ b i g
WH E RE pid IN
( S E L E C T pid
FROM p l a y e r _ b i g
WHE R E l a s t _ n a m e
= ’ F e d e r e r ’ )))

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 32/45 Février 2015 32 / 45
Partition et groupe GROUP BY

Partition de résultats de requêtes

GROUP BY < n o m a t t r i b u t 1 > , ... , < n o m a t t r i b u t n >

GROUP BY permet de regrouper par valeur de certains attributs


l’ensemble des résultats d’une requête
Forme des sous-relations auxquelles on peut appliquer des
opérateurs (SUM, MAX, ...) renvoyant un résultat unique par groupe.

Exemple d’utilisation : regrouper les livraisons par numéro de fournisseur


et prendre la quantité maximum livrée par fournisseur.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 35/45 Février 2015 35 / 45
Partition et groupe GROUP BY

Partition de résultats de requêtes

Quel est le sens de cette requête ?


S E L E C T fir st _na me , COUN T (*)
FROM atp . p l a y e r
GROU P BY f i r s t _ n a m e

Les attributs présents dans le SELECT sont forcément présents dans le


GROUP BY. Pourquoi ? i.e. cette requête a-t-elle un sens ?
S E L E C T last_name , fi r st_name , MAX ( code )
FROMatp . player
GR OU P BY f i r s t _ n a m e

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 38/45 Février 2015 38 / 45
Partition et groupe GROUP BY

Partition de résultats de requêtes

La clause HAVING permet de poser une condition portant sur


chacune des sous-relations générées par le GROUP BY
Les sous-relations ne vérifiant pas la condition sont écartées du
résultat.
Exemple : liste des pays qui comptent plus de 3 joueurs
S E L E C T code
FROM atp . p l a y e r
GR OU P BY code
H A V I N G C OU NT (*) >= 3

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 39/45 Février 2015 39 / 45
Partition et groupe Tri des résultats

Présentation/tri de résultats

La clause ORDER BY permet de trier le résultat de la requête, en


fournissant la liste des attributs sur lesquels effectuer le tri et en
spécifiant le sens du tri (ascendant ou descendant)

Exemple : liste des tournois sur terre battue par date de


commencement décroissante salaire
S E L E C T name , location , s t a r t d a t e
FROM t o u r n a m e n t
WHERE s u r f a c e = ’ Clay ’
ORDER BY s t a r t d a t e DESC

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 40/45 Février 2015 40 / 45
Partition et groupe Tri des résultats

Regroupement, tri, etc : exemple

Exemple : Que fait cette requête ?


S E L E C T surface ,
d a t e _ p a r t ( ’ M O NTH ’ , s t a r t d a t e ) mois ,
CO UNT (*) n o m b r e
FROM atp . t o u r n a m e n t
WHERE numrounds >5 AND tty p e LIKE ’ S i n g l e s ’
GROUP BY surface , d a t e _ p a r t ( ’ MONTH ’ , s t a r t d a t e )
H A V I N G CO UN T (*) >2
ORDER BY mois ;

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 42/45 Février 2015 42 / 45
Partition et groupe Tri des résultats

Une sortie

surface mois nombre


Hard 1 16
Hard 3 30 Pour chaque mois calendaire,
Clay 4 32 chaque surface, le nombre de
Clay 5 44 tournois disputés en simple,
Grass 6 31 comprenant plus de 5 tours (si ce
Clay 7 18 nombre est supérieur à 2), trié par
Hard 7 16 mois.
Hard 8 61
Hard 9 3 Que serait le nombre moyen de
Carpet 10 6 tournois disputés en simple, par
Hard 10 24 mois et par surface ?
Hard 11 3
(12 rows)

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 43/45 Février 2015 43 / 45
Partition et groupe Tri des résultats

Une réponse

surface mois moyenne


Carpet 1 1
Clay 1 1
S E L E C T surface , Hard 1 6
date_part ( ’ MONTH ’, startdate ) Carpet 2 1
mois , Clay 2 3
COU N T (*)/ Hard 2 6
COUNT ( DISTINCT Clay 3 1
d a t e _ p a r t ( ’ YEAR ’ , s t a r t d a t e )) Hard 3 2
moyenne Clay 4 6
FROM atp . t o u r n a m e n t Clay 5 4
WHERE t t y p e Clay 6 1
LIKE ’ S i n g l e s ’ Grass 6 5
GROUP BY surface , Clay 7 6
date_part ( ’ MONTH ’, startdate ) Grass 7 1
ORDER BY mois ; Hard 7 2
Clay 8 1
Hard 8 4
(25 rows)

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 44/45 Février 2015 44 / 45
Conclusion

Résumé

Syntaxe générale
S E L E C T < attributs >
FROM < relations >
[ WH ER E < condition > ]
[ GR OU P BY < a t t r i b u t s de p a r t i t i o n n e m e n t >
[ H A V I N G < condition >] ]
[ OR DE R BY < critere >]

SELECT : attributs du résultat (avec agrégats éventuels)


WHERE : condition de sélection indépendante du Group By
HAVING : condition de sélection portant sur les agrégats

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
BD4 (Licence MASS, Master ISIFAR, Paris-Diderot) SQL 45/45 Février 2015 45 / 45

Das könnte Ihnen auch gefallen