BD Avance Chap3
December 1, 2022 | Author: Anonymous | Category: N/A
Short Description
Download BD Avance Chap3...
Description
Requêtes d’interrogation SQL • Requêtes imbriquées • Agrégat • Regroupement
1
Motivation
• Les requêtes déjà vues ne correspondent correspondent qu’à des opérations simples • Vers le PL/SQL • Requête imbriquée
Parfois la valeur d’un test doit être calculé comme le résultat d’une autre requête
• Agrégat
Opération destinée à agréger agréger plusieurs valeurs valeurs de tuples en en une seule seule valeur (en les additionna additionnant, nt, en calculant leur moyenne, etc.)
• Regroupement
Décomposition d’une table en plusieurs p lusieurs sous-tables sur lesquels des opérations seront effectuées effectuées sous-table par sous-table (des agrégats par
2
opérations seront effectuées effectuées sous table par sous table (des agrégats par
Requêtes imbriquées
3
SQL : Requêtes
imbriquées
• Requête imbriquée dans la clause WHERE d'une requête externe::SELECT … externe Requête externe
FROM … WHERE
[Expression] [Expressio n] Opérateur Opérateur (SELECT … … … FROM WHERE …);
• Opéra Opérations tions ensemblistes
4
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.
Requête imbriquée
Opérateurs ensemblistes
• IN
appartenance ensemblis ensembliste te
(A1,…An)
IN
• EXISTS
test d’existence
EXISTS
• COMPARAISON comparaison avec chaque élément d’un ensemble (A1,…An) ALL
opérateur de comparaison (,=,)
5
Expression IN
SELECT … FROM … WHERE (A1,…,An)IN (A1,…,An)IN
(SELECT B1,…,Bn FROM … WHERE …); …);
• Sémantique :
la condition est vraie si tuple désigné par (A 1,…,
A n)de la requête externe
appartient au résultat de la requête interne interne..
• Algorithme
Pour chaque tuple des tables de la requête externe, extraire et calculez calculez le sous-tuple (A1,…An)
Si le tuple obtenu appartient au résultat de la requête imbriquée, calculez les expressions de projection de la clause SELECT.
6
Expression NOT IN
SELECT … FROM … WHERE (A1,…,An) NOT NOT
IN ( IN (SELECT SELECT B1,…,Bn FROM … WHERE …); …);
• Sémantique :
la condition est vraie si tuple désigné par (A 1,…, A n)de la requête externe n’appartient pas au résultat de la requête interne interne..
• Algorithme
Pour chaque tuple des tables de la requête externe, externe, extraire et calculez 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 Emp (Eno, Ename, Title, City) Pay(Title, Salary)
des employés qui • Noms travaillent dans des villes où il y a des projets de budget inférieur à 50? SELECT Ename FROM Emp WHERE City IN (SELECT City
FROM Project WHERE Budget 50000)
12
EXISTS
SELECT … FROM R1 x… WHERE EXISTS ( WHERE EXISTS (SELECT SELECT B1,…,Bn FROM … WHERE Condition(x) Condition(x) …);
Les deux requêtes sont généralement corrélées, la requête imbriquée dépend de la valeur de x.
• EXISTS retourne VRAI ou FAUX • Sémantique :
La condition EXISTS est vraie si la requête imbriquée n’est pas vide.
• Algorithme 1.
Pour chaque tuple des tables de la requête externe, calculez le sous-tuple (A1,…An)
extraire et
2.
Si le résultat de la requête imbriquée n’est pas vide, alors calculez les expressions de projection de la clause SELECT.
13
Exemple avec EXISTS
Emp (Eno, Ename, Title, City) Pay(Title, Salary)
Project(Pno, Pname, Budget, City) Works(E (Eno, no, Pn Pno, o, Resp Resp,, Dur) Dur)
• Noms des employés qui travaillent dans une ville où il y a au moins projet? e.Ename SELECTun FROM
WHERE
Emp e
EXISTS (SELECT
* Project WHERE FROM e.City=Project.City)
• Noms des projets qui emploient des ‘Elect Eng’ ? Pname SELECT p. Project p FROM WHERE EXISTS (SELECT *
FROM Works w, Emp e WHERE w.Pno=p.Pno and e.Eno=w.Eno e.Eno=w.Eno
and
14
Exemple avec EXISTS
Emp (Eno, Ename, Title, City) Pay(Title, SELECT Salary) p.Pname FROM WHERE
Project(Pno, Pname, Budget, City) Works(E (Eno, no, Pn Pno, o, Resp Resp,, Dur) Dur)
Project p EXISTS (SELECT * FROM Works w, Emp e WHERE e.Eno=w.Eno Ande.Title=’Elect.Eng.’)
La requête imbriquée ne dépend pas de p : elle retourne l’ensemble des employés de titre ‘Elect. Eng.’, indépendamment indépenda mment du projet sélectionné s électionné dans la requête externe. La clause EXISTS retourne donc toujours vraie (on suppose qu’il existe un tel employé) et la requête externe retourne tous les noms de projets.
15
NOT EXISTS
SELECT … FROM R1 x… WHERE NOT EXISTS ( WHERE NOT EXISTS (SELECT SELECT B1,…,Bn FROM … WHERE Condition(x)); Condition(x) );
Les deux requêtes sont généralement corrélées, la requête imbriquée dépend de la valeur de x.
• NOT EXISTS retourne VRAI ou FAUX FAUX • Sémantique :
La condition NOT EXISTS est vraie si la requête imbriquée est vide.
• Algorithme 1.
Pour chaque tuple des tables de la requête externe, calculez le sous-tuple (A1,…An)
extraire et
2.
Si le résultat de la requête imbriquée est vide, alors calculez les expressions de projection de la clause SELECT.
16
Exemple avec NOT EXISTS
Emp (Eno, Ename, Title, City) Pay(Title, Salary)
Project(Pno, Pname, Budget, City) Works(E (Eno, no, Pn Pno, o, Resp Resp,, Dur) Dur)
• Noms des projets qui n’emploient aucun ‘Elect Eng’ ? SELECT p. Pname Project FROM
WHERE
p NOT
(SELECT *
EXISTS
FROM Works w, 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 FROM WHERE
•
Une fonction d’agrégation permet de calculer une seule valeur numérique à partir des valeurs de plusieurs tuples pour un attribut donné
• •
i), …, AggFunc(A j) AggFunc(A R1, ..., Rm conditions;
Exemple: la somme des budgets des projets
Une fonction d’agrégation prend un attribut en paramètre On utilise une fonction d’agrégation
dans la clause SELECT pour effectuer un calcul post-pro post-projection jection
dans la clause WHERE pour remplacer une valeur par un calcul dans une condition. Ce calcul est le résultat de l’agrégation d’une requête imbriquée.
19
Fonctions d’agrégation
Fonction
Description
COUNT( COU NT([DI [DISTI STINCT NCT]x,y ]x,y,…) ,…) Décomp Décompte te des tup tuples les du rés résult ultat at par projection sur le ou les attributs spécifiés (ou tous avec ‘*’).les L’option DISTINCT élimine doublons. MIN(x), MAX(x), AVG(x), SUM(x)
Calculent respectivement le minimum, le maximum, la moyenne et la somme des valeurs de l’attribut X.
20
Exéc écut utio ion n d’une d’une re requ quêt êtee Ex d’agrégation 1. La requê requête te est est exéc exécuté utéee classi classiquem quement ent et retou retourne rne une tab table le résultat temporaire dont les colonnes sont les attributs Ai, …, Aj utilisées dans les fonctions d’agrégation 2. Les fonc fonctio tions ns d’agr d’agréga égatio tion n sont sont appli appliqué quées es sur sur les les colon colonnes nes de la table résultat 3. Le ré résu sult ltat at de la req requê uête te est est un unee tab table le dont les colonnes sont les noms des expressions de la clause SELECT
contenant un seul tuple
21
Requête d’agrégation
Personnes
no m
pr éno m
s alair e
Martin
Pierre
2500
Dupond
J ea n
3000
D up ond
Marc
4200
Etape 1) Table-Temp = SELECT salaire FROM Personnes
SELECT sum(salaire) sum(salaire) FROM Personnes
Etape 2) Table-Resultat = SELECT sum(salaire) sum(salaire) FROM Table-Temp
salaire 2500 3000 4200
Sum(salaire ) agrégation
9700 TableResultat
Resultat
Table Tem
22
Exemples d'agrégation dans la clause SELECT
Emp (Eno, Ename, Title, City) City) Pay(Title, Salary)
•
Budget max des projets de Paris? SELECT MAX(Budget) Project FROM City = ’Paris’;
WHERE • Affichage du nombre d’employés SELECT COUNT(*) FROM Emp;
Project(Pno, Pname, Budget, Works(Eno, Pno, Resp, Dur)
il y a un projet projet avec • Nombre de villes où il l'employé E4? SELECT COUNT(DISTINCT City) FROM Project, Works = Works.Pno WHERE Project.Pno Works.Eno = ’E4’; AND
23
Exemple d'agrégation dans la clause WHERE
Emp (Eno, Ename, Title, City) City) Pay(Title, Salary)
Project(Pno, Pname, Budget, Works(Eno, Pno, Resp, Dur)
projets dont le budget budget est supérieur au budget budget • Noms des projets moyen? SELECT Pname FROM
Projec t WHERE Budget > (SELECT AVG(Budget)
FROM Project);
24
Exemples d'agrégation Emp (Eno, Ename, Title, City) Pay(Title, Salary)
Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur)
• Budget max des projets de Paris avec SELECT Pno, identifiant ? MAX(Budget) FROM Project WHERE City = ’Paris’;
Impossible de mélanger une fonction d’agrégation avec un attribut sans agrégation s’il n’y a pas de clause GROUP BY !
• Budget max des projets de Paris avec identifiant ? SELECT Pno, Pno, Budge Budget t FROM Project WHERE City = ’Paris’ AND Bud Budget get = (SELECT
MAX(Budget)
FROM Project); 25
Regroupement
26
Re Requ quêt êtes es de de gr grou oupe peme ment nt :
SELECT FROM WHERE GROUP
A 1,
), …, …, AggFunc(A GROUP BY n+1
AggFunc(A n+p)
A n, R1, …, Rm …
BY A 1 …, A n
• 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 horizontal des lignes en sous-tables possédant les mêmes valeurs de regroupemen regroupementt A …, A j k
3.
Pour chaque sous-table, calcul des valeurs agrégées pour les attributs
non
27
GROUP BY
SELECT A1, B1, sum(A2) FROM R1, R 2 WHERE A1 < 3 GROUP BY A1, B1 R1 A1 A2 2 6 1 2 3 1 3
1 8 3 2 3
A1 A2 A 2 B1 2 6 a 1 1 a
from
R 2 B 1
a
2 3 1 3
8 3 2 3
a a a a
A1 A2 A2 2 6 where 1 1 2 1
8 2
B1 a a a a
group by
A1 B1 A2* 1 a 1 2 2
a
6 8
selec t
A1 B1 sum(A2) 1 2
a a
3 14
28
GROUP BY
• Règles de regroupement
Tous les attributs A i, …, A n dans la clause SELECT qui ne sont pas impliqués dans la clause GROUP BY doivent être inclus dans une opération d'agrégat d 'agrégation ion • SE SEL LECT
Pno, count(Eno) FROM Works GROUP BY Pno;
• Sélection des tuples
La clause WHERE permet de sélectionner les tuples appartenant aux soustables. La condition est évaluée AVANT le regroupement.
29
• SE SEL LECT
Pno, count Eno FROM Works
Exem ples es de gr grou oupe peme ment nt Exempl
Emp (Eno, Ename, Title, City) Pay(Title, Salary)
Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur)
• Numéros des projets avec le nombre d’employés impliqués par projet ? SELECT Pno, FROM GROUP
Count(Eno)
Works
BY Pno;
• Noms des villes avec la durée moyenne moyenne et la durée maximale de participation d’un employé par ville et par projet ? SELECT City, Pname, AVG(Dur), MAX(Dur) Works, Project FROM
WHERE Works.Pno=Project.Pno GROUP BY City, Pname;
30
Exemple de groupement ordonné
Classement des produits par la valeur totale vendue pour produits les SELECT DISTINCT produit.nom, SUM(vente.qt * AS total FROM produit, vente WHERE produit.id = GROUP vente.produit_idx BY ORDER produit.nom BY total;
Le tri des résultats se fait APRES le regroupement et l’agrégation.
produit.prix)
31
Séle ctio ion n su surr de dess Sélect
SELECT FROM WHERE GROUP HAVING
A i, …, A n, [AggFunc(A i), …, AggFunc(A j), …]
groupes …
R1, …, Rm
BY A j …, A k
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.
Retourne les valeurs des colonnes et des agrégation de la clause SELECT.
5. 32
Séle ctio ion n su surr de dess Sélect
groupes
• Règle : La condition de la clause HAVING porte
Soit sur des valeurs atomique atomiquess retournées par un opérateur d'agrégation 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 FROM
total pro produi duit, t,
WHERE pro produi duit.i t.id d
vente ven te
= ven vente. te.pro produi duit_i t_idx dx
GROUP BY produit.nom HAVING nom like ’a%’ AND MIN(vente.qt)>1;
HAVING nom like
a%
AND MIN(vente.qt) 1;
33
Exemples de groupement avec sélection Emp (Eno, Ename, Title, City) Pay(Title, Salary)
Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur)
• Villes dans lesquelles habitent plus de 2 employés? SELECT City Emp FROM GROUP
BY
City HAVING COUNT(ENO)
> 2;
• Projets dans 34
Exemples de groupement avec sélection Afficher Les modèles de voitures qui proposent un choix de plus de 10 couleurs.
Voiture ( id_voitur id_voiture, e, model, couleur, couleur,…) …) SELECT DISTINCT model FROM voiture GROUP BY model HAVING COUNT(couleur) > 10; Classement des produits par la valeur totale vendue pour les produits commençant par la lettre ‘M’. Produit( Produi t( id, id , nom, prix,…)
vente( id_vente, produit_idx produit_idx*, qt, prix,…) SELECT DISTINCT produit.nom, SUM(vente.qt * produit.prix) AS total FROM produit, vente vente WHERE produit.id=vente.produit_idx GROUP BY produit.nom HAVING produit.nom like ’M%’
View more...
Comments