Vous êtes sur la page 1sur 30

-

Bases de données relationnelles : SQL

• POUVOIR D’EXPRESSION : Qu’est-ce qu’on peut calculer ? Quelles


opérations peut-on faire ?
• Les langages de requête relationnels utilisent deux approches :
- calcul relationnel
- algèbre relationnelle

• Les deux approches ont même pouvoir d’expression.

86

86

Algèbre Relationnelle

• L’algèbre relationnelle (AR) est une partie autonome de la mathématique et attachée à l’étude
d’ensembles constitués d’autres éléments.
• Cette algèbre est constituée d’un ensemble de règles et d’opérations formelles qui permettent de
manipuler les relations (au sens du modèle relationnel).
• Ainsi, les relations sont à la base de l’AR. Toutes les opérations présentent ces caractéristiques :
• à l’entrée se trouve une ou plusieurs relations;
• le résultat est toujours une relation (qu’elle contienne plusieurs éléments, un seul ou qu’elle
soit vide).

87

87

1
-

Algèbre Relationnelle

• 5 Opérations de base pour exprimer toutes les requêtes :


• Opérations unaires : sélection, projection
• Opérations binaires : union, différence, produit cartésien
► Autres opérations qui s’expriment en fonction des 5 opérations de base :
► jointure (naturelle, θ-jointure),
► intersection,
► division

88

88

Algèbre Relationnelle : Projection 

La projection ‘élimine’ une ou plusieurs colonnes d’une relation.


Notation : R’=  (A1,A2,…An) R

id nom prenom couriel

3 Bernard Alain ab@gmail.com


23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca

 Client  nom,prenom Client


nom

Nom Nom Prénom


Bernard Bernard Alain
Perrier Perrier Charles
Barrette Labbé Caroline
Barrette Patricia/

89

89

2
-

Algèbre Relationnelle : Sélection

La sélection (parfois appelé restriction) est l'opérateur qui permet de sélectionner


des tuples selon le prédicat donné.
Notation : R = condition R

La condition d’une sélection peut être une formule logique quelconque avec
des et () et des ou () entre termes de la forme et Où :
• et sont des attributs,
• a est un élément (une valeur) du domaine de Ai,
• est l’un de = , < , <= ,> , >= , != , ∪ , ∩ , v , Λ

90

90

Algèbre Relationnelle : Selection

La sélection (parfois appelé restriction) est l'opérateur qui permet de sélectionner


des tuples selon le prédicat donné.
Notation : R = condition R

id nom prenom couriel

3 Bernard Alain ab@gmail.com


23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca

id>3 Client ∪ Client

id nom prenom couriel id nom prenom couriel

23 Perrier Charles cp@yahoo.ca 23 Perrier Charles cp@yahoo.ca


8 Barrette Patricia pb@bell.ca 2 Perrier Caroline cl@hotmail.com

91

91

3
-

Algèbre Relationnelle : renommer ()

La sélection (parfois appelé restriction) est l'opérateur qui permet de sélectionner


des tuples selon le prédicat donné.
Notation :  Client2 (Client)

id nom prenom couriel

3 Bernard Alain ab@gmail.com


23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca

id>3 Client ∪ Client

id nom prenom couriel id nom prenom couriel

23 Perrier Charles cp@yahoo.ca 23 Perrier Charles cp@yahoo.ca


8 Barrette Patricia pb@bell.ca 2 Perrier Caroline cl@hotmail.com

92

92

Algèbre Relationnelle : renommer ()

• Quels sont les Clients qui ont le même nom?

Client Client2
id nom prenom couriel idClent2 nom prenom couriel
3 Bernard Alain ab@gmail.com
 Client2 (Client) 3 Bernard Alain ab@gmail.com
23 Perrier Charles cp@yahoo.ca 23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com 2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca 8 Barrette Patricia pb@bell.ca

 Client.nom, Client2.prenom, ( Client.nom = Client2.nom (Client   Client2 (Client)))

nom prenom

Perrier Charles
Perrier Caroline

93

93

4
-

Algèbre Relationnelle : renommer ()

• Quels sont les Clients qui ont le même nom ?

