Académique Documents
Professionnel Documents
Culture Documents
SQL
• Requêtes imbriquées
• Agrégat
• Regroupement
1
Motivation
3
SQL : Requêtes
imbriquées
• Requête imbriquée dans la clause WHERE d'une requête
externe:SELECT …
Requête FROM …
externe WHERE [Expression] Opérateur (SELECT …
FROM … Requête
WHERE …); imbriquée
• Opérations ensemblistes
Le résultat d’une requête (imbriquée) est une table, c’est-à-dire
un
ensemble de tuples.
Les opérations possibles sont donc ensemblistes.
4
Opérateurs ensemblistes
• IN
appartenance ensembliste
(A1,…An) IN <sous-req>
• EXISTS
test d’existence
EXISTS <sous-req>
• COMPARAISON
comparaison avec chaque élément d’un
ensemble
(A1,…An) ALL <sous-req>
opérateur de comparaison (<,>,<=,>=,<>)
5
Expression IN
SELECT …
FROM …
WHERE (A1,…,An)IN (SELECT B1,…,Bn
FROM …
WHERE …);
• Sémantique :
An)de la requête externe
la condition est vraie si tuple désigné par (A1,…,
appartient au résultat de la requête interne.
• Algorithme
Pour chaque tuple des tables de la requête externe, extraire et calculez
le sous-tuple (A1,…An)
Si le tuple obtenu appartient au résultat de la requête imbriquée,
calculez
6
les expressions de projection de la clause SELECT.
Expression NOT IN
SELECT …
FROM …
WHERE (A1,…,An)NOT IN (SELECT B1,…,Bn
FROM …
WHERE …);
• Sémantique :
la condition est vraie si tuple désigné par (A1,…, An)de la requête externe
n’appartient pas au résultat de la requête interne.
• Algorithme
Pour chaque tuple des tables de la requête externe, extraire et calculez
le sous-tuple (A1,…An)
Si le tuple obtenu n’appartient pas au résultat de la requête imbriquée,
calculez les expressions de projection de la clause SELECT.
7
Exemple avec IN
Project)
10
ANY
SELECT …
FROM …
WHERE (A1,…,An) ANY (SELECT B1,
…,Bn FROM …
WHERE …);
13
Exemple avec EXISTS
Emp (Eno, Ename, Title, Project(Pno, Pname, Budget,
City) City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Noms des employés qui travaillent dans une ville où il y a
au
moins
SELECTune.Ename
projet?
FROM Emp e
WHERE EXISTS *
(SELECT Project
WHERE
FROM e.City=Project.City)
16
Exemple avec NOT
EXISTS
Emp (Eno, Ename, Title, Project(Pno, Pname, Budget,
City) City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Noms des projets qui n’emploient aucun ‘Elect Eng’ ?
SELECT p.Pname
FROM Project
WHERE p NOT (SELECT *
EXISTS FROM Works w, Emp e
WHERE w.Pno=p.Pno
and e.Eno=w.Eno
and
e.Title=’Elect.Eng.’);
17
Agrégat
18
Fonctions d'agrégation
SELECT AggFunc(Ai), …, AggFunc(Aj)
FROM R1, ..., Rm
WHERE conditions;
20
Exécution d’une requête
d’agrégation
1. La requête est exécutée classiquement et retourne une table
résultat temporaire dont les colonnes sont les attributs Ai, …,
Aj utilisées dans les fonctions d’agrégation
2. Les fonctions d’agrégation sont appliquées sur les colonnes de
la
table résultat
3. Le résultat de la requête est une table
dont les colonnes sont les noms des expressions de la clause
SELECT
contenant un seul tuple
21
Requête d’agrégation
Personnes
nom prénom salaire
Martin Pierre 2500 SELECT sum(salaire)
FROM Personnes
Dupond Jean 3000
Dupond Marc 4200
Etape 1) Etape 2)
Table-Temp = Table-Resultat =
SELECT salaire SELECT sum(salaire)
FROM Personnes FROM Table-Temp
salaire
2500 Sum(salaire)
3000 agrégation 9700
4200
Table-
22 Table- Resultat
Exemples d'agrégation
dans la clause SELECT
23
Exemple d'agrégation
dans la clause WHERE
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget,
City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
24
Exemples d'agrégation
Emp (Eno, Ename, Title, Project(Pno, Pname, Budget,
City) City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Budget max des projets de Paris avec
identifiant
SELECT ? MAX(Budget)
Pno, Impossible de mélanger une
FROM Project fonction d’agrégation avec un
attribut sans agrégation s’il n’y a
WHERE City = ’Paris’; pas de clause GROUP BY !
26
Requêtes de groupement :
GROUP BY
SELECT A1, …, AggFunc(An+1), …, AggFunc(An+p)
FROM An, R1, …,
WHERE Rm
GROUP …
BY A1 …, An
• Sémantique
Partitionne les tuples résultats en fonction des valeurs de certains attributs
• Algorithme
1. Calcul de la requête brute (sans regroupement ni agrégation)
2. Regroupement horizontal des lignes en sous-tables possédant les mêmes
valeurs de regroupement Aj …, Ak
3. Pour chaque sous-table, calcul des valeurs agrégées pour les attributs
27
non
GROUP BY
SELECT A1, B1, sum(A2)
FROM R1, R2
WHERE A1 < 3
GROUP BY A1, B1
R1
A1 A2
2 6 A1 A2 B1 A1 A2 B1 A1 B1 A2*
1 1 2 6 a 2 6 a 1 a 1
1 1 a where 1 1 a group by 2 A1 B1 sum(A2)
2 8 selec
2 a 6 1 a 3
3 3 from 2 8 a 2 8 a t
2 a 14
1 2 3 3 a 1 2 a 8
3 3 1 2 a
3 3 a
R
2
B
1
a
28
GROUP BY
• Règles de regroupement
Tous les attributs Ai, …, An dans la clause SELECT qui ne sont pas
impliqués dans la clause GROUP BY doivent être inclus
dans une opération d'agrégation
• SELECT Pno,
count(Eno) FROM Works
GROUP BY Pno;
• Sélection des tuples
La clause WHERE permet de
sélectionner les tuples
appartenant aux sous-
tables. La condition est évaluée
AVANT le regroupement.
• SELECT Pno,
29
Exemples de groupement
Emp (Eno, Ename, Title, Project(Pno, Pname, Budget,
City) City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Numéros des projets avec le nombre d’employés impliqués par
projet ?
SELECT Pno, Count(Eno)
FROM Works
GROUP BY Pno;
31
Sélection sur des
SELECTgroupes
A , …, A [AggFunc(A ), …, AggFunc(A ), …]
i n, i j
FROM R , …, R 1 m
WHERE …
GROUP BY Aj …, Ak
HAVING condition
• Sémantique
Sélectionne les groupes (partitions) qui satisfont une certaine condition .
• Algorithme
1. Sélectionne tous les tuples qui satisfont les conditions de la clause WHERE.
2. Forme les groupes qui partagent les mêmes valeurs de la clause GROUP BY.
3. Supprime tous les groupes qui ne satisfont pas les conditions de la clause
HAVING
4. Applique les fonctions d’agrégation pour chaque groupe.
5. Retourne les valeurs des colonnes et des agrégation de la clause SELECT.
32
Sélection sur des
groupes
• Règle : La condition de la clause HAVING porte
Soit sur des valeurs atomiques retournées par un opérateur d'agrégation
sur
les attributs qui n’apparaissent pas dans le GROUP BY
Soit sur des opérations d’agrégation sur des attributs qui apparaissent
dans le GROUP BY
• Exemple
SELECT DISTINCT produit.nom,
SUM(vente.qt*produit.prix) AS "total produit",
FROM vente, produit
WHERE produit.id = vente.produit_idx and nom like’a
GROUP %’
HAVINGBYMIN(vente.qt)>1;
produit.nom
33
Exemples de groupement avec sélection
>
SELECT DISTINCT Pno
2; FROM Works where resp=‘Oui’
GROUP BY Pno, Resp
• Projets dans HAVING COUNT(DISTINCT ENO) > 2;
34 lesquels plus de
Exemples de groupement avec sélection