cours 4 - efreidoc.frefreidoc.fr/l3/bdd/cours/cours complet 1/20xx-xx.cours.04... · 2018. 6....
TRANSCRIPT
-
SQL query -4 / 33Djamel Berrabah
Requêtes avec opérateurs ensemblistes
Villes où il y a soit un employé soit un projet?
( SELECT City FROM Emp) UNION( SELECT City FROM Project)
Villes où il y a des employés mais pas de projets?
( SELECT City FROM Emp) EXCEPT( SELECT City FROM Project)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -6 / 33Djamel Berrabah
Requête imbriquée dans la clause WHERE d'une requête externe:SELECT …FROM …WHERE [Opérande] Opérateur ( SELECT …
FROM … WHERE …)
Opérateurs ensemblistes : • (A 1,…An) IN : appartenance ensembliste
• EXISTS : test d’existence (réponse non-vide)
• (A 1,…An) [ ALL| ANY] : comparaison avec quantificateur (ANY par défaut)
SQL : Requêtes imbriquées
-
SQL query -7 / 33Djamel Berrabah
SELECT …FROM …WHERE (A 1,…, An) [ NOT] IN ( SELECT B1,…,B n
FROM … WHERE …)
Sémantique : la condition est vraie si le n-uplet désigné par (A1,…, An) de la requête externe appartient (n’appartient pas) au résultat de la requête imbriquée.
Expression « IN »
-
SQL query -9 / 33Djamel Berrabah
Exemple avec “IN”
Noms des employés qui travaillent dans des villes où il y a [n’y a pas] des projets de budget inférieur à 50 k€ ?
SELECT EnameFROMEmpWHERE City [ NOT] IN ( SELECT City
FROM Project WHERE Budget < 50)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -11 / 33Djamel Berrabah
Exemple avec “EXISTS”
Noms des employés qui travaillent dans une ville où il y a un projet?
SELECT Ename FROM EmpWHERE EXISTS ( SELECT *
FROM Project WHERE Emp.City=Project.City)
Noms des employés qui travaillent dans une ville sans projet?
SELECT Ename FROM EmpWHERE NOT EXISTS ( SELECT *
FROM Project WHERE Emp.City=Project.City)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -13 / 33Djamel Berrabah
Calcul relationnel et SQL
Requête SQL de base:
SELECT r i . Ao, …, r j . Ap FROM R1 r 1, Ri r i , …, Rj r j , …, Rk r k WHERE P( r 1, r 2, …, r k)
Calcul relationnel :{ (r i.Ao ,…, rj.Ap) | ∃r l,..., ∃rk (R1(r1 ) ∧ Ri (r i ) ... ∧ Rk(rk ) ∧
P(r1,..., rk ) ) }
Rappel: SQL (sans fonctions d’agrégation et de groupement) est équivalent au calcul relationnel sain (et à l’algèbre relationnel).
-
SQL query -14 / 33Djamel Berrabah
Calcul relationnel et SQL
Employés qui travaillent dans tous les projets? • Algèbre relationnelle : πENO, PNO (Works) ÷ πPNO (Project)
• Calcul relationnel (division) :{ e.Eno | Emp(e) ∧∀p ( Project(p) ⇒ ∃ w( Works(w) ∧
p.Pno = w.Pno ∧ w.Eno= e.Eno ))}{ e.Eno | Emp(e) ∧∀p (¬Project(p) ∨ ∃ w( Works(w) ∧
p.Pno = w.Pno ∧ w.Eno= e.Eno ))}
Eliminer ∀: ∀x F(x) ≡ ¬∃x(¬ F(x)){ e | Emp(e) ∧¬∃ p (Project(p) ∧ ¬∃ w( Works(w) ∧
p.Pno = w.Pno ∧ w.Eno = e.Eno ))}
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -16 / 33Djamel Berrabah
SQL : interrogation de BD
Requêtes d'interrogation simplesRequêtes complexesSQL et le calcul relationnel Agrégats et groupementCouplage SQL et langage de programmation
-
SQL query -18 / 33Djamel Berrabah
Exemples d'agrégation
Budgets totaux des projets de Paris?SELECT SUM(Budget)FROM ProjectWHERECity = ‘Paris’
Nombre de villes où il y a un projet avec l'employé E4?SELECT COUNT( DISTINCT City)FROM Project, WorksWHEREProject.Pno = Works.PnoAND Works.Eno = ‘E4’
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -19 / 33Djamel Berrabah
Fonctions d'agrégation
Noms des projets dont le budget est supérieur au budget moyen?
SELECT PnameFROM ProjectWHEREBudget > ANY
( SELECT AVG(Budget) FROM Project)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -21 / 33Djamel Berrabah
GROUP BY
SELECT A1, B1, sum(A2)FROM R1, R2
WHERE A1 < 3GROUP BY A1, B1
R1 A1 A2
R2 B1
A1 A2 B1
A1 A2 B1
group by
from
where
A1 B1 sum(A2) select
A1 B1 A2*
143
12
68
6182
2121
22
11
2
2
13
1
3
6
8
23
1
3
a
a
aa
a
a
a
aaa
a
aaa
a
2
2
13
1
3
6
8
23
1
3
-
SQL query -22 / 33Djamel Berrabah
Exemples de groupement
Numéros des projets avec le nombre d’employés impliqués par projet ?SELECTPno, Count(Eno)FROM WorksGROUP BY Pno
Noms des projets avec la durée moyenne et la durée maximale de participation d’un employé par projet ?SELECT Pname, AVG(Dur), MAX(Dur)FROM Works, ProjectWHERE Works.Pno=Project.PnoGROUP BY Pno, Pname
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -23 / 33Djamel Berrabah
Predicats sur des groupesPour garder les groupes (partitions) qui satisfont une certaine
condition :SELECT Ai , …, AnFROM R1, …, Rm WHERE PGROUP BY Aj …, AkHAVING Q
Règle : La condition Q porte généralement sur des valeurs atomiques retournées par un opérateur d'agrégation sur les attributs qui n’apparaissent pas dans le GROUP BY
-
SQL query -24 / 33Djamel Berrabah
Exemples de groupement
Villes dans lesquelles habitent plus de 2 employés?SELECTCityFROM EmpGROUP BY CityHAVING COUNT(ENO) > 2
Projets dans lesquels plus de 2 employés partagent une responsabilité?SELECT DISTINCT PnoFROM WorksGROUP BY Pno, RespHAVING COUNT(DISTINCT ENO) > 2
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
-
SQL query -25 / 33Djamel Berrabah
SQL : interrogation de BD
Requêtes d'interrogation simplesRequêtes complexesSQL et le calcul relationnel Agrégats et groupementCouplage SQL et langage de programmation
-
SQL query -27 / 33Djamel Berrabah
Développement d'applicationProgramme source
avec SQL « embedded »
Préprocesseur
Programme source
Compilateur
Fichiers objets
Edition de liens
Exécutable
Bibliothèques(fcts. SQL, ...)
Autres fichiersobjets et bibs
-
SQL query -30 / 33Djamel Berrabah
CurseursSi la requête retourne un ensemble de n-uplets, il faut utiliser un
curseur qui permet d’accéder successivement aux n-uplets du résultat de la requête SQL:• déclarer (declare) le curseur :
� associe un identificateur de curseur avec une requête SQL
• ouvrir (open) le curseur :� exécution de la requête et génération du résultat (vue logique)� positionner le curseur avant le premier n-uplet
• récupérer (fetch) un n-uplet :� avancer le curseur (boucle)� affecter des variables avec les valeurs du n-uplet pointé par le curseur
• fermer (close) le curseur.
-
SQL query -31 / 33Djamel Berrabah
Exemple de curseurPour chaque projet employant plus de 2 programmeurs, donner le numéro de
projet et la durée moyenne d'affectation des programmeurs…EXEC SQL BEGIN DECLARE SECTION;
char pno[3]; /* project number */real avg-dur; /* average duration */
EXEC SQL END DECLARE SECTION;…EXEC SQL DECLARE duration CURSOR FOR
SELECT Pno, AVG(Dur)FROM WorksWHERE Resp = ‘Programmer’GROUP BY PnoHAVING COUNT(*) > 2;…EXEC SQL OPEN duration ;…while(1) {
EXEC SQL FETCH FROM duration INTO :pno , :avg-durif(strcmp(SQLSTATE, “02000”) then breakelse < print the info >
}EXEC SQL CLOSE duration…
-
SQL query -32 / 33Djamel Berrabah
PL/SQL d’OraclePL/SQL : langage de programmation procédural intégrant SQL.
Bloc PL/SQL : regroupement logique de déclarations et d’ordres.declare
sal number;begin
SELECTSALARY INTO salFROM PAYWHERE TITLE = ‘Programmer’;if sal>10 then
UPDATE PAYSET SALARY = SALARY * 1.1WHERE TITLE = ‘Programmer’;
end if;COMMIT;
exceptionwhen no_data_found then
INSERT INTO ERROR values (‘TITLE inexistant’);
-
SQL query -33 / 33Djamel Berrabah
Traitement de PL/SQL
BlocPL/SQL Exécution
Analyse
Moteur PL/SQL
Serveur Oracle