Client Client2
id nom prenom couriel idClient2 nomClient2 prenom couriel
3 Bernard Alain ab@gmail.com
 Client2(idClient2, nomClient2,prenom, courriel) (Client) 3 Bernard Alain ab@gmail.com
23 Perrier Charles cp@yahoo.ca 23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com 2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca 8 Barrette Patricia pb@bell.ca

Client Client
id nom prenom couriel idClient nom prenom couriel
3 Bernard Alain ab@gmail.com
 id/idClient (Client) 3 Bernard Alain ab@gmail.com
23 Perrier Charles cp@yahoo.ca 23 Perrier Charles cp@yahoo.ca
2 Perrier Caroline cl@hotmail.com 2 Perrier Caroline cl@hotmail.com
8 Barrette Patricia pb@bell.ca 8 Barrette Patricia pb@bell.ca
94

94

Algèbre Relationnelle : Produit Cartésien ×

• Notation: R×S
• Arguments : 2 relations quelconques: R(A1,..,An) S(B1,…Bk)
• Schéma de T=R×S : T(A1,..,An, B1,…Bk)
• Valeur de T=R×S : ensemble de tous les nuplets ayant n+k composants (attributs)
• dont les premiers composants forment un nuplet de R
• et les derniers composants forment un nuplet de S

95

95

5
-

Algèbre Relationnelle : Produit Cartésien ×

RxS
R S

A B C D E A B C D E
1 1 a b a 1 1 a b a
1 2 a b c 1 1 a b c
3 4 b a a 1 1 b a a
1 2 a b a
1 2 a b c
1 2 b a a
3 4 a b a
3 4 a b c
96
3 4 b a a

96

Algèbre Relationnelle : Jointures

• Les jointures (parfois dérivé de l’anglais et appelé jonction), permettent d’effectuer un


ensemble d’opérations de base afin de maximiser la combinaison de deux relations.
• Il existe plusieurs types de jointure et elles sont regroupées principalement en deux
catégories :
• jointures internes (théta-jointure, équi-jointure, jointure naturelle, semi-jointure et
anti-jointure);
• jointure externes (jointure externe entière, jointure externe gauche et jointure
externe droite).

97

97

6
-

Algèbre Relationnelle :  jointure


La théta-jointure est l’opération qui consiste à appliquer à la fois un produit cartésien et une
sélection.
• Notation : R ⋈ S =  RxS / {=, , , , <, >}
• Arguments : 2 relations quelconques: R(A1,..,Am) S(B1,…Bn )
• Schéma de T= R ⋈ S : T(A1,..,Am, B1,…Bn ,X1,..,Xk)
• Valeur de T= R ⋈ S : ensemble de tous les nuplets respectant la condition A θ B

• Une seule occurrence des attributs communs est gardée.

Remarque : Si Equi-jointure :  est l’égalité

98

98

Algèbre Relationnelle :  jointure


S RxS T=AC(RxS) =R ⋈ AC S
C D E A B C D E A B C D E
1 a 1 b a 1 a 1 b a
1 b a
1 a 2 b c 1 a 2 b c
2 b c 1 a 4 a a
1 a 4 a a
4 a a 1 b 1 b a 1 b 1 b a
1 b 2 b c 1 b 2 b c
R 1 b 4 a a 1 b 4 a a
A B 3 a 4 a a
3 a 1 b a
1 a
3 a 2 b c
1 b T=B=D(RxS) =R ⋈ B=D S
3 a 4 a a
3 a A B C D E
1 a 4 a a
1 b 1 b a
1 b 2 b c
99 3 a 4 a a

99

7
-

Algèbre Relationnelle :  jointure

Soit le schéma de la base de données suivants :

