Upload
amedee-merle
View
115
Download
5
Embed Size (px)
Citation preview
© C. HANACHI, J.M. THEVENIN
1
Licence AESCours d ’informatique
3ème Partie :Interroger une Base de Données
Cours de Mme Soulé-Dupuy [email protected]
Mr Thévenin [email protected]
Polycopié réalisé par C. HANACHI, J.M. THEVENIN
Introduction aux Bases de Données
© C. HANACHI, J.M. THEVENIN
2
© C. HANACHI, J.M. THEVENIN
3
3ème Partie :
Interroger une Base de DonnéesRelationnelle
4. L’algèbre relationnelle5. Le langage SQL
© C. HANACHI, J.M. THEVENIN
4
Chapitre 4 L’algèbre relationnelle
1. Les différents types de langages
2. Bases théoriques
3. Opérations utilisées4. Projection
5. Restriction
6. Jointure
7. Démarche d’interrogation
8. Exemples
9. Union
10. Différence
11. Intersection
12. Démarche de simplification
© C. HANACHI, J.M. THEVENIN
5
4.1 Les différents types de langages
Langage Graphique
R S
a b cAfficher x x x
Critères =Cte
SELECT a,b,cFROM R,SWHERE R S and =Cte
Langage SQL
Langage Algébrique
R S
= Cte
a, b, c
Res
SGBD BD
a b c
© C. HANACHI, J.M. THEVENIN
6
Les différents types de langages
SQL :• Langage puissant et complet
• Interface standard des SGBD
Langages graphiques• Plus faciles d’accès
• Permettent d’exprimer des requêtes SQL simples
• Un langage graphique est spécifique à un SGBD (certains SGBD n’en ont pas)
• Attention ! Si mal maitrisé -> risque de répondre « à côté »
Langage Algébrique• Comprendre la sémantique des requêtes
• Langage intermédiaire de travail
© C. HANACHI, J.M. THEVENIN
7
4.2 Bases théoriques
Théorie des ensembles
OP1
OP3
OP2
Relation Rr1 r2 r3
Table T1r1 r2 r3
Table T2r1 r2 r3 s1 s2
Relation S
s1 s2
Table Résultatr3 s2
© C. HANACHI, J.M. THEVENIN
8
4.3 Opérateurs utilisés
Opérateurs relationnels• Projection
• Restriction
• Jointure
Opérateurs ensemblistes• Union
• Intersection
• Différence
Fonction statistiques• Somme
• Min
• Max
• Moyenne
• ComptageDeLignes (NbVal)
© C. HANACHI, J.M. THEVENIN
9
4.4 Projection
Opération permettant d’éliminer les colonnes qui ne nous intéressent pas dans une table
Ex : Afficher les noms de pays source d’un fleuve
Relation Ra b c
b
b
Rabc
Attribut bAfficher x
SELECT bFROM R
Langage algébrique Langage graphique Langage SQL
© C. HANACHI, J.M. THEVENIN
10
4.5 Restriction
Opération permettant d’éliminer les lignes qui ne nous intéressent pas dans une table
Ex : Liste des pays dont la superficie est supérieure à 1 000 000 Km2
Relation Ra b c
b=10
Rabc
Attribut b Afficher Critère =10
WHERE b=10
Langage algébrique Langage graphique Langage SQL
110210
a b c1010
© C. HANACHI, J.M. THEVENIN
11
4.5 Jointure
Opération permettant de relier des lignes provenant de deux tables différentes selon un critère pour fabriquer une nouvelle table
Ex : Nom et superficie des pays dans lesquels les fleuves prennent leur source
Rabc
WHERE R.c=S.c
Langage algébrique Langage graphique Langage SQL
Relation Ra b c
riri 3fifi 3loulou 3nafnaf 1
Relation Sc d1 cochon2 loup3 canard4 poule
Relation Ra b c
Relation Sc d3 canard3 canard3 canard1 cochon
riri 3fifi 3loulou 3nafnaf 1
R.c=S.c
Scd
© C. HANACHI, J.M. THEVENIN
12
Jointure naturelle
Cas particulier• jointure entre deux tables avec un
prédicat d’égalité entre une clé étrangère et la clé référencée
-> Premet de parcourir les arcs reliant des Entités représentés sur un schéma E/A
Exemple : Fleuves.NomPSource=Pays.NomP
© C. HANACHI, J.M. THEVENIN
13
4.7 Démarche
Soit une question Q que l’on souhaite poser au SGBDa) identifier sur le schéma E/A les propriétés que
l’on doit afficher et celle dont on a besoin pour les restrictions exprimées dans Q
b) choisir sur le schéma E/A les associations par lesquelles on va passer pour relier les entités impliquées en a), en fonction de la sémantique de Q
c) repérer dans le schéma relationnel les attributs et les tables correspondant à ce qui a été repéré en a) et b)
d) effectuer pour chaque table les restriction nécessaires
e) relier les tables 2 à 2 avec les jointures adéquates
f) appliquer à la dernière table obtenue une projection sur les attributs que l ’on souhaite afficher
© C. HANACHI, J.M. THEVENIN
14
4.8 Exemples
Schéma relationnel :
Pays (NomP, Superficie, NbHabitants)EspacesMaritimes (NomEM, Type)Fleuves (NomF, Longueur, NomPSource*, NomEMJette*)Traverser (NomP*, NomF*, Distance)Cotoyer (NomP*, NomEM*)Frontières (NompA*, NompZ*)
Schéma E/A
© C. HANACHI, J.M. THEVENIN
15
Exemples
Q1 Nom et superficie du pays où le Danube prend sa source
Q2 Liste des pays traversés par le Danube. Donner leur nom, leur superficie et la distance parcourue
© C. HANACHI, J.M. THEVENIN
16
Exemples
Q3 Liste des fleuves de plus de 500 Km se jetant dans une mer
Q4 Liste des pays qui côtoient l’espace maritime dans le quel se jette le Rhône
© C. HANACHI, J.M. THEVENIN
17
Exemples
Q5 Liste des pays qui côtoient les espaces maritimes dans lesquels se jette un fleuve prenant sa source en France
© C. HANACHI, J.M. THEVENIN
18
4.9 Union
Opération permettant d’ajouter des lignes à une table
Ex : Insérer les animaux ‘nifnif’ et ‘titi’
Insert Into RValues (‘nifnif’,,1)Values (‘titi’,,5);
Langage algébrique Langage graphique Langage SQL
Relation Ra b c
riri 3fifi 3loulou 3nafnaf 1
Relation Tempa b c
nifnif 1titi 5
U
a b c
riri 3fifi 3loulou 3nafnaf 1nifnif 1titi 5
Pas possible
Relation R
© C. HANACHI, J.M. THEVENIN
19
Union Faire des union de questions
• Utile pour répondre à des questions comportant un OU entre des prédicats portant sur des relations différentes
Ex : liste des pays côtoyant une mer OU un fleuve
Select a1,a2From R, SWhere P1 and R S
UNION
Select a1,a2From T, UWhere P2 and T U
Langage algébrique Langage graphique Langage SQL
Pas possible
U
Résultat satisfaitant Q1 OU Q2
R S
P1
a1,a2
T U
P2
a1,a2Q1 Q2
Q1
Q2
© C. HANACHI, J.M. THEVENIN
20
4.10 Différence
Opération permettant de supprimer des lignes à une table
Ex : Supprimer les animaux ‘nifnif’ et ‘titi’
Delete From RWhere a=‘nifnif’ Or a=‘titi’;
Langage algébrique Langage graphique Langage SQL
Pas possible
Relation Ra b c
riri 3fifi 3loulou 3nafnaf 1
a b cnifnif 1titi 5
_
a b c
riri 3fifi 3loulou 3nafnaf 1nifnif 1titi 5
Relation R Relation Temp
© C. HANACHI, J.M. THEVENIN
21
Différence
Opération permettant de trouver les lignes présentes dans une table et pas dans l’autre• Utile pour tester l’absence de lien entre les
lignes de deux tables
Toutes les questions avec …NE … PAS ...
• Ex : liste des pays NE côtoyant PAS de mer
• PB : - La jointure permet de trouver les lignes d’une table
reliées aux lignes d’une autre table- Elle ne permet pas de retrouver les lignes qui ne sont
pas reliées- ex :
Select nomPfrom Côtoyer, EspaceSMaritimes EMWhere type = ‘ mer ’and Côtoyer.nomEM<> EM.nomEM
retrouve tous les pays côtoyant un océan, dont la France. Pourtant la France côtoie une mer.
© C. HANACHI, J.M. THEVENIN
22
Différence
Faire des différences de questions• Utile pour répondre à des Questions comportant
: NE … PAS
Ex : liste des pays NE côtoyant PAS de mer
Select NomPFrom P
MINUS
Select NomPFrom C, EMWhere type=‘mer’ and C EM
Langage algébrique Langage graphique Langage SQL
Pas possible
_
Résultat satisfaitant NE … PAS
P
NomP
C EM
Type=‘mer’
NomPQ1 Q2
Q1
Q2
© C. HANACHI, J.M. THEVENIN
23
4.11 Intersection
Opération permettant de trouver les lignes présentes dans deux tables de même schéma• Utile pour les questions comportant un
ET entre deux prédicats d’égalité portant sur le même attribut
• Ex: liste des pays côtoyant une mer ET un océan
• PB : EM
Type = ‘ mer ’ etType = ‘ océan ’
© C. HANACHI, J.M. THEVENIN
24
Intersection
Faire des intersections de questions
Ex : liste des pays côtoyant une mer ET un océan
Select a1,a2From R, SWhere P1 and R S
INTERSECT
Select a1,a2From R, SWhere P2 and R S
Langage algébrique Langage graphique Langage SQL
Pas possible
U
Résultat satisfaitant P1 et P2
R S
P1
a1,a2
R S
P2
a1,a2Q1 Q2
Q1
Q2
© C. HANACHI, J.M. THEVENIN
25
4.12 Démarche de simplification Penser à décomposer les questions
compliquées en une succession de questions simples reliées par
- UNION- INTERSECT- MINUS
Exemple :• Liste des pays ne côtoyant ni espace maritime, ni
fleuve
=>
• liste des paysMINUS( liste des pays côtoyant un espace maritime
UNIONliste des pays côtoyant un fleuve )
© C. HANACHI, J.M. THEVENIN
26
Chapitre 5 Le langage de requêtes SQL
1. Introduction
2. Langage déclaratif
3. Syntaxe générale d’une requête SQL4. Syntaxe détaillée
4.1. Expression de la projection4.2. Expression des restrictions4.3. Expression des jointures4.4. Expression des unions, intersections, différences
5. Travail sur le résultat d’une requête SQL
5.1. Tri du résultat5.2. Effectuer un calcul sur le résultat5.3. Effectuer des sous-totaux5.4. Restrictions sur les sous-totaux
6. Exemple Complet de requête
© C. HANACHI, J.M. THEVENIN
27
5.1 Introduction
Caractéristiques :• SQL : version commerciale de
SEQUEL(IBM,1974) • Langage d'interrogation de BD
relationnelles • Normalisé depuis fin 86 (standard)
- version complète dans les gros systèmes (INGRES, ORACLE, DB2, INFORMIX, ...)
- version + ou - complète dans les SGBD Micro (ACCESS, PARADOX, FOXPRO, 4D, …)
• Il est accessible en conversationnel, ou depuis un langage de programmation ;
• Manipule les notions de base de données, de relation (table), de vue, d'index.
© C. HANACHI, J.M. THEVENIN
28
Introduction
4 types de fonctions :• La description de données : permet
de définir, de supprimer une base de données ou une relation
(verbes CREATE, DROP)• Le contrôle de l’accès aux données
(verbes GRANT, REVOKE)• La manipulation des données :
suppression, modification, insertion dans une relation
(verbes DELETE, UPDATE, INSERT)
• L’interrogation d'une base de données (verbe SELECT)
Ce chapitre est centré sur l’interrogation
© C. HANACHI, J.M. THEVENIN
29
5.2 Langage déclaratif
SQL est un langage déclaratif :• L'utilisateur définit le résultat à
obtenir à l’aide de prédicats (QUOI), le système optimise la procédure de recherche (COMMENT)
• Par opposition à l’algèbre relationnelle qui introduit un ordre dans l’enchaînement des opérations
• Par opposition aux langages impératifs : Basic, Pascal, C, Java ...
© C. HANACHI, J.M. THEVENIN
30
Langage déclaratif
Efficacité d’une requête :
Solution 1 Solution 2
Résultat
P T
NomP, Superficie
F
NomF=‘ Rhône’
P.Nomp=T.NomP
T.Nomf=F.Nomf
Résultat
P T
NomP, Superficie
F
NomF=‘Rhône’’
P.Nomp=T.NomP
T.Nomf=F.Nomf
P = PaysT = TraverserF = Fleuves
© C. HANACHI, J.M. THEVENIN
31
Langage déclaratif
Optimisation :
Résultat
P T
NomP, Superficie
F
NomF=‘Rhône’’
P.NomP=T.NomP
T.NomF=F.NomF
NomF
NomF
Opération 1
Opération 2
Opération 3
© C. HANACHI, J.M. THEVENIN
32
5.3 Syntaxe générale d’une requête SQL
SELECT <liste des attributs du résultat>FROM<liste des relations impliquées
dans la requête>
WHERE <formule de sélection : expression logique utilisant les constituants des relations présentes dans le FROM> ;
La formule de sélection peut contenir :• Les opérateurs de comparaison :
>,<,>=,<=,<>• Les opérateurs logiques : AND, OR, NOT• Les prédicats : ALL, ANY, EXISTS,
BETWEEN, LIKE, IN ( à combiner éventuellement avec NOT)
• Des sous-requêtes
© C. HANACHI, J.M. THEVENIN
33
Syntaxe générale d’une requête SQL
Correspondance entre le SQL et le langage algébrique
• L’ordre des prédicats dans la clause WHERE n’a pas d’importance (l’ordre des opérations sera optimisé)
Sémantique
1 On fait le produit cartésien de toutes les tables de la clause FROM
2 On applique à ce résultat tous les prédicats de la clause WHERE
3 On affiche les colonnes de la clause SELECT
R S
P1
a1,a2
SELECT a1,a2
FROM R, S
WHERE P1 and R S
R S
© C. HANACHI, J.M. THEVENIN
34
5.4 Syntaxe détaillée
Base d’exemple
FILM(CodeFilm, Titre, Année, Durée, Réalisateur, Genre)
ACTEUR(Nom, Prénom, DateNaissance, Sexe, Nationalité)
JOUE(CodeFilm*, NomActeur*)
- La durée est exprimée en minutes.
© C. HANACHI, J.M. THEVENIN
35
5.4.1 Expression de la projection
NomRelation.NomAttribut : permet de désigner un attribut• Ex : afficher les noms des Réalisateurs
SELECT Film.RéalisateurFROM Film ;
NomAttribut : permet de désigner un attribut s’il n ’y a pas d’ambiguité sur sa provenance
SELECT RéalisateurFROM Film ;
DISTINCT : permet d’éliminer les lignes en double dans le résultat• Ex : chaque Réalisateurs n’est affiché qu’une fois
SELECT DISTINCT RéalisateurFROM Film ;
© C. HANACHI, J.M. THEVENIN
36
Expression de la projection * : permet de désigner tous les attributs
d’une table
• Ex : afficher la table Film
SELECT Film.*FROM Film ;
ou
SELECT *FROM Film ;
Expression d’un calcul : permet de spécifier un calcul appliqué à une colonne
• Ex : afficher les titres Film et les deux derniers chiffre de leur année de parution
SELECT Titre, Année MOD 100FROM Film ;
Remarque : ce calcul utilise la fonction modulo appliquée à l’année et une valeur constante (100)
© C. HANACHI, J.M. THEVENIN
37
Expression de la projection AS : permet de spécifier l’entête d’une colonne affichée
dans le résultat
• Ex : afficher pour chaque pays le ratio superficie/nombre d’habitants
SELECT NomP AS Pays, Superficie/NbHab AS OccupationFROM Pays ;
Remarque : ce calcul utilise deux valeurs provenant de colonnes différentes mais figurant sur la même ligne
Projection d’une constante : permet de spécifier la valeur affichée dans une colonne
• Ex : existe-t-il des films de plus de 300 minutes
SELECT DISTINCT ‘il existe des films de plus de 300 minutes’ FROM Film
WHERE Duree > 300 ;
© C. HANACHI, J.M. THEVENIN
38
5.4.2 Expression des restrictions
Notion de Prédicat :
• Expression logique à laquelle on peut répondre par VRAI ou par FAUX pour chaque ligne de la table opérande
• Une restriction ne garde que les lignes pour lesquelles on a répondu VRAI
Prédicat simple :
• NomRelation.NomAttribut Valeur
ou
NomAttribut Valeur
est un comparateur : =, <, <=, >, >=, <>
• Ex : titre des films de l'année 1998 ?
SELECT titreFROM filmWHERE année = 1998 ;
© C. HANACHI, J.M. THEVENIN
39
Expression des restrictions
Prédicat composé :
• Combinaison de prédicats reliés par les connecteur AND (ET), OR (OU)
• L’utilisation de parenthèses peut être utile pour préciser comment combiner des prédicats reliés par des AND et des OR
• Ex : titre des films policiers de l'année 1960 et de l'année 1968 ?
SELECT TitreFROM FilmWHERE (Année=1960 OR Année=1968)
AND Genre = ‘policier’;
© C. HANACHI, J.M. THEVENIN
40
Expression des restrictions
NOT : inverse le résultat d’un prédicat
• Ex : titre des films produits entre 1980 et 1983 ?
SELECT TitreFROM FilmWHERE Année>=1980 AND Année<=1983 ;
peut aussi s’écrire :
SELECT TitreFROM FilmWHERE NOT (Année<1980 OR Année>1983) ;
BETWEEN : pour spécifier un prédicat comportant un interval
• Ex : titre des films produits entre 1980 et 1983 ?
SELECT TitreFROM FilmWHERE Année BETWEEN 1980 AND 1983 ;
© C. HANACHI, J.M. THEVENIN
41
Expression des restrictions IN : teste si la valeur d’une colonne est incluse dans un
ensemble • Ex : titre des films produits entre 1980 et 1983 ?
SELECT TitreFROM FilmWHERE Année IN (1980, 1981, 1982, 1983) ;
• Ex : Titre des films réalisés par : PARKER, MALLE, ou VERNEUIL ?
SELECT TitreFROM FilmWHERE Réalisateur IN
(‘PARKER’, ’MALLE’, ’VERNEUIL’) ;
• Ex : Films qui n’ont pas été réalisés par : PARKER, MALLE, ou VERNEUIL ?
SELECT TitreFROM FilmWHERE Réalisateur NOT IN
(‘PARKER’, ’MALLE’, ’VERNEUIL’) ;
© C. HANACHI, J.M. THEVENIN
42
Expression des restrictions
LIKE : comparer la chaîne de caractère d’une colonne à un Modèle
• Modèle : chaîne de caractère avec des jokers :_ (souligné) -> Tout caractère isolé% -> Zéro, un ou plusieurs caractères
• Ex : titre des films de Brian de Palma ?SELECT TitreFROM FilmWHERE Réalisateur LIKE ‘_rian%de%alma’;
UPPER, LOWER : transformer la chaîne de caractère d’une colonne majuscules ou en minuscules
• Certains SGBD différencient A et a
• Ex : titre des films de Malle ?SELECT TitreFROM FilmWHERE UPPER(Réalisateur) =‘MALLE’
© C. HANACHI, J.M. THEVENIN
43
5.4.3 Expression des jointures
Notion de jointure :
• Utilisée pour rassembler des lignes provenant de tables différente reliée par un prédicat
• S’évalue comme une restriction sur le produit cartésien des deux tables
Jointure classique en SQL :
• Exprimée par un prédicat dans la clause WHERE
• NomRel1.NomAtt1 NomRel2.NomAtt2
est un comparateur : =, <, <=, >, >=, <>
• Ex : Afficher les réalisateurs avec qui les acteurs ont joué ?
SELECT NomActeur, RéalisateurFROM Film, JoueWHERE Film.Codefilm = Joue.Codefilm;
© C. HANACHI, J.M. THEVENIN
44
Expression des jointures
FILMCodeFilm Durée Réalisateur Année
F1 2 Fellini 82F2 2 83VerneuilF3 1h30 Fellini 80
JOUECodeFilm* NomActeur*
F2 SignoretF2 MontantF3 MastroianiF3 Montant
FILM X JOUECodeFilm Durée Réalisateur Année CodeFilm* NomActeur*
F1 2 Fellini 82F1 2 Fellini 82F1 2 Fellini 82F1 2 Fellini 82
F2 SignoretF2 MontantF3 MastroianiF3 Montant
VerneuilVerneuilVerneuilVerneuil
F2 SignoretF2 MontantF3 MastroianiF3 Montant
F3 1h30 Fellini 80F3 1h30 Fellini 80F3 1h30 Fellini 80F3 1h30 Fellini 80
F2 SignoretF2 MontantF3 MastroianiF3 Montant
F2 2 83F2 2 83F2 2 83F2 2 83
Lignes qui seront éliminées par le prédicat de jointure
Film.Codefilm = Joue.Codefilm
Remarque : le film F1 ne fera pas parti du résultat de la jointure car il n ’a pas d’acteurs
© C. HANACHI, J.M. THEVENIN
45
Expression des jointures
Semi-Jointure :
• Lorsque l’on veut tester si une ligne d’une première table est reliée à au moins une ligne d’une seconde table, mais que l’on n’affiche pas les informations de la seconde table
• Plus rapide qu’une vraie jointure (car dès que l’on a trouvé un lien, on peut tester la ligne suivante)
• Ex : Qui a joué avec Fellini ?
SELECT NomActeurFROM Joue, FilmWHERE Joue.Codefilm = Film.Codefilm
AND Réalisateur = ‘Fellini ‘ ;
© C. HANACHI, J.M. THEVENIN
46
Expression des jointures
IN : expression d’une Semi-Jointure avec une sous-requête
• La semi-jointure est traitée comme une restriction sur la relation externe avec un prédicat IN
• Une sous-requête produit un ensemble de valeurs compatibles avec l’attribut de jointure de la relation dite externe (RelExt.AttJ IN (SELECT …))
• Cet ensemble de valeurs est extrait parmis les valeurs de l’attribut de jointure de la relation dite interne ((SELECT Attj FROM RelInt …))
• Ex : Qui a joué avec Fellini ?
SELECT NomActeurFROM JoueWHERE Joue.Codefilm IN
(SELECT Film.Codefilm FROM Film WHERE Réalisateur = ‘Fellini ‘) ;
© C. HANACHI, J.M. THEVENIN
47
Expression des jointures
• Ex (suite)
SELECT Film.CodefilmFROM FilmWHERE Réalisateur = ‘Fellini ‘
SELECT Joue.NomActeurFROM JoueWHERE Joue.Codefilm IN (‘F1’, ’F3’ );
CodeFilm F1 F3
© C. HANACHI, J.M. THEVENIN
48
Expression des jointures EXISTS : tester l'existence d’un lien via une
sous-requête
• La semi-jointure est traitée comme une restriction sur la relation externe avec un prédicat EXISTS
• Le prédicats EXISTS est VRAI si la sous-requête associée ramène au moins une ligne résultat.
• La sous-requête est exécutée pour chaque ligne de la relation dite externe. A chaque sous-requête l’attribut de jointure de la relation externe est considéré comme une constante (restriction )
• La sous-requête contient un prédicat de jointure entre la relation externe et la relation dite interne. Cette jointure est traitée comme une restriction.
• Ex : Qui a joué avec Fellini ?
SELECT NomActeurFROM JoueWHERE EXISTS
(SELECT * FROM Film WHERE Réalisateur = ‘Fellini ‘ AND Film.Codefilm = Joue.Codefilm) ;
© C. HANACHI, J.M. THEVENIN
49
5.4.4. Expression des unions, intersections, différences
Composition de requêtes SQL :
• Opérateurs de composition (OC)- UNION- INTERSECT- MINUS
• Syntaxe des requêtes composées
SELECT Colonnes-1FROM …OCSELECT Colonnes-2FROM … ;
- Attention ! Les colonnes spécifiées dans Colonnes-1 et Colonnes-2 doivent être compatibles deux à deux
© C. HANACHI, J.M. THEVENIN
50
Expression des unions, intersections, différences
• Ex : Liste des pays ne côtoyant ni espace maritime, ni fleuve
SELECT NomPFROM PaysMINUS
(SELECT NomP FROM Cotoyer UNION SELECT NomP FROM Traverser) ;
© C. HANACHI, J.M. THEVENIN
51
Expression des unions
UNION : questions avec OU
• Ex : Liste des pays côtoyant une mer OU un fleuve. Afficher leur nom et leur superficie.
SELECT NomP, Superficie FROM Pays, Cotoyer
WHERE Pays.NomP= Cotoyer.NomP UNION SELECT NomP , Superficie FROM Pays, Traverser
WHERE Pays.NomP= Traverser.NomP ;
© C. HANACHI, J.M. THEVENIN
52
Expression des intersections
INTERSECT : questions avec ET
• Ex : Nom et prénom des acteurs qui ont joué dans des comédies et des policiers
SELECT Nom, Prénom FROM Acteurs A, Joue J, Film F
WHERE Genre = ‘Comédie’ AND F.CodeFilm = J.CodeFilm AND J.NomActeur = A.Nom
INTERSECT SELECT Nom, Prénom FROM Acteurs A, Joue J, Film F
WHERE Genre = ‘Policier’ AND F.CodeFilm = J.CodeFilm AND J.NomActeur = A.Nom ;
© C. HANACHI, J.M. THEVENIN
53
Expression des intersections
Jointure : l’intersection peut aussi s’exprimer à l’aide d’une jointure
• Ex : Nom et prénom des acteurs qui ont joué dans des comédies et des policiers
SELECT Nom, Prénom FROM Acteurs A, Joue J1, Film F1,
Joue J2, Film F2WHERE F1.Genre = ‘Comédie’ AND F1.CodeFilm = J1.CodeFilm
AND J1.NomActeur = A.Nom AND F2.Genre = ‘Policier’
AND F2.CodeFilm = J2.CodeFilm
AND J2.NomActeur = A.Nom ;
© C. HANACHI, J.M. THEVENIN
54
Expression des différences
MINUS : questions avec NE … PAS,
• Ex : Nom et prénom des acteurs qui n’ont pas joué dans des comédies
SELECT Nom, PrénomFROM ActeursMINUS
SELECT Nom, Prénom FROM Acteurs A, Joue J, Film F
WHERE Genre = ‘Comédie’ AND F.CodeFilm = J.CodeFilm AND J.NomActeur = A.Nom ;
Principe : pour tester l’absence de lien entre un acteur et une comédie, on sélectionne tous les acteurs sauf (moins) ceux qui sont reliés a un comédie (jointure)
© C. HANACHI, J.M. THEVENIN
55
Expression des différences
NOT IN : La différence peut aussi s’exprimer à l ’aide du prédicat NOT IN• La sous-requête est exécutée une seule fois.
• Le prédicats NOT IN est appliqué à toutes les lignes la relation externe avec l’ensemble de valeurs produit par la sous-requête.
=> résultat = relation externe - sous-requête
• Ex : Nom et prénom des acteurs qui n’ont pas joué dans des comédies
SELECT Nom, PrénomFROM ActeursWHERE Nom NOT IN
(SELECT Nom FROM Acteurs A, Joue J, Film F
WHERE Genre = ‘Comédie’ AND F.CodeFilm = J.CodeFilm
AND J.NomActeur = A.Nom) ;
© C. HANACHI, J.M. THEVENIN
56
Expression des différences
• Ex : Nom et prénom des acteurs qui n’ont pas joué dans des comédies
(suite)
Optimisation des jointures
SELECT Nom, PrénomFROM ActeursWHERE Nom NOT IN
(SELECT NomActeur FROM Joue J, Film F
WHERE Genre = ‘Comédie’ AND F.CodeFilm = J.CodeFilm) ;
La table acteur n ’est pasindispensable
© C. HANACHI, J.M. THEVENIN
57
Tester l’absence de lien NOT EXISTS : tester l’absence de lien
via une sous-requête
• Le prédicats NOT EXISTS est VRAI si la sous-requête associée ne ramène aucune ligne résultat.
• La sous-requête est exécutée pour chaque ligne de la relation dite externe. A chaque sous-requête l’attribut de jointure de la relation externe est considéré comme une constante (restriction )
• La sous-requête contient un prédicat de jointure entre la relation externe et la relation dite interne. Cette jointure est traitée comme une restriction.
• Ex : Qui n’a jamais joué avec Fellini ?
SELECT NomActeurFROM JoueWHERE NOT EXISTS
(SELECT * FROM Film WHERE Réalisateur = ‘Fellini ‘ AND Film.Codefilm = Joue.Codefilm) ;
• Ce genre de requête se traite souvant avec une différence (plus facile à exprimer)
© C. HANACHI, J.M. THEVENIN
58
Tester l’absence de lien NOT IN : tester l’absence de lien via une
sous-requête
ATTENTION ! Ne pas confondre le mode d’emploi des prédicats IN et EXISTS
• Ex : Qui n’a jamais joué avec Fellini ?
SELECT NomActeurFROM JoueWHERE Joue.Codefilm NOT IN
(SELECT Film.Codefilm FROM Film WHERE Réalisateur = ‘Fellini‘) ;
Retrouve tous les acteurs ayant tourné au moins un film dont le réalisateur n’est pas Fellini.
SELECT NomActeurFROM Joue J1WHERE J1. NomActeur NOT IN
(SELECT J2. NomActeur FROM Film F, Joue J2 WHERE Réalisateur = ‘Fellini‘
AND F.Codefilm = J2.Codefilm ) ;
© C. HANACHI, J.M. THEVENIN
59
5.5 Travail sur le résultat d’une requête SQL
Travail sur le résultat d’une requête SQL
Les clauses suivantes sont interprétées après laclause WHERE. Elles permettent d’effectuer untraitement supplémentaires avant d’afficher lerésultat
• 5.1. Tri du résultat
• 5.2. Effectuer un calcul sur le résultat
• 5.3. Effectuer des sous-totaux
• 5.4. Restrictions sur les sous-totaux
© C. HANACHI, J.M. THEVENIN
60
5.1 Tri du résultat ORDER BY : permet de trier le résultat
• Dernière clause d’une requête SQL. • Les colonnes sur lesquelles le résultat est trié sont désignées
par leur nom ou leur n° d’apparition dans la clause SELECT• ASC : tri croissant, DESC : tri décroissant
• Ex : afficher les pays dans l’ordre alphabétique
SELECT NomP FROM PaysORDER BY NomP ASC ;
• Ex : afficher pour chaque pays le ratio superficie/nombre d’habitants. Trier les pays par ordre décroissant de ce ratio.
SELECT NomP AS Pays, Superficie/NbHab AS Occupation
FROM PaysORDER BY 2 DESC, 1 ASC ;Remarque : Le tri sur la colonne 1 indique que les pays ayant le même ration sont affichés dans l’ordre alphabétique
© C. HANACHI, J.M. THEVENIN
61
5.2 Effectuer un calcul sur le résultat
Fonctions Agrégat : SQL propose 5 fonctions permettant d’effectuer un calcul sur une colonne du résultat
• SUM(Att) effectue la somme des valeurs de la colonne Att
• MIN(Att) restitue la plus petite valeur de la colonne Att • MAX(Att) restitue la plus grande valeur de la colonne Att
• MOY(Att) effectue la moyenne des valeurs de la colonne Att
• COUNT(*) compte le nombre de lignes du résultat. COUNT(DISTINCT Att) compte le nombre de valeurs différentes dans la colonne Att
Remarque : l’utilisation de ces fonctions agrège le résultat de la requête en une seule ligne qui affiche le résultat des fonctions.
© C. HANACHI, J.M. THEVENIN
62
Effectuer un calcul sur le résultat
• Ex : afficher le nombre total de films ainsi que leur durée moyenne
SELECT Count(*) AS NombreDeFilms,
MOY(Durée) AS DuréeMoyenneFROM Film ;
=>
FILMCodeFilm Durée Réalisateur Année
F1 2 Fellini 82F2 2 83VerneuilF3 1h30 Fellini 80
NombreDeFilms DuréeMoyenne
3 1h50
© C. HANACHI, J.M. THEVENIN
63
5.3 Effectuer des sous-totaux GROUP BY : permet de partitionner le
résultat de la clause WHERE en sous ensembles sur lesquels on peut appliquer des fonctions agrégat• Cette clause se place derrière la clause WHERE
• Les lignes du résultat sont triées sur les colonnes indiquées dans la clause GROUP BY. Un nouveau sous-ensemble est créé à chaque changement de valeur dans les colonnes du tri
• Les fonctions agrégat peuvent être appliquées aux sous-ensembles de valeurs des colonnes
Remarque : l’utilisation de cette clause agrège le résultat de la requête en une ligne par paquet
Lorsque la requête comporte une clause GROUP BY, la clause SELECT spécifie généralement les colonne de groupement plus des fonctions agrégat
© C. HANACHI, J.M. THEVENIN
64
Effectuer des sous-totaux
• Ex : afficher pour chaque acteur le nombre total de films dans lesquels il a joué
SELECT NomActeur, Count(DISTINCT CodeFilm)FROM FilmGROUP BY NomActeur ;
=>NomActeur COUNT(DISTINCT CodeFilm)
Mastroiani 1
JOUECodeFilm* NomActeur*
F2 SignoretF2 MontantF3 MastroianiF3 Montant
JOUECodeFilm* NomActeur*
F2 Signoret
F2 MontantF3 Mastroiani
F3 Montant
GOUP BY NomActeur
Montant 2
Signoret 1
© C. HANACHI, J.M. THEVENIN
65
5.4. Restrictions sur les sous-totaux
HAVING : permet d’éliminer des sous-ensembles du résultat lorsqu’il est partitionné par une clause GROUP BY• Cette clause se place derrière la clause GROUP BY
• Permet d’effectuer des restriction sur les résultats fonctions agrégat appliquées aux sous-ensembles de valeurs des colonnes
• Lorsque qu’un prédicats est évalué à FAUX, le sous-ensemble est éliminé
© C. HANACHI, J.M. THEVENIN
66
Restrictions sur les sous-totaux
• Ex : afficher le nom des acteurs qui ont joué dans au moins deux films
SELECT NomActeurFROM JoueGROUP BY NomActeurHAVING COUNT(DISTINCT CodeFilm)>=2 ;JOUECodeFilm* NomActeur*
F2 SignoretF2 MontantF3 MastroianiF3 Montant
CodeFilm* NomActeur*
F2 Signoret
F2 MontantF3 Mastroiani
F3 Montant
GOUP BY NomActeur
T2CodeFilm* NomActeur*
F2 Signoret
F2 MontantF3 Mastroiani
F3 Montant
HAVING COUNT(DISTINCT CodeFilm)>=2
NomActeur
Montant
=>
T1