Langages de manipulation des données

Transcription

Langages de manipulation des données
Le modèle relationnel
Langages de manipulation des données :
algèbre relationelle et SQL
V. Benzaken
K. Nguy˜ên
Département d’ informatique
LRI UMR 8623 CNRS
Université Paris Sud
Master FIIL U. Paris Saclay
1 / 56
Langage de manipulation des données
• langage d’interrogation
• langage de mise à jour
(algèbre , SQL)
(SQL)
interroger revient à extraire des données
langage procédural : quoi ? et comment ?
Python, Pascal, C, Java
langage déclaratif : quoi ? logiques ou algèbres
Prolog, SQL, ...
modèle relationnel ⇐⇒ théorie des ensembles
modèle relationnel ⇐⇒ logique
SQL ↔ algèbre relationelle
SQL ↔ logique
2 / 56
Algèbre relationnelle
• 2 opérateurs unaires : projection, sélection
• 3 opérateurs binaires : jointure, union, différence
• opérateurs dérivés : produit cartésien, intersection, division, ...
• Chaque opérateur définit une application de l’ensemble des
instances d’un schéma de base de données (la source) dans
l’ensemble des instances d’un schéma de relation (la cible).
• le schéma cible (la structure du résultat) est déterminé par la
donnée du schéma source et de l’opérateur.
3 / 56
Projection
opération unaire, verticale , restriction de fonction au sens
mathématique : supprimer des colonnes d’une table.
Étant donné le schéma source : R(V)
Soit W un ens. d’attributs tel que W ⊆ V.
• Syntaxe : L’opérateur de projection πW est une application
de l’ensemble des instances du schéma source R(V)
dans l’ensemble des instances du schéma cible Cible(W)
• Sémantique : πW (r)= { u|W ; u ∈ r }
4 / 56
Projection : exemple
Extraire les titres de tous les films :
πtitre (film)
film
titre
Speed 2
Speed 2
Speed 2
Marion
Marion
réalisateur
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
πtitre (film)
acteur
S. Bullock
J. Patric
W. Dafoe
C. Tetard
M-F Pisier
titre
Speed 2
Marion
5 / 56
Projection : exemple suite
Extraire les titres des films à l’affiche :
πtitre (prog)
prog
nomciné
Français
Français
Français
Français
Trainon
πtitre (prog)
titre
Speed 2
Speed 2
Speed 2
Marion
Marion
horaire
18h00
20h00
22h00
16h00
18h00
titre
Speed2
Marion
6 / 56
Sélection
opération unaire et horizontale : supprimer/filtrer des lignes
d’une table en utilisant certains critères (condition).
Soit V un ens. d’attributs. Une condition élémentaire sur V est
un formule de la forme :
A comp a
ou
A comp B
avec A, B∈ V, a∈Dom(A), Dom(A)=Dom(B)
et comp est un symbole de comparaison (=, ≤, ...)
Une condition sur V est :
une condition élémentaire ou une formule de la forme
C1 ∧ C2 (C1 et C2 )
C1 ∨ C2 (C1 ou C2 )
¬C1 (non C1 )
où Ci est une condition. De manière plus concise :
c ::= A comp a | A comp B | c ∧ c | c ∨ c | ¬c
7 / 56
Sélection
Soit R(V). schéma source et
C une condition sur V.
• Syntaxe : L’opérateur de sélection σC est une application
de l’ensemble des instances du schéma source R(V)
dans l’ensemble des instances du schéma cible Cible(V)
• Sémantique :
σC (r)= { u; u ∈ r et C (u)}
C (u) : u satisfait C
(défini de façon standard, u vérifie la condition C ).
8 / 56
Sélection : exemple
Extraire les informations des films dont le titre est “Speed2”.
σtitre=Speed2
film
titre
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
σtitre=Speed2 (film)
réalisateur
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
titre
Speed 2
Speed 2
Speed 2
acteur
S. Bullock
J. Patric
W. Dafoe
C. Tetard
M-F Pisier
M. Poirier
réalisateur
Jan de Bont
Jan de Bont
Jan de Bont
acteur
S. Bullock
J. Patric
W. Dafoe
9 / 56
Sélection : exemple
Extraire les films dont un acteur est le metteur en scène de ce film.
σrealisateur =acteur
film
titre
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
σrealisateur =acteur (film)
réalisateur
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
titre
Marion
acteur
S. Bullock
J. Patric
W. Dafoe
C. Tetard
M-F Pisier
M. Poirier
réalisateur
M. Poirier
acteur
M. Poirier
10 / 56
Sélection : exemple
Les informations concernant la programmation après 20h00 du film
“Marion”.
σtitre=Marion∧horaire≥20
prog
nomciné
Français
Français
UGC
Français
Trianon
Trianon
titre
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
horaire
18h00
20h00
22h00
16h00
18h00
22h00
σtitre=Marion∧horaire≥20 (prog)
nomciné
Trianon
titre
Marion
horaire
22h00
11 / 56
Composition de la projection et de la sélection
Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi
que l’horaire exact de la projection.
12 / 56
Composition de la projection et de la sélection
Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi
que l’horaire exact de la projection.
prog
12 / 56
Composition de la projection et de la sélection
Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi
que l’horaire exact de la projection.
σtitre=Marion∧horaire≥20 (prog)
σ
nomciné
Trianon
titre
Marion
horaire
22h00
12 / 56
Composition de la projection et de la sélection
Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi
que l’horaire exact de la projection.
πhoraire,nomcine (σtitre=Marion∧horaire≥20 (prog))
σ
nomciné
Trianon
π(σ...)
titre
Marion
nomciné
Trianon
horaire
22h00
horaire
22h00
12 / 56
Introduction à SQL
SQL = Structured Query Language
SEQUEL = Structured English as a QUEry Language
standard ISO depuis 87.
Avantages :
implanté + ou - complètement sur principaux SGBDs
portabilité des applications
interopérabilité
Inconvénients :
évolution du langage par ”extensions” (SQL2, SQL3 ...)
suivre l’évolution des systèmes, des architectures
frein à l’émergence d’un nouveau langage
13 / 56
SQL : Structured Query Language
SQL est bien plus qu’un langage de requêtes
langage de définition de données (create, alter, drop)
langage de manipulation de données
interrogations (select)
mises à jour (update, insert, delete)
contrôle d’accès aux données (grant, revoke)
SQL est un langage utilisable
en mode interactif
associé à une interface graphique
immergé dans des langages de programmation (C, Java, ...)
14 / 56
SQL : langage de requêtes - requêtes simples
Syntaxe générale (cas simple) : bloc select-from-where
select
from
where
Clause
Clause
Clause
< liste d’attributs >
< liste de relations >
< condition >
attributs du schéma cible
les relation(s) source(s)
conditions de sélection
: les relations utiles à la requête
: les attributs constituant le schéma du résultat
where : les conditions d’extraction des n-uplets
from
select
15 / 56
SQL : requêtes simples (mono relations)
select * from film where acteur=’Adjani’
* : liste de tous les attributs
σacteur=0 Adjani0 (film)
select titre from film where acteur=’Adjani’
πtitre (σacteur=0 Adjani0 (film))
Sémantique formelle – cas mono-relation :
select
from
where
B1 ... Bk
R
C
projection
accès
sélection
πB1 ...Bk (σC (R))
16 / 56
Jointure
opération binaire permettant de combiner le contenu de deux
instances en se servant des valeurs dans les colonnes communes
• Syntaxe :
L’opérateur de jointure ./ est une application
de l’ensemble des couples d’instances de R(V) et S(W)
dans l’ensemble des instances de Cible(V ∪ W)
• Sémantique :
r ./ s = {u ; u|V ∈ r et u|W ∈ s}
17 / 56
Jointure : illustration
r
R
A
a1
a2
a2
a3
s
B
b1
b1
b2
b2
C
c1
c1
c2
c3
S
B
b1
b2
b4
C
c1
c3
c2
D
d1
d3
d1
r ./ s
Cible
A
a1
a2
a3
B
b1
b1
b2
C
c1
c1
c3
D
d1
d1
d3
18 / 56
Jointure : exemple de programmation
Les cinémas qui projettent un film dans lequel joue M.F Pisier
(pour chaque cinéma donner le titre du film et l’horaire)
19 / 56
Jointure : exemple de programmation
Les cinémas qui projettent un film dans lequel joue M.F Pisier
(pour chaque cinéma donner le titre du film et l’horaire)
les films dans lesquels joue M.F Pisier
:
(q) : σacteur=M−F.Pisier (film)
19 / 56
Jointure : exemple de programmation
Les cinémas qui projettent un film dans lequel joue M.F Pisier
(pour chaque cinéma donner le titre du film et l’horaire)
les films dans lesquels joue M.F Pisier
:
(q) : σacteur=M−F.Pisier (film)
schéma source : Film
schéma cible : Cibleσ (titre, realisateur, acteur)
19 / 56
Jointure : exemple de programmation
Les cinémas qui projettent un film dans lequel joue M.F Pisier
(pour chaque cinéma donner le titre du film et l’horaire)
les films dans lesquels joue M.F Pisier
:
(q) : σacteur=M−F.Pisier (film)
schéma source : Film
schéma cible : Cibleσ (titre, realisateur, acteur)
Les cinémas qui projettent ces films
:
(q) ./ prog
19 / 56
Jointure : exemple de programmation
Les cinémas qui projettent un film dans lequel joue M.F Pisier
(pour chaque cinéma donner le titre du film et l’horaire)
les films dans lesquels joue M.F Pisier
:
(q) : σacteur=M−F.Pisier (film)
schéma source : Film
schéma cible : Cibleσ (titre, realisateur, acteur)
Les cinémas qui projettent ces films
:
(q) ./ prog
schémas sources : Cibleσ (titre, realisateur, acteur) et Prog
schéma cible Cible./ (titre, realisateur, acteur, nomcine, horaire)
19 / 56
Exemple programmation : fin
L’expression algébrique :
πnomcine,titre,horaire (σacteur=M−F.Pisier (film) ./ prog)
Autre expression équivalente :
πtitre (σacteur=M−F.Pisier (film)) ./ prog
20 / 56
Jointure : autres exemples
1. les films avec leur réalisateurs et acteurs dans lesquels joue M-F.
Pisier.
La sous-requête
πtitre (σacteur=M−F.Pisier (film))
extrait les titres des films dans lesquels joue M-F. Pisier.
Il faut ensuite combiner ces titres afin de collecter les autres
acteurs et réalisateurs :
πtitre (σacteur=M−F.Pisier (film)) ./ film
2. Les titres des films dans lesquels joue M-F. Pisier et qui sont à
l’affiche
πtitre (σacteur=M−F.Pisier (film)) ./ prog
ou de façon équivalente :
πtitre (σacteur=M−F.Pisier (film) ./ prog)
21 / 56
Jointure : intersection et produit cartésien
Soient R(V) et S(W) deux schémas tels que V=W alors
Pour toutes instances r, s de R(V) et S(W) :
r ./ s
est équivalent à
r∩s
Ainsi l’intersection ensembliste est un opérateur dérivé de la
jointure (sous la condition que V=W). Désormais nous
l’incluerons dans la syntaxe de l’algèbre ∩.
Les titres des films dans lesquels joue M-F. Pisier et qui sont à
l’affiche
πtitre (σacteur=M−F.Pisier (film)) ∩ πtitre (prog)
22 / 56
Jointure : intersection et produit cartésien (fin)
Soient R(V) et S(W) deux schémas tels que V ∩ W = ∅ alors
Pour toutes instances r, s de R(V) et S(W) :
r ./ s
est équivalent à
r×s
Ainsi le produit cartésien ensembliste est un opérateur dérivé de la
jointure (sous la condition que V ∩ W = ∅). Désormais nous
l’incluerons dans la syntaxe de l’algèbre ×.
23 / 56
Jointure et produit cartésien : illustration
une instance r
une instance s
R
S
A
a
a
B
b1
b2
A’
a
a’2
B’
b’1
b’2
l’instance r ./ s
Cibler./s
A
a
a
a
a
B
b1
b2
b1
b2
A’
a
a
a’2
a’2
B’
b’1
b’1
b’2
b’2
24 / 56
Renommage
quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas
nécessairement joué dans un film qu’ils ont mis en scène).
25 / 56
Renommage
quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas
nécessairement joué dans un film qu’ils ont mis en scène).
1. projeter film sur realisateur
πrealisateur (film)
25 / 56
Renommage
quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas
nécessairement joué dans un film qu’ils ont mis en scène).
1. projeter film sur realisateur
2. projeter film sur acteur
πrealisateur (film)
πacteur (film)
25 / 56
Renommage
quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas
nécessairement joué dans un film qu’ils ont mis en scène).
1. projeter film sur realisateur
πrealisateur (film)
2. projeter film sur acteur
πacteur (film)
3. prendre l’intersection πacteur (film) ∩ πrealisateur (film)
25 / 56
Renommage
quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas
nécessairement joué dans un film qu’ils ont mis en scène).
1. projeter film sur realisateur
πrealisateur (film)
2. projeter film sur acteur
πacteur (film)
3. prendre l’intersection πacteur (film) ∩ πrealisateur (film)
L’intersection ne peut pas être exprimée car l’hypothèse que
realisateur = acteur n’est pas satisfaite
Ceci justifie l’introduction de l’opérateur de renommage des
attributs
25 / 56
Renommage
Le renommage peut servir à
donner le même nom à des attributs distincts
donner des noms distincts
Le renommage de (ABCD) en (AKLD) est défini par
ρren avec ren : {A → A, B → K , C → L, D → D}
En pratique, ren, est spécifié uniquement pour les attributs qui
changent de nom.
Les realisateurs qui sont aussi acteurs
πrealisateur (film) ./ ρacteur→realisateur (πacteur (film))
26 / 56
Renommage : illustration
Les films mis en scène par au moins deux réalisateurs.
? ? ? ? pas d’opération pour compter ? ? ?
1. projection de sur titre, realisateur de film
πtitre,realisateur (film)
2. renommage
ρrealisateur→r1 (πtitre,realisateur (film))
3. renommage
ρrealisateur→r2 (πtitre,realisateur (film))
27 / 56
Renommage : illustration (suite et fin)
4. (q) : ρrealisateur→r1 (πtitre,realisateur (film)) ./
ρrealisateur→r2 (πtitre,realisateur (film))
schéma cible de (q) : Cible(titre, r1, r2).
5. sélection utilisant la condition r1 6= r2 (q’) : σr16=r2 ((q))
schéma cible de l’expression q’ Cible(titre, r1, r2).
6. la projection sur titre donne le résultat :
πtitre (q0 )
28 / 56
Union ensembliste (opération binaire)
Soient r1 et r2 deux instances de même schéma R(V).
Syntaxe :
r1 ∪ r2
Sémantique :
{u; u ∈ r1} ∪ {u; u ∈ r2}
toutes les personnes ayant travaillé sur le tournage du film Marion
ρrealisateur→personne (πrealisateur (σtitre=Marion (film))) ∪
ρacteur→personne (πacteur (σtitre=Marion (film)))
Le schéma cible de l’expression se réduit à l’attribut personne.
29 / 56
La différence ensembliste (opération binaire)
Soient r1 et r2 deux instances de même schéma R(V).
Syntaxe :
r1 \ r2
Sémantique :
{u; u ∈ r1 et u 6∈ r2}
les acteurs qui ne sont pas realisateurs
πacteur (film) \ ρrealisateur→acteur (πrealisateur (film))
30 / 56
SQL : un peu plus compliqué
renommage des attributs du schéma cible
select titre as adjani’s movies from film where acteur=’Adjani’
ρtitre→adjani0 s movies (πtitre (σacteur=0 Adjani0 (film)))
On suppose que l’on a une relation film-duree de schéma
avec Dom(duree)= float et que les durées sont
exprimées en mn.
Film-duree(titre, duree)
valeur des attributs = expression arithmétique
select titre, duree*0.016667 as duree-en-heure from film-duree
introduire une valeur (’heure’) dans une colonne
select titre, duree*0.016667 as duree-en-heure, ’heure’ as unite from
film-duree
31 / 56
SQL : conditions de sélection, chaines de caractères
• condition de la clause select :
comparateurs habituels, arithmétique, concaténation (||), ...
connecteurs : or, and et not
select titre from film
where acteur=’Adjani’ or realisateur=’Poirier’
• motifs pour recherche de cha^
ınes de caractères :
% : une chaı̂ne qcq , : 1 caractère
select titre from film where titre like ’Star
permettra la sélection de chaı̂nes telles que :
’
Star Wars, Star Trek,
...
select titre from film where titre like ’%retour%’
permettra la sélection de :
Le retour à Sarajevo, Aliens le retour, ...
32 / 56
SQL : chaı̂nes de caractères
Attention ...
• chaı̂nes de caractères :
chaı̂nes de longueur fixe / chaı̂nes de longueur variable
chaı̂nes de longueur fixe complétées par des blancs.
majuscules / minuscules
pas de distinction pour les mots clés
distinction pour les valeurs des conditions
• divers ...
les motifs comme les valeurs sont écrits entre ’ ’
négation possible : not like
condition d’intervalle : attribut between val. and val.
33 / 56
SQL : langage de requêtes
date
Différents formats de dates sont disponibles
• manipulation de dates
utiliser le type DATE
– format : aaaa-mm-jj –
BETWEEN DATE ’2003-09-25’ and DATE ’2004-02-15’
34 / 56
SQL : langage de requêtes
requête multi-relation
Sémantique formelle – cas multi-relation :
select
from
where
B1 ... Bk
r1 ... rp
C
πB1 ...Bk (σC (r1 × . . . × rp ))
Les cinémas qui projettent un film dans lequel M.F. Pisier est actrice
(pour chaque cinéma donner le titre du film et l’horaire)
select nomcine, film.titre, horaire from film, prog
where film.titre=prog.titre and acteur=‘M-F. Pisier’
πnomcine,titre,horaire (σacteur=M−F.Pisier (film) ./ prog)
πnomcine,film.titre,horaire (σfilm.titre=prog .titre (
σacteur =M−F .Pisier (ρtitre→film.titre (film)) ./ ρtitre→prog .titre (prog))))
35 / 56
SQL : Introduction de variables
requête multi-relation
Les films avec leur réalisateurs et leurs acteurs
dans lesquels joue M-F Pisier
πtitre (σacteur=M−F.Pisier (film) ./ film)
select F2.titre , F2.realisateur, F2.acteur
from film as F1, film as F2
where F1.titre = F2.titre and F1.acteur=‘M-F. Pisier’
Selon le contexte :
F1 et F2 sont des copies virtuelles de film soit
F1 et F2 sont des variables qui désigneront n’importe quel n-uplet
de film respectivement.
36 / 56
SQL : Union, Intersection, Différence
Les titres des films dans lesquels joue M-F. Pisier et à l’affiche.
select titre from film where acteur=‘M-F. Pisier’
intersect
select titre from prog
Les titres des films qui ne sont pas à l’affiche
select titre from film
except select titre from prog
toutes les personnes ayant participé au tournage du film “Marion”
select acteur as personne from film
where titre = ’Marion’
union
select realisateur as personne from film
where titre = ’Marion’
37 / 56
SQL : ensembles et multi-ensembles
{ 1, 2, 1, 3 } est un multi-ensemble
opération
select-from-where
union, except, intersect
mode ensembliste
distinct
par défaut
mode multi-ensemble
par défaut
all
Elimination des dupliqués
select distinct titre from film
38 / 56
Une requête difficile
les cinémas qui projettent tous les films de Poirier.
instance film de Film
titre
Marion
Marion
Western
Speed2
Speed2
realisateur
Poirier
Poirier
Poirier
J. Bont
J. Bont
acteur
Tetard
Pisier
Pisier
Bullock
Patric
instance prog de Prog
nomcine
Trianon
Trianon
Trianon
UGC
Français
Français
Français
Français
titre
Marion
Marion
Speed2
Speed2
Marion
Western
Marion
Speed2
horaire
20h00
22h00
18h00
20h00
18h00
20h00
22h00
16h00
39 / 56
Une requête difficile
les films réalisés par Poirier.
(q1) : πtitre (σrealisateur=Poirier (film))
q1
titre
Marion
Western
40 / 56
Une requête difficile
les cinémas et les films (quelconques) projetés.
(q2) : πnomcine
CibleE2
titre (prog)
E2
nomcine
Trianon
Trianon
UGC
Français
Français
Français
titre
Marion
Speed2
Speed2
Marion
Western
Speed2
41 / 56
Une requête difficile
créer une relation où tous les films de Poirier sont projetés dans
tous les cinémas.
(q3) : πnomcine (prog) ./ πtitre (q1)
q3
nomcine
Trianon
Trianon
UGC
UGC
Français
Français
titre
Marion
Western
Marion
Western
Marion
Western
q3 \ q2
donne pour chaque ciné les fims de Poirier qu’il ne projette pas !
42 / 56
Une requête difficile
Les cinémas projettant tous les films de Poirier sont obtenus par :
πnomcine (prog) \ πnomcine (q3 \ q2)
nomcine
Français
43 / 56
Syntaxe
q ::= r | πW (q) | σC (q) | q ./ q | ρren (q) | q ∪ q | q \ q
44 / 56
SQL : Sous-Requêtes et Imbrication
Utilisation du résultat d’un select-from-where
film-deb(titre,acteur) stocke le titre du premier film de chaque
acteur. Les acteurs du premier film joué par M-F. Pisier ?
select acteur from film
where titre = (select titre from film-deb
where acteur=‘M-F. Pisier’)
le résultat de la sous-requ^
ete doit ^
etre un singleton
S’exprime de manière non imbriquée
select film.acteur
from film, film-deb
where film.titre=film-deb.titre and film-deb.acteur=’M-F. Pisier’
45 / 56
SQL : Sous-requête avec l’opérateur IN
Les titres des films dont les réalisateurs sont acteurs
(pas forcément dans le m^
eme film).
select titre from film
where realisateur in (select acteur
from film )
Le résultat de la sous-requ^
ete est un ens. de
n-uplets sur titre. S’exprime sans imbrication
select f1.titre
from film as f1, film as f2
where f1.realisateur = f2.acteur
46 / 56
SQL : Sous-requête avec l’opérateur EXISTS
Les films dirigés par au moins deux metteurs en scène
select f1.titre from film as f1
where exists (select f2.realisateur from film as f2
where f1.titre = f2.titre and
not (f1.realisateur=f2.realisateur ))
exists teste si le résultat de la sous-requ^
ete est vide
Une autre formulation est possible sans sous-requête (exercice)
47 / 56
SQL : Sous-requête avec l’opérateur EXISTS
Les films dont au moins un acteur a joué dans un autre film
select f1.titre from film as f1
where exists (select f2.acteur from film as f2
where f1.titre = f2.titre and
exists (select f3.acteur
from film as f3
where f2.acteur=f3.acteur and not (f3.titre=f1.titre)
)
)
autre formulation sans sous-requête (exercice)
48 / 56
SQL : Sous-requête avec l’opérateur IN et EXISTS
Soient 2 schémas de relation R(ABC) et S(BCD) et deux instances r et s
respectivement de R et S -- Voici deux façons d’exprimer πA (r ./ s)
select A from r
where (r.B r.C) in
(select B, C from s )
select A from r as r1
where exists (select s2.B, s2.C from s
where r1.B = s.B and r1.C = s2.C)
Attention : EVITEZ l’usage de sous-requ^
etes car elles sont difficeliemnt
optimisées
49 / 56
SQL : Sous-requête avec la construction comp ALL ou
comp ANY
Les films projetés à l’UGC plus tard que tous les films projetés au
Trianon
select titre from prog
where nomcine =’UGC’ and
horaire > ALL (select horaire from prog
where nomcine=‘Trianon’)
> ALL teste si la valeur de horaire est supérieure à tous les élts du
résultat de la sous-requ^
ete
50 / 56
SQL : Sous-requête avec la construction comp ALL ou
comp ANY
Le téléphone des cinémas qui proposent une programmation après 23h
select telephone from cine as c1
where 23 < any (select horaire from prog
where c1.nomcine = prog.nomcine)
< any teste si la valeur 23 est strictement inférieure à au moins UN
des éléments du résultat de la sous-requ^
ete
ou de facon équivalente :
< any teste s’il existe un élément du résultat de la sous-requ^
ete dont la
valeur soit strictement supérieure à 23
51 / 56
SQL : Aggregats
sum() : somme
avg() : moyenne
min() : minimum
max() : maximum
count() : cardinalité d’un multi-ensemble
Le nombre de films dirigés par Bergman
select count (titre) from prog
where realisateur = ’Bergman’
Eliminer les dupliqués :
select count ( DISTINCT titre) from prog
where realisateur = ’Bergman’
52 / 56
SQL : Groupement
Nombre d’acteurs par film
select titre count(acteur) from film group by titre
titre
t1
t1
t1
t1
t1
t1
t2
réalisateur
m1
m1
m1
m2
m2
m2
m4
acteur
a1
a2
a3
a1
a2
a3
a2
titre
t1
t1
t1
t1
t1
t1
t2
calcul de l’aggrégat (multi-ensemble)
titre
t1
t2
projection
acteur
a1
a2
a3
a1
a2
a3
a2
titre
t1
regroupement
acteur
t2
a1
a2
a3
a1
a2
a3
a2
6
1
select titre count(distinct acteur) from film group by titre
53 / 56
SQL : Groupement et aggrégat
Ajout d’un schéma cinephile(nom, nomcine) :
select nom count(distinct titre) from cinephile, prog
where cinephile.nomcine = prog.nomcine
group by nom
(1) jointure naturelle de cinephile et prog (2) projection
(3) regroupement, et (4) calcul de l’aggrégat
clause select en présence d’aggrégat
select listeatt1 agg(listeatt2)
from liste-relations
where condition
group by listeatt1
54 / 56
SQL : la clause HAVING
Les films et le nombre d’acteurs de ces films à condition qu’il y ait
plus de 3 acteurs.
select titre count( DISTINCT acteur)
from film
group by titre
havingcount(*) >= 3 (* Elimination des groupes ne satisfaisant pas la condition *)
Les films dirigés pas deux metteurs en scène.
select titre from film
group by titre
having count(realisateur) > 2
55 / 56
SQL : Valeurs nulles
Une valeur nulle remplace une valeur d’un attribut.
valeur inconnue,
attribut inapproprié,
valeur incertaine,
valeur cachée ...
Comparaison avec une valeur nulle
vrai=1 - faux=0 - inconnu=1/2
x AND y est évalué à min(x,y),
y OR y à max(x,y) et NOT x à 1-x
Attention : la loi du tiers exclu n’est plus valide
p OR (NOT p)
pour p=1/2 (max(1/2, 1/2) = 1/2 différent de 1)
56 / 56