• IMMEUBLE(ADI,NBETAGES,AGES,DATESC,PROP)
• APPIM(#ADI,NAP, OCCUP, ETAGE)

Nom du propriétaire de l’immeuble où est situé l’appartement occupé par Durand :

PROP(IMMEUBLE ⋈ OCCUP="Durand"(APPIM))

Appartements occupés par des propriétaires d’immeuble :

ADI,NAP,ETAGE (IMMEUBLE ⋈OCCUP=PROP APPIM)

100

100

Algèbre Relationnelle : Jointure Naturelle ⋈


La jointure naturelle est une équi-jointure dont la condition de rapprochement concerne
tous les attributs de même nom et de même domaine.
• Notation : R ⋈ S
• Arguments : 2 relations quelconques: R(A1,..,Am ,X1,..,Xk) S(B1,…Bn ,X1,..,Xk)
• Schéma de T= R ⋈ S : T(A1,..,Am, B1,…Bn ,X1,..,Xk)
• Valeur de T= R ⋈ S : ensemble de tous les nuplets ayant m+n+k composants (attributs)
• Dont les m premiers et les k derniers composants forment un nuplet de R
• et les n+k derniers composants forment un nuplet de S
• Une seule occurrence des attributs communs est gardée.

Algorithme : Pour chaque a nuplet dans R et pour chaque b nuplet dans S:


1. On concatène a et b et on obtient un nuplet qui a pour attributs A1,..,Am,
X1,..,Xk,B1,…Bn ,X1,..,Xk
2. On ne garde que si chaque attribut Xi de a est égal à l’attribut Xi de b:
i=1..K a.Xi=b.Xi
101 3. On élimine les valeurs (les colonnes) dupliquées: A1,..,Am,B1,…Bn ,X1,..,Xk

101

8
-

Algèbre Relationnelle : Jointure Naturelle ⋈

S R⋈S
R
A B C B C D A B C D
a b c b c d a b c d
d b c b c e a b c e
b b f d b c d
a d b
c a d
d b c e
c a d b

102

102

Algèbre Relationnelle : Jointure Naturelle ⋈

Soit U={A1,..,Am, B1,…Bn ,X1,..,Xk} l’ensemble des attributs de relations


et V={X1,..,Xk} l’ensemble des attributs en commun
R ⋈ S =U(AV :R.A=S.A(RxS))

Notation : R.A veut dire l’attribut A de la relation R

103

103

9
-

Algèbre Relationnelle : Jointure Naturelle ⋈

R S RxS

A B A B D R.A R.B S.A S.B D


1 a 1 a b 1 a 1 a b
1 b 2 c b 1 a 2 c b
4 a 4 a a 1 a 4 a a
1 b 1 a b
1 b 2 c b
1 b 4 a a
4 a 1 a b
4 a 2 c b
4 a 4 a a
104

104

Algèbre Relationnelle : Union


• Notation : R ∪ S
• Arguments : 2 relations quelconques: R(A1,..,Am ) S(A1,..,Am)
• Schéma de T= R ∪ S : T(A1,..,Am)
• Valeur de T= R ∪ S : ensemble de tous les nuplets appartenant à R ou S

• Une seule occurrence des attributs communs est gardée.

R S RS

A B A B A B
1 a 1 a 1 a
1 b 1 d 1 b
3 a 3 e 3 a
1 d
3 e

105

105

10
-

Algèbre Relationnelle : Différence


• Notation : R −S
• Arguments : 2 relations : R(A1,..,Am ) S(A1,..,Am)
• Schéma de T= R − S : T(A1,..,Am)
• Valeur de T= R − S: ensemble de tous les nuplets appartenant à R et qui n’appartiennent pas à S

• Une seule occurrence des attributs communs est gardée.

R
S R-S
A B A B A B
1 a 1 a 1 b
1 b 1 d 3 a
3 a 3 e

106

106

Algèbre Relationnelle : Intersection


• Notation : R ∩ S
• Arguments : 2 relations : R(A1,..,Am ) S(A1,..,Am)
• Schéma de T= R ∩ S : T(A1,..,Am)
• Valeur de T= R ∩ S : ensemble de tous les nuplets appartenant à R et à S

• Une seule occurrence des attributs communs est gardée.

R S RS
A B A B A B
1 a 1 a 1 a
1 b 1 d
3 a 3 e

Remarque : R ∩ S = R-(R-S)
107

107

11
-

Algèbre Relationnelle : Semi-jointure


La semi-jointure est une jointure naturelle pour laquelle on ne garde que les attributs de R1(semi-jointure
de gauche) ou de R2(semi-jointure de droite).

• Notation : R1 ⋊ R2 (semi-jointure de droite)


R1 ⋉ R2 (semi-jointure de gauche)
• Arguments : 2 relations : R1(A1,.., Am, X1,..,Xk) R2(B1,…Bn , X1,.., Xk)
• Schéma de T= R1 ⋊ R2 : T(B1,…,Bn)
T= R1 ⋉ R2 : T(A1,…,Am)
• Valeur de T= R1 ⋊ R2 : Projection sur les attributs de R2 de la jointure naturelle entre R1 et R2

de T= R1 ⋉ R2 : Projection sur les attributs de R1 de la jointure naturelle entre R1 et R2


S
A B C R
R ⋉ S =A,B,CR ⋈ S
a b c B C D
A B C
d b c b c d
a b c
b b f b c e d b c
108 c a d a d b c a d
108

Bases de données relationnelles : SQL - MDL

Sélection

SELECT <liste des attributs à projeter>

FROM <liste des relations argument>

WHERE <conditions sur un ou plusieurs attributs>

Projection

Soit le schéma de relation Commandes (num, cnom, pnom, quantite)

SELECT num, cnom, pnom, quantite FROM Commandes

ou

SELECT * FROM Commandes

109

109

12
-

Bases de données relationnelles : SQL - MDL

Conditions de sélection
Les conditions de base sont exprimées de deux façons:
1. attribut comparateur valeur
Où comparateur est =,<, >, <>,…,
2. attribut comparateur attribut

Soit le schéma de relation Fourniseur (pnom, fnom, prix)


Requête : Produits de prix supérieur à 200F
SQL : SELECT pnom FROM Fourniseur WHERE prix > 2000

Requête : Produits dont le nom est celui du fournisseur


SQL : SELECT pnom FROM Fourniseur WHERE pnom= fnom

110

110

Bases de données relationnelles : SQL - MDL

Conditions de sélection
Les conditions de base sont exprimées de deux façons:
1. attribut comparateur valeur
Où comparateur est BETWEEN, LIKE, IS NULL/ IS NOT NULL, IN
2. attribut comparateur attribut

Soit le schéma de relation Fournisseur (pnom, fnom, prix)


Requête : Produits de prix entre 1000 et 2000
SQL : SELECT pnom FROM Fourniture WHERE prix BETWEEN 1000 AND 2000

Remarque: La condition y BETWEEN x AND z est équivalente à y <=z AND x <= y

111

111

13
-

Bases de données relationnelles : SQL - MDL

Conditions de sélection
Les conditions de base sont exprimées de deux façons:
1. attribut comparateur valeur
Où comparateur est BETWEEN, LIKE, IS NULL/ IS NOT NULL, IN
2. attribut comparateur attribut

Soit le schéma de relation Fournisseur (fnom, prix)


Requête : Fournisseur dont le nom commence par "C"
SQL : SELECT fnom FROM Fournisseur WHERE fnom LIKE ’C%’

Remarque: Le littéral qui suit LIKE doit être une chaîne de caractères éventuellement avec des
caractères jokers (_, %). Pas exprimable avec l’algèbre relationnelle

112

112

Bases de données relationnelles : SQL - MDL

Conditions de sélection
Les conditions de base sont exprimées de deux façons:
1. attribut comparateur valeur
Où comparateur est BETWEEN, LIKE, IS NULL/ IS NOT NULL, IN
2. attribut comparateur attribut

Soit le schéma de relation Fournisseur (fnom, statut, ville)


Requête : Fournisseur dont la ville est non nulle
SQL : SELECT fnom FROM Fournisseur WHERE ville IS NOT NULL

113

113

14
-

Bases de données relationnelles : SQL - MDL

Conditions de sélection
Les conditions de base sont exprimées de deux façons:
1. attribut comparateur valeur
Où comparateur est BETWEEN, LIKE, IS NULL/ IS NOT NULL, IN
2. attribut comparateur attribut

Soit le schéma de relation Fournisseur (pnom, fnom, prix)


Requête : produits avec un coût de 100, de 200 ou de 300.
SQL : SELECT pnom FROM fournisseur WHERE prix IN {100,200,300}

114

114

Bases de données relationnelles : SQL - MDL


Conditions de sélection

Soit le schéma de relation Commandes (num, cnom, pnom, quantite)


Requête : Produits commandés par ‘Jean’
AR : PNOM (CNOM=‘’JEAN’’(COMMANDES))
SQL : SELECT pnom FROM Commandes WHERE CNOM = ’JEAN’

Requête : produits commandés par Jean en quantité supérieur à 100


SELECT pnom FROM Commandes WHERE cnom=’JEAN’ AND quantite > 100

115

115

15
-

Bases de données relationnelles : SQL - MDL

Projection : Distinct
Soit le schéma de relation Commandes (num, cnom, pnom, quantite)
Produits commandés ⇒ SELECT pnom FROM Commandes

Remarque : Contrairement à l’algèbre relationnelle, SQL n’élimine pas les dupliqués. Pour
les éliminer on utilise DISTINCT :

SELECT DISTINCT pnom FROM Commandes

Le DISTINCT peut être remplacé par la clause UNIQUE dans certains systèmes

116

116

Bases de données relationnelles : SQL - MDL


Jointure
Soit le schéma de relations :
• Commandes (num, cnom, pnom, quantite),
• Fournisseur(pnom, fnom, prix)

Requête : nom, prix, Fournisseur des Produits commandés par Jean


SQL :
SELECT Commandes.pnom, prix, fnom FROM Commandes, Fournisseur
WHERE cnom = ’JEAN’ AND Commandes.pnom = Fournisseur.pnom
Remarques :

1. Cette requête est équivalente à une jointure naturelle. Noter qu’il faut toujours expliciter les attributs
de jointure.
2. SELECT COMMANDES.PNOM, PRIX, FNOM FROM COMMANDES, FOURNITURE équivaut à un
produit cartésien des deux relations, suivi d’une projection.

117

117

16
-

Bases de données relationnelles : SQL - MDL


Jointure

SQL opération Algèbre


R1 CROSS JOIN R2 produit cartésien 
R1 JOIN R2 ON R1.A < R2.B théta-jointure ⋈ . .
R1 NATURAL JOIN R2 Jointure naturelle ⋈

118

118

Bases de données relationnelles : SQL - MDL


Jointure
Soit le schéma de relation Fournisseur (fnom, statut, ville)
Requête : Fournisseurs qui se trouvent deux à deux dans la même ville
SQL: SELECT Prem. fnom, Second. fnom
FROM Fournisseur Prem, Fournisseur Second
WHERE Prem.ville = Second.ville AND
Prem. fnom < Second. fnom
La deuxième condition permet
1. l’élimination des paires (x,x)
2. d’éviter d’obtenir au résultat à la fois (x,y) et (y,x)
Remarques : Prem représente une instance de Fournisseur, Second une autre instance de
Fournisseur.

119

119

17
-

Bases de données relationnelles : SQL - MDL


Jointure
Soit le schéma de relation Employe(idEmp, enom, codeDep, sal)

Requête : Nom et Salaire des Employés gagnant plus que l’employé de numéro 12546
SQL: SELECT E1.enom, E1.sal
FROM Employe E1, Employe E2
WHERE E2. idEmp = 12546 AND
E1.sal > E2.sal

120

120

Bases de données relationnelles : SQL - MDL


Union
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)

