4 SQL Query - Equipe BD@LIP6

Transcription

4 SQL Query - Equipe BD@LIP6
SQL – Partie 2
Interrogation sur plusieurs tables
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
1
SQL : interrogation de BD
Jointures
Requêtes imbriquées
Discussion
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
2
Rappel : Requêtes impliquant une
table
SELECT liste-colonnes
FROM Table
WHERE Condition;
Sélectionne
les colonnes précisées dans le SELECT
provenant de la table précisée dans le FROM
dont les lignes vérifient les conditions précisées dans le
WHERE.
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
3
Produit cartésien : Requêtes
impliquant plusieurs tables
SELECT Atts
FROM T1, T2 …, Tn
WHERE Condition ;
Atts liste d'attributs ∈Att(T1)*Att(T2)*…*Att(Tn)
Condition contient des sous-conditions de la forme
- Ti.a θTi.b ou
- Ti.a θ cste
où a et b sont des attributs de Ti, cste une constante et i=1..n
Schéma = concaténation des attributs des Ti restreints à Atts
Résultat = TOUTES les combinaisons des n-uplets de T1,
…,Tn vérifiant Condition
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
4
Exemple
EMP
ENO
E1
E2
E3
E4
E5
E6
E7
E8
ENAME
TITLE
J. Doe
M. Smith
A. Lee
J. Miller
B. Casey
L. Chu
R. Davis
J. Jones
Elect. Eng
Analyst
Mech. Eng.
Programmer
Analyst
Elect. Eng.
Mech. Eng.
Analyst
PAY
TITLE
Elect. Eng.
Analyst
Mech. Eng.
Programmer
SALARY
55000
70000
45000
60000
SELECT ENO, ENAME, EMP.TITLE, SALARY
FROM EMP, PAY
WHERE EMP.TITLE='Analyst'
SALARY
ENO
ENAME
EMP.TITLE
E2
E2
M. Smith
M. Smith
Analyst
Analyst
55000
70000
E2
M. Smith
Analyst
45000
E2
M. Smith
Analyst
60000
E5
B. Casey
Analyst
55000
E5
B. Casey
Analyst
70000
E5
E5
B. Casey
B. Casey
Analyst
Analyst
45000
60000
E8
E8
E8
E8
J. Jones
J. Jones
J. Jones
J. Jones
Analyst
Analyst
Analyst
Analyst
55000
70000
45000
60000
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
5
Jointure
SELECT liste-colonnes
FROM T1, …, Tn
WHERE Condition;
Condition contient des sous-conditions de la forme
Ti.a θ Tj.b ou Ti.a θ cste
Schéma avant la projection = concaténation des attributs des
différentes tables Ti
Résultat avant la projection = TOUTES les combinaisons des
lignes de T1, …,Ti dont on ne garde que les lignes vérifiant
Condition
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
6
Jointure : remarques
Un tuple de la table nomtable1 apparait dans le résultat de le
jointure s'il joint avec au moins 1 tuple de nomtable2
Souvent un tuple joint avec plusieurs, d'où l'utilisation fréquente
d'un DISTINCT dans le SELECT
Si un attribut de même nom dans les 2 tables alors nécessité de
préfixer l'attribut par le nom de la table (ou par son renommage
si la table est renommée)
Si oubli de la condition de jointure... produit cartésien ! Donc si
k tables dans le from, en général au minimum k-1 conditions de
jointure dans le WHERE
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
7
Exemples de jointure (1)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)
Noms et salaire des employés ?
SELECT Ename, Salary
FROM
Emp, Pay
WHERE Emp.Title = Pay.Title
Noms et titres des employés qui travaillent dans un
projet pendant plus de 17 mois?
SELECT Ename, Title
FROM
Emp, Works
WHERE Dur > 17
AND Emp.Eno = Works.Eno
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
8
Exemples de jointure (2)
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)
Numéros et noms des projets dans lesquels a travaillé
l'employé 10?
SELECT Project.Pno, Pname
FROM
Project, Works
WHERE Eno=10
AND Project.Pno = Works.Pno
Noms et titres des employés qui travaillent dans un
projet à Paris ?
SELECT Ename, Title
FROM
Emp E, Works W, Project P
WHERE P.City = ‘Paris’
AND
E.Eno = W.Eno
AND W.Pno = P.Pno
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
9
Exemple
EMP
ENO
E1
E2
E3
E4
E5
E6
E7
E8
ENAME
TITLE
J. Doe
M. Smith
A. Lee
J. Miller
B. Casey
L. Chu
R. Davis
J. Jones
Elect. Eng
Analyst
Mech. Eng.
Programmer
Analyst
Elect. Eng.
Mech. Eng.
Analyst
PAY
TITLE
Elect. Eng.
Analyst
Mech. Eng.
Programmer
SALARY
55000
70000
45000
60000
SELECT ENO, ENAME, EMP.TITE, SALARY
FROM EMP, PAY
WHERE EMP.TITLE=PAY.TITLE
ENO
ENAME
EMP.TITLE
SALARY
E1
E2
J. Doe
M. Smith
Elect. Eng.
Analyst
55000
70000
E3
A. Lee
Mech. Eng.
45000
E4
J. Miller
Programmer 60000
E5
B. Casey
E6
E7
E8
Analyst
70000
L. Chu
Elect. Eng.
55000
R. Davis
J. Jones
Mech. Eng.
Analyst
45000
70000
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
10
Auto-jointure : un exemple
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary)
Works(Eno, Pno, Resp, Dur)
Nom des employés originaires de la même ville?
SELECT E1.Ename, E2.Ename
FROM
Emp E1, Emp E2
WHERE E1.City = E2.City
EMP :
Résultat :
Eno
Ename Title
City
10
Pierre
Analyst
London
20
Lucy
Engineer
Paris
30
Yifan
RH
Munich
40
Anne
RH
London
50
Ryadh
Analyst
Paris
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
E1.Ename
E2.Ename
Pierre
Pierre
Pierre
Anne
Lucy
Lucy
Lucy
Ryadh
Yifan
Yifan
Anne
Anne
Anne
Pierre
Ryadh
Ryadh
Ryadh
Lucy
11
Cas particulier : l'auto-jointure
Auto-jointure : jointure impliquant 2 fois la même table
SELECT liste-colonnes
FROM T1 var1, T1 var2
WHERE conditions;
Renommage des tables dans le FROM obligatoire
Tous les attributs préfixés par var1 et var2 car présents dans les 2
tables T1 et T2 respectivement
Attention car un enregistrement dans T1 apparait aussi dans T2
(et donc peut joindre avec lui-même suivant le prédicat de
jointure)
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
12
Auto-jointure : un exemple(2)
Comment améliorer ? 1ère idée
Nom des employés originaires de la même ville?
SELECT
FROM
WHERE
AND
E1.Ename, E2.Ename
Emp E1, Emp E2
E1.City = E2.City
E1.Ename <> E2.Name
EMP :
Eno
Ename Title
Résultat :
City
10
Pierre
Analyst
London
20
Lucy
Engineer
Paris
30
Yifan
RH
Munich
40
Anne
RH
London
50
Ryadh
Analyst
Paris
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
E1.Ename
E2.Ename
Pierre
Anne
Lucy
Ryadh
Anne
Pierre
Ryadh
Lucy
13
Auto-jointure : un exemple(3)
Comment améliorer ? 2ème idée
Nom des employés originaires de la même ville?
SELECT
FROM
WHERE
AND
E1.Ename, E2.Ename
Emp E1, Emp E2
E1.City = E2.City
E1.Ename < E2.Name
EMP :
Résultat :
Eno
Ename Title
City
10
Pierre
Analyst
London
20
Lucy
Engineer
Paris
30
Yifan
RH
Munich
40
Anne
RH
London
50
Ryadh
Analyst
Paris
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
E1.Ename
E2.Ename
Lucy
Ryadh
Anne
Pierre
14
SQL : interrogation de BD
Jointures
Requêtes imbriquées
Discussion
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
15
SQL : Requêtes imbriquées
Requête imbriquée dans la clause WHERE d'une requête externe:
SELECT …
FROM
…
WHERE [Opérande] Opérateur (SELECT …
FROM …
WHERE …)
3 imbrications possibles :
• (A1,…An) IN <sous-req> exprime inclusion ensembliste
• EXISTS <sous-req> exprime condition d’existence
• (A1,…An) <comp> [ALL|ANY] <sous-req> exprime
comparaison avec quantificateur (ANY par défaut)
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
16
Expression « IN »
SELECT …
FROM …
WHERE (A1,…,An)[NOT] IN (SELECT B1,…,Bn
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 interne.
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
17
Exemple avec “IN”
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des employés qui habitent dans des villes où il y a
des [n’y a pas de] projets de budget inférieur à 50?
SELECT Ename
FROM Emp
WHERE City [NOT] IN (SELECT City
FROM Project
WHERE Budget < 50)
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
18
Imbrications avec IN : remarques
La requête interne est effectuée dans un premier temps et son
résultat est stocké (temporairement) en RAM (ou sur disque si
trop gros!)
La requête interne n'utilise pas la (les) table(s) de la requête
externe
Le IN étant ensembliste, les nuplets retournés par la requête
interne doivent être du même format que le nuplet avant le IN
(même nombre d'attributs et de même domaine, par forcément de
même nom)
Le SELECT de la requête externe ne peut retourner que des
attributs appartenant aux tables placées dans son FROM
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
19
ALL/ANY
SELECT …
FROM …
WHERE (A1,…,An) θ
ALL/ANY (SELECT B1,…,Bn
FROM …
WHERE …)
On peut utiliser une comparaison θ∈{=, <, <=, >, >=, <>} et
ALL (∀) ou ANY (∃): La condition est alors vraie si la
comparaison est vraie pour tous les n-uplets /au moins un n-uplet
de la requête interne.
Comment peut-on exprimer « IN » avec ALL/ANY?
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
20
Imbrications avec ANY/ALL :
remarques
Comme le IN :
La requête interne est effectuée dans un premier temps
La requête interne n'utilise pas la (les) table(s) de la requête externe
les nuplets retournés par la requête interne doivent être du même
format que le nuplet avant le ANY/ALL
Le SELECT de la requête externe ne peut retourner que des attributs
appartenant aux tables placées dans son FROM
Le ANY/ALL obligatoire devant le comparateur car le SELECT interne
retourne plusieurs nuplets auxquels on veut comparer 1 nuplet
Alors que le IN ne couvre que l'égalité (appartenance ensembliste) le
ANY/ALL permet de faire des inégalités
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
21
Exemple avec “ANY”
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des projets lyonnais de budget supérieur à (au moins) un
budget de projet parisien?
SELECT Pname
FROM Projet
WHERE City = 'Lyon'
AND Budget > ANY (SELECT Budget
FROM Project
WHERE City='Paris')
Pas possible avec un IN... mais comment faire avec une jointure ?
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
22
Exemple avec “ALL”
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des professions ayant le plus petit salaire?
SELECT Title
FROM Pay
WHERE Salary <= ALL (SELECT Salary
FROM Pay)
Ici IN ou jointure impossible !
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
23
Expression “EXISTS”
Q
SELECT …
FROM …
WHERE
Q’
[NOT] EXISTS (SELECT *
FROM …
WHERE P)
Sémantique procédurale :
pour chaque n-uplet x de la requête externe Q, exécuter la
requête interne Q’; s'il existe au moins un [s'il n'existe aucun] nuplet y dans le résultat de la requête interne, alors sélectionner x.
Sémantique logique :
{ x… | Q(x) ∧ [¬]∃ y (Q’(y) }
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
24
Imbrications avec EXISTS :
remarques
Contrairement au IN/ANY/ALL :
Les deux requêtes sont corrélées : la condition P dans la requête interne
Q’ exprime une jointure entre les tables de Q’ et les tables de la requête
externe Q.
=> la requête interne exécutée pour chaque enregistrement de la requête
externe
Seule l'existence d'un résultat importe d'où le * dans le SELECT de la
requête interne en général... si autre attribut attention aux valeurs nulles
Par contre comme le ANY/ALL :
Le SELECT de la requête externe ne peut retourner que des attributs
appartenant aux tables placées dans son FROM
Permet des comparaisons autres que l'égalité dans l'expression de la
jointure
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
25
Exemple avec “EXISTS”
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des employés qui habitent dans une ville où il y a un projet?
SELECT Ename FROM Emp
WHERE EXISTS
(SELECT
FROM
WHERE
*
Project
Emp.City=Project.City)
Pour chaque employé on va vérifer si un projet est localisé
dans sa ville.
Si oui, EXISTS vaut vrai et on retourne le nom de l'employé
Peut se faire avec une jointure, un IN ou un ANY !
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
26
Exemple avec “EXISTS” (2)
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des employés qui habitent dans une ville sans projet?
SELECT Ename FROM Emp
WHERE NOT EXISTS (SELECT
FROM
WHERE
*
Project
Emp.City=Project.City)
Impossible avec jointure seule, possible avec un NOT IN, un
ALL (ou un MINUS avec jointure dans deuxième requête)!
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
27
Exemple avec “EXISTS” (3)
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des projets ayant le plus grand budget?
SELECT Pname FROM Project P1
WHERE NOT EXISTS (SELECT *
FROM
Project P2
WHERE
P1.Budget < P2.Budget)
Ne peut se faire avec jointure ou un NOT IN, mais avec un ALL !
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
28
SQL : interrogation de BD
Jointures
Requêtes imbriquées
Discussion
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
29
Equivalence IN/ANY,
NOT IN/ALL
Toute requête avec un IN peut-être écrite avec un ANY :
Donner le nom des employés habitant la ville d'un ingénieur ?
SELECT Ename FROM Emp
WHERE City IN (SELECT City FROM Emp WHERE Title='ingénieur')
SELECT Ename FROM Emp
WHERE City = ANY(SELECT City FROM Emp WHERE Title='ingénieur')
Toute requête avec un NOT IN peut-être écrite avec un ALL :
Donner le nom des employés habitant une ville sans ingénieur ?
SELECT Ename FROM Emp
WHERE City NOT IN (SELECT City FROM Emp WHERE Title='ingénieur')
SELECT Ename FROM Emp
WHERE City <> ALL(SELECT City FROM Emp WHERE Title='ingénieur')
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
30
Equivalence ANY/EXISTS,
ALL/NOT EXISTS
Toute requête avec un ANY peut-être écrite avec un EXISTS :
Donner les travaux durant plus qu'un travail dirigé par 'Prof' ?
SELECT * FROM Work WHERE Dur > ANY (SELECT Dur FROM Work WHERE
Resp='Prof')
SELECT * FROM Work W1 WHERE EXISTS (SELECT * FROM Work W2 WHERE
Resp='Prof' AND W1.Dur > W2.Dur)
Toute requête avec un ALL peut-être écrite avec un NOT EXISTS :
Donner les travaux durant plus que tous les travaux dirigés par 'Prof' ?
SELECT * FROM Work WHERE Dur > ALL (SELECT Dur FROM Work WHERE
Resp='Prof')
SELECT * FROM Work W1 WHERE NOT EXISTS (SELECT * FROM Work W2 WHERE
Resp='Prof' AND W1.Dur < W2.Dur)
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
31
Jointures vs imbrications (1)
Une jointure peut-être en général ré-écrite à l'aide d'une imbrication :
Avec IN, ANY ou EXISTS si la (les) condition(s) de jointure sont
des égalités
Avec ANY ou EXISTS si au moins une est une inégalité
Une jointure ne peut pas être ré-écrite avec une imbrication si des
attributs du SELECT appartiennent à la (aux) table(s) qu'on
souhaite placer dans l'imbrication
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
32
Jointures vs imbrications (2)
A propos de la différence :
La notion de totalité (tous, aucun, personne, jamais, plus que tous,
moins que tous, etc) se traduit par une différence en algèbre
La différence ne peut jamais être réalisée avec seulement la jointure,
éventuellement avec un MINUS et des jointures dans les 2
requêtes (donc nécessite peut-être plus de tables qu'imbrication)
Tous (sauf cas division, voir prochain cours, aucun, personne,
jamais... peuvent être traduit à l'aide d'un NOT IN, ALL ou NOT
EXISTS
Plus que tous, moins que tous (ex : plus grand, plus vieux, plus cher,
etc) peuvent être traduit à l'aide d'un ALL ou d'un NOT EXISTS
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
33
Exemple de différence
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Noms des employés n'ayant jamais travaillé sur un projet?
SELECT Ename FROM Emp
WHERE Eno NOT IN
(SELECT Eno
FROM work W)
SELECT Ename FROM emp E
WHERE NOT EXISTS (SELECT
FROM
WHERE
*
work W
E.Eno = W.Eno)
SELECT Ename FROM Emp
MINUS
SELECT Ename FROM Emp,Work WHERE Emp.Eno=Work.Eno
UPMC - UFR 919 Ingéniérie - Introduction aux Bases de Données Relation
nelles (BD-2I009)
34

Documents pareils