Requête : Produits qui coûtent plus que 1000 ou ceux qui sont commandés par Jean
SQL: SELECT pnom FROM Fournisseur
WHERE prix >= 1000
UNION
SELECT pnom FROM Commandes
WHERE cnom = ’Jean’

Remarques : L’union élimine les dupliqués. Pour garder les dupliqués on utilise
121 l’opération UNION ALL

121

18
-

Bases de données relationnelles : SQL - MDL


Intersection
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)

Requête : Produits qui coûtent plus que 1000 et qui sont commandés par Jean
SQL: SELECT pnom FROM Fournisseur
WHERE prix >= 1000
INTERSECT
SELECT pnom FROM Commandes
WHERE cnom = ’Jean’

Remarques : L’union élimine les dupliqués. Pour garder les dupliqués on utilise
122 l’opération UNION ALL

122

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Nom, prix et fournisseurs des Produits commandés par Jean
AR : pnom,prix,fnom (cnom=‘’JEAN’’ (Commandes⋈Fournisseur))
SQL: SELECT pnom,prix,fnom
FROM Fournisseur
WHERE pnom IN(SELECT pnom FROM Commandes WHERE cnom = ’JEAN’)
ou
SELECT Fournisseur.pnom,prix,fnom
FROM Fournisseur, Commandes
WHERE Fournisseur.pnom = Commandes.pnom AND cnom = ‘‘JEAN’’

123

123

19
-

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : Différence
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Produits non commandés
AR : pnom Fournisseur − pnom Commandes
SQL: SELECT pnom
FROM Fournisseur
WHERE pnom NOT IN(SELECT pnom FROM Commandes)
ou
SELECT pnom FROM Fournisseur
EXCEPT
SELECT pnom FROM Commandes

124

124

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : ANY - ALL
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Fournisseurs des Briques à un coût inférieur au coût maximum des Ardoises
SQL: SELECT fnom
FROM Fournisseur
WHERE pnom = ’Brique’
AND prix < ANY ( SELECT prix
FROM Fournisseur
WHERE PNOM = ’Ardoise’)

125

125

20
-

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : ANY - ALL
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Nom, Coût et Fournisseur des Produits commandés par Jean
SQL: SELECT pnom, prix, fnom
FROM Fournisseur
WHERE pnom = ANY ( SELECT pnom
FROM Commandes
WHERE cnom = ’JEAN’)
Remarques : Les prédicats IN et = ANY sont utilisés de façon équivalente

126

126

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : ANY - ALL
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
Requête : Client ayant commander la plus petite quantité de Briques
SQL: SELECT cnom
FROM Commandes
WHERE pnom = ’Brique’ AND quantite <= ALL ( SELECT quantite
FROM Commandes
WHERE pnom = ’Brique’)
Remarque : La condition  ALL (SELECT F FROM . . . ) est vraie ssi la comparaison  v est vraie pour
toutes les valeurs v du résultat du bloc (SELECT F FROM . . . ).

127

127

21
-

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : ANY - ALL
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Produit sans commandes
SQL: SELECT pnom
FROM Fournisseur
WHERE pnom NOT = ALL ( SELECT pnom
FROM Commandes)

Remarque : Les prédicats NOT IN et NOT = ALL sont utilisés de façon équivalente.

128

128

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : EXISTS
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Les fournisseurs des produits ayant été commandés au moins une fois
SQL: SELECT fnom
FROM Fournisseur
WHERE EXISTS ( SELECT *
FROM Commandes
WHERE pnom = Fournisseur.pnom
)
Remarque : La condition EXISTS (SELECT * FROM . . . ) est vraie ssi le résultat du bloc (SELECT*
FROM . . . ) n’est pas vide
.
129

129

22
-

Bases de données relationnelles : SQL - MDL


Requêtes imbriquées simples : NOT EXISTS
Soit le schéma de relation
• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Les fournisseurs des produits n’ayant jamais été commandés.
SQL: SELECT fnom
FROM Fournisseur
WHERE NOT EXISTS ( SELECT *
FROM Commandes
WHERE pnom = Fournisseur.pnom
)
Remarque : La condition NOT EXISTS (SELECT * FROM . . . ) est vraie ssi le résultat du bloc (SELECT *
FROM . . . ) est vide

130

130

Bases de données relationnelles : SQL - MDL


Formes Équivalentes de Quantification

Si  est un des opérateurs de comparaison <, =, >…


• La condition x  ANY (SELECT . FROM ,.., WHERE p) est équivalente à
EXISTS (SELECT * FROM ,.., WHERE p AND x  . )

• La condition x  ALL (SELECT . FROM ,.., WHERE p) est équivalente à


NOT EXISTS (SELECT * FROM ,.., WHERE (p) AND NOT (x  . ))

131

131

23
-

Bases de données relationnelles : SQL - MDL


Formes Équivalentes de Quantification

Soit le schéma de relation


• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Nom, prix et fournisseur des produits commandés par Jean.
SQL: SELECT pnom, prix, fnom FROM Fournisseur
WHERE pnom = ANY (SELECT pnom FROM Commandes
WHERE cnom = ’JEAN’)

SELECT pnom, prix, fnom FROM Fournisseur


WHERE EXISTS (SELECT * FROM Commandes
WHERE cnom = ’JEAN’
132 AND pnom = Fournisseur. pnom)

132

Bases de données relationnelles : SQL - MDL


Formes Équivalentes de Quantification

Soit le schéma de relation


• Fournisseur(pnom, fnom, prix)
Requête : Fournisseurs qui fournissent au moins un produit avec un coût supérieur aux coûts
de tous les produits fournis par Jean.
SQL: SELECT DISTINCT fnom FROM Fournisseur
WHERE prix > ALL (SELECT prix FROM Fournisseur
WHERE cnom = ’JEAN’)

SELECT DISTINCT P1.fnom FROM Fournisseur P1


WHERE NOT EXISTS (SELECT * FROM Fournisseur P2
WHERE P2.fnom = ’JEAN’
AND P1.prix <= P2.prix)
133

133

24
-

Bases de données relationnelles : SQL - MDL


Division
Soit le schéma de relation
• Fournisseur(fnum, fnom, status, ville)
• Produit(pnum, pnom, prix)
• Fournir(fnum, pnum, quantite)
Requête : Fournisseurs qui fournissent tous les produits
AR : = pnom, fnom (Fournir) pnom (Produit)
= fnom (Fournisseur ⋈ ))
SQL: SELECT fnom FROM Fournisseur
WHERE NOT EXISTS (SELECT * FROM Produit
WHERE NOT EXISTS (SELECT * FROM Fournir
WHERE Fournir.fnum = Fournisseur.fnum
AND Fournir.pnum = Produit. pnum)
)
134

134

Bases de données relationnelles : SQL - MDL


Fonctions de calcul : COUNT, SUM, AVG, MIN, MAX
Soit le schéma de relation
• Fournisseur(fnum, fnom, status, ville)
• Produit(pnum, pnom, prix)
• Fournir(fnum, pnum, quantite)
Requête : Nombre de Fournisseurs de Paris
SQL: SELECT COUNT(*) FROM Fournisseur WHERE ville = ’Paris’

Requête : Nombre de Fournisseurs de Paris


SQL : SELECT COUNT(DISTINCT fnum) FROM Fournir
Remarque : La fonction COUNT(*) compte le nombre des n-uplets du résultat d’une requête sans
élimination des dupliqués ni vérification des valeurs nulles. Dans le cas contraire on utilise la
clause COUNT(DISTINCT . . . ).

135

135

25
-

Bases de données relationnelles : SQL - MDL


Fonctions de calcul : COUNT, SUM, AVG, MIN, MAX

Soit le schéma de relation


• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)
Requête : Quantité totale de Briques commandées
SQL: SELECT SUM (quantite) FROM Commandes
WHERE pnom = ’Brique’

136

136

Bases de données relationnelles : SQL - MDL


Fonctions de calcul : COUNT, SUM, AVG, MIN, MAX

Soit le schéma de relation


• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)

Requête : Coût moyen de Briques fournies

SQL: SELECT AVG (prix) FROM Fournisseur


WHERE pnom = ’Brique’

SELECT SUM (prix)/COUNT(prix) FROM Fournisseur


WHERE pnom = ’Brique’

137

137

26
-

Bases de données relationnelles : SQL - MDL


Fonctions de calcul : COUNT, SUM, AVG, MIN, MAX

Soit le schéma de relation


• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)

Requête : Fournisseurs des Briques au coût moyen des Briques.


SQL: SELECT fnom
FROM Fournisseur
WHERE pnom = ’Brique’ AND prix = ( SELECT AVG(prix)
FROM Fournisseur
WHERE pnom = ’Brique’)

138

138

Bases de données relationnelles : SQL - MDL


Fonctions de calcul : COUNT, SUM, AVG, MIN, MAX

Soit le schéma de relation


• Commandes(num, cnom, pnom, quantite)
• Fournisseur(pnom, fnom, prix)

Requête : Le prix des briques qui sont le plus chères.


SQL: SELECT MAX (prix) FROM Fournisseur
WHERE pnom = ’Brique’

Requête : Le prix des briques qui sont les moins chères.


SQL: SELECT MIN (prix) FROM Fournisseur
WHERE pnom = ’Brique’

139

139

27
-

Bases de données relationnelles : SQL - MDL


Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

Soit le schéma de relation VILLE FNOM


PARIS TOTO
• Fournisseur(fnum, fnom, status, ville)
PARIS DUPOND
LYON DURAND
Requête : Nombre de fournisseurs par ville.
LYON LUCIEN
SQL: SELECT ville, COUNT(fnom) LYON REMI
FROM Fournisseur
GROUP BY ville
VILLE COUNT(FNOM)
PARIS 2
LYON 3

Remarque : La clause GROUP BY permet de préciser les attributs de


partitionnement des relations déclarées dans la clause FROM. Par exemple on
140 regroupe les fournisseurs par ville.
140

Bases de données relationnelles : SQL - MDL


Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

Soit le schéma de relation


• Fournisseur(pnom, fnom, prix)

Requête : Donner pour chaque produit fourni son coût moyen. pnom AVG(prix)

SQL: SELECT pnom, AVG (prix) Briques 10.5


ardoise 8.9
FROM Fournisseur
GROUP BY pnom

Remarque : Les fonctions de calcul appliquées au résultat de regroupement sont directement


indiquées dans la clause SELECT. Par exemple le calcul de la moyenne se fait par produit
obtenu au résultat après le regroupement.

141

141

28
-

Bases de données relationnelles : SQL - MDL


Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

Soit le schéma de relation pnom fnom prix


BRIQUE TOTO 105
• Fournisseur(fnom, pnom, prix)
ARDOISE LUCIEN 110
ARDOISE DURAND 120
Requête : Produits fournis par deux ou plusieurs
fournisseurs avec un prix supérieur de 100
pnom
SQL: SELECT pnom FROM Fournisseur
WHERE prix > 100 ARDOISE
GROUP BY pnom
HAVING COUNT(*) >= 2

Remarque : La clause HAVING permet d’éliminer des partitionnements, comme la clause


WHERE élimine des n-uplets du résultat d’une requête. Par exemple on garde les produits dont
le nombre des fournisseurs est >= 2. De cette façon des conditions de sélection peuvent être
appliquées avant le calcul d’agrégat (clause WHERE) mais aussi après (clause HAVING).
142

142

Bases de données relationnelles : SQL - MDL


Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

Soit le schéma de relation


• Fournisseur(fnum, fnom, status, ville)
• Produit(pnum, pnom)
• Fournir(fnum, pnum, prix, quantite)
Requête : Produits fournis et leur coût moyen pour les fournisseurs dont le siège est à Paris seulement si
le coût minimum du produit est supérieur à 1000
SQL: SELECT pnum, AVG(prix)
FROM Fournir, Fournisseur
WHERE ville = ’Paris’ AND Fournir.fnum = Fournisseur.fnum
GROUP BY pnum
HAVING MIN(prix) > 1000

143

143

29
-

Bases de données relationnelles : SQL - MDL


Opérations d’Agrégation : GROUP BY, HAVING, ORDER BY

En général, le résultat d’une requête SQL n’est pas trié. Pour trier le résultat par rapport aux
valeurs d’un ou de plusieurs attributs, on utilise la clause ORDER BY :
Soit le schéma de relation
• Fournisseur(fnum, fnom, status, ville)
• Produit(pnum, pnom)
• Fournir(fnum, pnum, prix, quantite)
SQL: SELECT ville, fnom, pnom
FROM Fournir, Fournisseur
WHERE Fournir.fnum = Fournisseur.fnum
ORDER BY ville, fnom DESC

144

144

30

Vous aimerez peut-être aussi