Vous êtes sur la page 1sur 27

03/11/2020

Ingénierie des BD

Elaboré par Mme Emna HKIRI


Emna.hkiri@fsm.rnu.tn

FSM de Monastir 2020-2021


2ème année LSI

Plan du cours

 Cours 1 : Vues et Index


 Cours 2 : PL/SQL
 Cours 3: Gestion des exceptions
Cours 4: Les sous programmes stockés et les packages
Cours 6: Les déclencheurs
 Cours 7: Concurrence et contrôle des accès

1
03/11/2020

Chapitre 1 :
Les Vues et Index

Introduction
 Dans les cours précédents, nous avons vu SQL sous ses aspects les
plus courants, il nous reste à voir d'une part les différents outils nous
permettant d'optimiser ou de faciliter l'accès à une base de donnée,

Les vues et
les Index

2
03/11/2020

Introduction
 Les vues sont des objets de la base de données, constitués d'un nom et
d'une requête de sélection.

 Une fois qu'une vue est définie, on peut l'utiliser comme on le ferait
avec une table qui serait constituée des données sélectionnées par la
requête définissant la vue.
 Nous verrons dans cette première partie du chapitre :
 comment créer, modifier, supprimer une vue ;
 à quoi peut servir une vue ;
 comment modifier les données à partir d'une vue.

Exemple :
Race Espece Animal

id smallint(6) PRIMARY KEY id smallint(6) P KEY id smallint(6) PKEY


nom varchar(40) nom_courant varchar(40) sexe char(1)
espece_id smallint(6) nom_latin varchar(40) date_naissance datetime
description text, description text, nom varchar(30) DF NULL,
prix decimal(7,2) prix decimal(7,2) commentaires text,
date_insertion datetime espece_id smallint(6)
utilisateur_insertion race_id smallint(6)
varchar(20), mere_id smallint(6)
date_modification datetime pere_id smallint(6)
utilisateur_modification disponible tinyint(1) DF 1,

SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,


Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id,
Animal.pere_id, Animal.disponible, Espece.nom_courant AS espece_nom,
Race.nom AS race_nom
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
INNER JOIN Race ON Animal.race_id = Race.id
6

3
03/11/2020

Création d'une vue


 Avec ou sans clause WHERE, il arrive régulièrement que l'on veuille
trouver des renseignements sur nos animaux, y compris leur race et leur
espèce (et seul, l'id contenu dans Animal n'est pas une information très
explicite).
 Dans notre cas: la requête suivante est très utile.

SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,


Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id,
Animal.pere_id, Animal.disponible, Espece.nom_courant AS espece_nom,
Race.nom AS race_nom
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
INNER JOIN Race ON Animal.race_id = Race.id;

 Il serait donc bien pratique de pouvoir stocker cette requête plutôt que
de devoir la retaper en entier à chaque fois
7

La création d'une vue


 Créer une vue consiste à identifier sous un nom une requête SQL qui définit la vue.

 La clause OR REPLACE est facultative. Si elle est fournie, la vue nom_vue sera
soit créée, si elle n'existe pas, soit remplacée, si elle existait déjà.
 nom_vue correspond au nom de la vue (table virtuelle) créée
 liste_attributs est facultatif. Dans le cas où les noms de champ ne sont pas
donnés, ils héritent des noms du SELECT as
 <clause select>commande correspond à une commande SELECT sur une ou
plusieurs table
 WITH permet d'ajouter des contraintes sur la vue

4
03/11/2020

Création de vue: exemple


 La clause OR REPLACE est facultative. Si elle est fournie, la vue
nom_vue sera soit créée, si elle n'existe pas, soit remplacée, si elle
existait déjà.
 Si OR REPLACE est omise et qu'une vue portant le même nom a été
précédemment définie, cela déclenchera une erreur.
 Donc, si l'on reprend la requête précédente, voici comment créer une
vue pour stocker celle-ci :
CREATE VIEW V_Animal_details
AS SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,
Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id, Animal.pere_id,
Animal.disponible, Espece.nom_courant AS espece_nom, Race.nom AS race_nom
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
INNER JOIN Race ON Animal.race_id = Race.id;

Création de vue : exemple

CREATE VIEW V_Animal_details


AS SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,
Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id, Animal.pere_id,
Animal.disponible, Espece.nom_courant AS espece_nom, Race.nom AS race_nom
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
INNER JOIN Race ON Animal.race_id = Race.id;

 Dorénavant, plus besoin de retaper cette requête, il suffit de


travailler à partir de la vue, comme s'il s'agissait d'une table :
SELECT * FROM V_Animal_details;

10

10

5
03/11/2020

Table/vue

D'ailleurs, si l'on demande la liste des tables de la base de données,


on peut voir que la vue est reprise (bien qu'il ne s'agisse pas d'une
table, mais d'une requête SELECT stockée).

Tables_in_elevage
Animal
Espece
Race
V_Animal_details

11

11

Les colonnes de la vue


 Comme pour les tables, on peut utiliser la commande DESCRIBE
pour voir les différentes colonnes de notre vue.
 DESCRIBE V_Animal_details;

12

12

6
03/11/2020

Remarques
 Comme on pouvait s'y attendre, les noms de colonnes ont été
déterminés par la clause SELECT de la requête définissant la vue.

 S'il n'y avait pas d'alias pour la colonne, c'est simplement le même nom
que dans la table d'origine (date_naissance, par exemple), et si un alias a
été donné, il est utilisé (espece_nom, par exemple).

Remarques
??

13

13

Lister les colonnes dans CREATE VIEW


 Il existe une autre possibilité que le recours aux alias dans la clause
SELECT pour nommer les colonnes d'une vue.
 Il suffit de lister les colonnes juste après le nom de la vue, lors de la
création de celle-ci.
 La commande suivante est l'équivalent de la précédente pour la création
de V_Animal_details, mais cette fois sans alias dans la requête
SELECT.

CREATE VIEW V_Animal_details (id, sexe, date_naissance, nom, commentaires,


espece_id, race_id, mere_id, pere_id, disponible, espece_nom, race_nom)
AS SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,
Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id,
Animal.pere_id, Animal.disponible, Espece.nom_courant, Race.nom
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
INNER JOIN Race ON Animal.race_id = Race.id;
14

14

7
03/11/2020

Remarques :
 Il faut toujours vérifier que les colonnes sélectionnées sont dans le bon
ordre par rapport à la liste des noms, car la correspondance se fait
uniquement sur la base de la position.
 Doublons interdits: Comme pour une table, il est impossible que deux
colonnes ayant le même nom cohabitent dans une même vue.
CREATE VIEW V_test
AS SELECT Animal.id, Espece.id
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id;

ERROR 1060 (42S21): Duplicate column name 'id'

 Pour pouvoir créer cette vue, il est nécessaire de renommer une des
deux colonnes dans la vue (exemple avec un alias )

15

15

Requête SELECT stockée dans la vue


 La requête définissant une vue peut être n'importe quelle requête SELECT, à
quelques exceptions près.

 Il n'est pas possible d'utiliser une requête SELECT dont la clause


FROM contient une sous-requête SELECT.

 La requête ne peut pas faire référence à des variables utilisateur, à des


variables système ni même à des variables locales (dans le cas d'une
vue définie par une procédure stockée).

 Toutes les tables (ou vues) mentionnées dans la requête doivent exister
(au moment de la création du moins).

 En dehors de cela, La requête peut contenir une clause WHERE, une clause
GROUP BY, des fonctions (scalaires ou d’agrégation), des opérations
mathématiques, une autre vue, des jointures, etc.

16

16

8
03/11/2020

Application:
 Exemple 1 :L'employé préposé aux oiseaux peut créer une vue sur ceux-
ci afin de ne pas devoir ajouter une clause WHERE espece_id = 1 à
chacune de ses requêtes.
CREATE VIEW V_Oiseaux
AS SELECT id, sexe, date_naissance, nom, commentaires,
espece_id, race_id, mere_id, pere_id, disponible
FROM Animal
WHERE espece_id = 1;

 Exemple 2 : Il est possible de créer une vue définie par une requête qui
compte le nombre d'animaux de chaque espèce que l'on possède.
CREATE OR REPLACE VIEW V_Nombre_espece
AS SELECT Espece.id, COUNT(Animal.id) AS nb
FROM Espece
INNER JOIN Animal ON Animal.espece_id = Espece.id
GROUP BY Espece.id;
17

17

Expression
dans une vue
vue sur une
vue

18

18

9
03/11/2020

Vue sur une vue.


 Exemple 3 : La vue V_Oiseaux sélectionne les Oiseaux. Créons la vue
V_Oiseaux_race qui sélectionne les Oiseaux dont on connaît la race.

 On peut bien sûr créer cette vue à partir de la table Animal, mais on
peut aussi repartir simplement de la vue V_Oiseaux

CREATE OR REPLACE VIEW V_Oiseaux_race


AS SELECT id, sexe, date_naissance, nom, commentaires,
espece_id, race_id, mere_id, pere_id, disponible
FROM V_Oiseaux
WHERE race_id IS NOT NULL

19

19

Expression dans une vue.


 Exemple 4: Voici un exemple de vue définie par une requête contenant
une expression, qui sélectionne les espèces, avec leur prix en dollars.

CREATE VIEW V_Espece_dollars


AS SELECT id, nom_courant, nom_latin, description,
(prix*2.31564, 2) AS « prix_dollars »
FROM Espece;

20

20

10
03/11/2020

La requête SELECT
 La requête SELECT est "fixe « : La requête SELECT définissant une vue est
figée : les changements de structure faits par la suite sur la ou les tables sous-
jacentes n'influent pas sur la vue.
Client
 Par exemple, si l'on crée une vue V_Client toute simple.
id smallint(5) P KEY
nom varchar(100)
CREATE VIEW V_Client prenom varchar(60)
AS SELECT * adresse varchar(200)
FROM Client; code_postal varchar(6)
ville varchar(60)
pays varchar(60)
email varbinary(100)
 Cette vue sélectionne les huit colonnes de Client(id email). Une fois cette
vue créée, elle est figée, et l'ajout d'une colonne dans la table Client ne
changera pas les résultats d'une requête sur V_Client.
 Cette vue sélectionnera toujours les huit colonnes malgré le caractère * dans
la clause SELECT. Pour que V_Client sélectionne la nouvelle colonne de
Client, il faudrait recréer la vue pour l'inclure
21

21

Application :
 Exemple : ajout d'une colonne date_naissance à la table Client.
 ALTER TABLE Client ADD COLUMN date_naissance DATE;
 DESCRIBE V_Client;

Field Type Null Key Default


id smallint(5) unsigned NO 0
nom varchar(100) NO NULL
prenom varchar(60) NO NULL
adresse varchar(200) YES NULL
code_postal varchar(6) YES NULL
ville varchar(60) YES NULL
pays varchar(60) YES NULL
email varbinary(100) YES NULL
22

22

11
03/11/2020

Sélection des données d'une vue


 Une fois la vue créée, on peut bien entendu faire plus qu'un simple
SELECT * FROM la_vue; : on peut tout simplement traiter cette vue
comme une table, et donc ajouter des clauses WHERE, GROUP BY,
des fonctions, des jointures et tout ce que l'on veut !

 Exemple 1 : on sélectionne les chats bruns à partir de la vue


V_Animal_details.

SELECT id, nom, espece_nom, date_naissance, commentaires, disponible


FROM V_Animal_details
WHERE espece_nom = ‘chat brun';

23

23

Vue avec jointure


 Exemple 2 : on sélectionne le nombre d'animaux par espèce avec la vue
V_Nombre_espece, en ajoutant une jointure sur la table Espece pour
avoir le nom des espèces en plus de leur id.
SELECT V_Nombre_espece.id, Espece.nom_courant, V_Nombre_espece.nb

FROM V_Nombre_espece

INNER JOIN Espece ON Espece.id = V_Nombre_espece.id;


id nom_courant nb
1 Chien 21
 Résultat: 2 Chat 20
3 Tortue 14
4 Perroquet 4
5 oiseaux 5
24

24

12
03/11/2020

Utilité des vues

Les vues s'utilisent comme


des tables (elles peuvent être
dans une clause FROM d'un
SELECT, dans un UPDATE,
etc) avec quelques
restrictions, qui dépendent du
SGBD.

25

25

Utilité des vues


 Au-delà de ne pas devoir retaper la même requête encore et encore, les
vues sont utilisées pour différentes raisons, dont voici les principales.
 Clarification et facilitation des requêtes
 Création d'une interface entre l'application et la base de données
 Restriction des données visibles par les utilisateurs

26

26

13
03/11/2020

Modification et suppression d'une vue


 Modification : CREATE OR REPLACE
Pour modifier une vue, on peut tout simplement ajouter la clause OR
REPLACE à la requête de création de la vue, et lui donner le nom de la vue à
modifier. L'ancienne vue sera alors remplacée.

 Si le nom de vue est incorrect et ne correspond à aucune vue existante, aucune


erreur ne sera renvoyée, et simplement une nouvelle vue sera créée.

 ALTER: Il existe aussi la commande ALTER VIEW, qui aura le même effet
que CREATE OR REPLACE VIEW, si la vue existe bel et bien. Dans le cas
contraire, ALTER VIEW générera une erreur.

 Syntaxe : ALTER VIEW nom_vue [(liste_colonnes)]


AS requete_select

27

27

La suppression d'une vue


 La suppression d'une table ne supprime pas la déclaration de la vue
correspondante. Il est donc dans ce cas nécessaire si on veut garder une
cohérence dans la base de supprimer la vue correspondante.
 La commande utilisée est :
 DROP VIEW nom_vue Exemple : DROP VIEW V_Client.

 La notion de vue est implémentée différemment suivant les bases de données.


 Si toutes les grandes bases du marché implémentent la notion de vue, les
accès, et plus particulièrement les mises à jour sont autorisées différemment.

 Postgresql ne supporte pas de manière native la mise à jour des données à


travers une vue. Il faut créer des fonctions pour assurer les mises à jour.

28

28

14
03/11/2020

Modification des données d'une vue


 On a tendance à penser que les vues ne servent que pour la sélection de
données.
 En réalité, il est possible de modifier, d'insérer et de supprimer des
données dans la table par l'intermédiaire d'une vue.
 Les requêtes sont les mêmes que pour insérer, modifier et supprimer
des données à partir d'une table.

Cependant, pour qu'une


vue ne soit pas en
"lecture seule", elle doit
répondre à une série de
conditions.

29

29

Conditions pour qu'une vue permette de


modifier des données (requêtes UPDATE)
 Jointures
 Il est possible de modifier des données à partir d'une vue définie
 avec une jointure, à condition de ne modifier qu'une seule table.
 Exemple
-- Modifie Animal
UPDATE V_Animal_details
SET commentaires = 'Rhume chronique’ Les deux premières modifications ne
WHERE id = 21; posent aucun problème, chacune modifie
des colonnes appartenant à une seule
-- Modifie Race table.
UPDATE V_Animal_details
SET race_nom = 'Maine Coon'
WHERE race_nom = 'Maine coon';

30

30

15
03/11/2020

Conditions pour qu'une vue permette de


modifier des données (requêtes UPDATE)

UPDATE V_Animal_details
SET commentaires = 'Vilain oiseau', espece_nom = 'Perroquet pas beau'
WHERE espece_id = 4;
La modification échouera, car elle modifie
des colonnes appartenant à deux tables
différentes.

ERROR 1393 (HY000): Can not modify more than one base table through a join
view 'elevage.v_animal_details’

 Dans ce cas on a « commentaires » vient de Animal, et « espece_nom »


vient de Espece

31

31

Autres conditions
 On ne peut pas modifier les données à partir d'une vue qui est
elle-même définie à partir d'une vue qui ne permet pas la
modification des données.

 Ce n'est pas non plus possible à partir d'une vue dont la clause
WHERE contient une sous-requête faisant référence à une des
tables de la clause FROM.

32

32

16
03/11/2020

Conditions pour qu'une vue permette d'insérer des


données (requêtes INSERT)
 On peut insérer des données dans une vue si celle-ci respecte les
mêmes conditions que pour la modification de données, ainsi que les
conditions supplémentaires suivantes.

 Valeurs par défaut:


 Les jointures
 Les expressions

33

33

Valeurs par défaut: exemple


 Valeurs par défaut: Toutes les colonnes n'ayant pas de valeur par
défaut (et ne pouvant pas être NULL), de la table dans laquelle on veut
faire l'insertion, doivent être référencées par la vue.
 Exemple: Le stagiaire travaillant dans notre élevage s'occupe
exclusivement des chats et ne doit pas avoir accès aux commentaires.
On ne lui donne donc pas accès à la table Animal, mais à une
vue V_Animal_stagiaire
CREATE VIEW V_Animal_stagiaire
AS SELECT id, nom, sexe, date_naissance, espece_id, race_id
FROM Animal WHERE espece_id = 2;

INSERT INTO V_Animal_stagiaire (nom, sexe, date_naissance, espece_id, race_id)


VALUES (‘Minouche', 'M', '2012-03-12', 1, 9);

34

34

17
03/11/2020

Exemple
id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
La colonne
sexe char(1) DEFAULT NULL,
« commentaires »
date_naissance datetime NOT NULL,
n'est pas
nom varchar(30) DEFAULT NULL,
référencée par
commentaires text, DEFAULT NULL
V_Animal_stagiair
espece_id smallint(6) unsigned NOT NULL,
e, mais peut être
race_id smallint(6) unsigned DEFAULT NULL,
NULL (qui est
mere_id smallint(6) unsigned DEFAULT NULL,
donc sa valeur par
pere_id smallint(6) unsigned DEFAULT NULL,
défaut).
disponible int(1) DEFAULT 1,
PRIMARY KEY (id))

CREATE VIEW V_Animal_stagiaire


AS SELECT id, nom, sexe, date_naissance, espece_id, race_id, mere_id, pere_id, disponible
FROM Animal WHERE espece_id = 2;

INSERT INTO V_Animal_stagiaire (nom, sexe, date_naissance, espece_id, race_id)


VALUES (‘Minouche', 'M', '2012-03-12', 1, 9);
35

35

Requêtes insert
 CREATE VIEW V_Animal_mini
 AS SELECT id, nom, sexe, espece_id
 FROM Animal;

 INSERT INTO V_Animal_mini(nom, sexe, espece_id)


 VALUES ('Toxi', 'F', 1);

 Par contre, l'insertion dans V_Animal_mini échoue, puisque


date_naissance n'est pas référencée, ne peut pas être NULL et n'a pas
de valeur par défaut.

 ERROR 1423 (HY000): Field of view 'elevage.v_animal_mini'


underlying table doesn't have a default value

36

36

18
03/11/2020

Jointures
 Les vues avec jointure peuvent supporter l'insertion si :
 il n'y a que des jointures internes ;
 l'insertion se fait sur une seule table (comme pour la modification).

37

37

Exemple: jointure externe


CREATE VIEW V_Animal_details
AS SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,
Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id,
Animal.pere_id, Animal.disponible, Espece.nom_courant AS espece_nom,
Race.nom AS race_nom FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
LEFT JOIN Race ON Animal.race_id = Race.id;

 INSERT INTO V_Animal_details (espece_nom, espece_nom_latin)


 VALUES ('Perruche terrestre', 'Pezoporus wallicus’);

 Il y a une jointure externe dans V_Animal_details, donc l'insertion ne


fonctionnera pas.

ERROR 1471 (HY000): The target table V_Animal_details of the INSERT is not insertable-into

38

38

19
03/11/2020

Exemple: jointure interne


 Par contre, si l'on crée une table V_Animal_espece avec uniquement une
jointure interne, il n'y a aucun problème.
 Exemple:
CREATE OR REPLACE VIEW V_Animal_espece
AS SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom,
Animal.commentaires, Animal.espece_id, Animal.race_id, Animal.mere_id,
Animal.pere_id, Animal.disponible, Espece.nom_courant AS espece_nom,
Espece.nom_latin AS espece_nom_latin
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id;

INSERT INTO V_Animal_espece (espece_nom, espece_nom_latin)


VALUES ('Perruche terrestre', 'Pezoporus wallicus');

39

39

Les Expressions: exemple


 Les colonnes de la vue doivent être de simples références à des
colonnes, et non pas des expressions.
 Exemple: Dans la vue V_Espece_dollars, la colonne prix_dollars
correspond à (prix*1.30813, 2). Il n'est donc pas possible d'insérer des
données à partir de cette vue.
CREATE VIEW V_Espece_dollars
AS SELECT id, nom_courant, nom_latin, description, (prix*2.31564, 2) AS prix_dollars
FROM Espece;

INSERT INTO V_Espece_dollars (nom_courant, nom_latin, prix_dollars) VALUES


('Perruche terrestre', 'Pezoporus wallicus', 30);

ERROR 1471 (HY000): The target table V_Espece_dollars of the INSERT is not
insertable-into

40

40

20
03/11/2020

Suppression des données à partir d’une vue


 Conditions pour qu'une vue permette de supprimer des données
(requêtes DELETE)

 Il est possible de supprimer des données à partir d'une vue si et


seulement si :
 il est possible de modifier des données à partir de cette
vue ;
 cette vue est "mono-table" (une seule table sous-jacente).

41

41

Application
 Les vues se créent avec la commande CREATE VIEW.
 Un exemple, où les employés d'une entreprise sont dans une table, les
départements de l'entreprise dans une autre et où on doit faire une jointure
pour afficher le nom du département à côté de celui de l'employé :

 Si, par contre, on crée une vue :

 On pourra alors écrire la requête SELECT ci-dessus bien plus simplement, la


jointure ne sera plus visible :

42

42

21
03/11/2020

Récapitulatif
 Une vue est une requête SELECT que l'on stocke et à laquelle on donne un
nom.

 La requête SELECT stockée dans une vue peut utiliser des jointures, des
clauses WHERE, GROUP BY, des fonctions (scalaires ou d’agrégation), etc.
 On peut sélectionner les données à partir d'une vue de la même manière qu'on
le fait à partir d'une table. On peut donc utiliser des jointures, des fonctions,
des GROUP BY, …

 Les vues permettent de simplifier les requêtes, de créer une interface entre
l'application et la base de données, et/ou de restreindre finement l'accès en
lecture des données aux utilisateurs.

 Sous certaines conditions, il est possible d'insérer, de modifier et de supprimer


des données à partir d'une vue.

43

43

Vues matérialisées
 Comme leur nom l'indique, les vues matérialisées sont des vues dont
les données sont matérialisées, c'est-à-dire stockées.
 Une vue matérialisée est un objet qui permet de stocker le résultat d'une
requête SELECT.
 Une vue permet de stocker la requête, la vue matérialisée va stocker
directement les résultats (elle va donc les matérialiser), plutôt que la
requête.
 Lorsque l'on fait une requête sur une vue matérialisée, on va donc
chercher directement des données dans celle-ci, sans passer par les
tables d'origine.

44

44

22
03/11/2020

Vues matérialisées
 Certains SGBD (Oracle, par exemple) permettent de créer directement
des vues matérialisées, avec des outils et des options dédiés. Il suffit
alors de créer les vues matérialisées que l'on désire, de les paramétrer
correctement, et tout se fait automatiquement.

Malheureusement,
MySQL ne propose pas
encore ce type d'objet.

45

45

Jointure interne
 Une jointure interne permet de sélectionner les enregistrements ayant
des correspondances entre deux fichiers joints. Par exemple, pour lister
les clients ayant déjà passé des commandes, il est nécessaire de lier les
fichiers "Client" et "Commande" grâce à une jointure interne. La
requête sélectionnera uniquement les clients liés à au moins un numéro
de commande. Les clients n'ayant jamais passé de commande ne seront
pas listés.
 SELECT ...
FROM (Fichier1 INNER JOIN Fichier2
ON Fichier1.NomRubrique1 = Fichier2.NomRubrique1)
INNER JOIN Fichier3
ON Fichier2.NomRubrique2 = Fichier3.NomRubrique2

46

46

23
03/11/2020

Jointures externes
 Définition
 Une jointure externe permet de sélectionner à la fois :
o les enregistrements ayant des correspondances entre les
deux fichiers joints.
o les enregistrements n'ayant pas de correspondance dans le
premier, le second ou dans tous les fichiers joints.
 Par exemple, pour connaître le montant total dépensé par chaque
client :
o En utilisant une jointure interne, seuls les clients ayant déjà passé
une commande (dont le montant dépensé sera différent de 0)
seront sélectionnés.
o En utilisant une jointure externe, tous les clients seront
sélectionnés, même ceux n'ayant jamais passé de commande.

47

47

Jointure externe: exemple


 SELECT ...
FROM Fichier1
 LEFT/RIGHT/FULL JOIN Fichier2
ON Fichier1.NomRubrique1 = Fichier2.NomRubrique1,
LEFT/RIGHT/FULL JOIN Fichier3
ON Fichier2.NomRubrique2 = Fichier3.NomRubrique2

48

48

24
03/11/2020

Application
 Parmi les requêtes suivantes, laquelle ne peut pas être utilisée
dans une vue ?
 SELECT DISTINCT espece_id FROM Animal;
 SELECT * FROM Animal INNER JOIN Espece ON Animal.espece_id = Espece.id;
 SELECT COUNT(*) FROM Animal;
 SELECT * FROM (SELECT id, race_id FROM Animal WHERE espece_id = 1) AS
Race_chien;

 Quel type de requête ne peut-on pas faire sur une vue ?


 Une requête SELECT avec jointure
 Une requête SELECT qui contient une sous-requête
 Une requête SELECT qui contient une fonction d’agrégation et un GROUP BY
 Ces trois types de requêtes sont possibles.

49

49

Application
 Soit une vue V_X définie par une requête sur la table X. Quelle
action n’affectera pas les données qui pourront être sélectionnées
par la vue V_X ?
 L’insertion de données dans la table X
 L’ajout d’une colonne dans la table X
 La suppression de la table X
 La modification de données de la table X

50

50

25
03/11/2020

Application
 Soit la vue suivante :
CREATE VIEW V_chat
AS SELECT * FROM Animal
WHERE espece_id = 2
WITH CHECK OPTION;
 Que se passera-t-il si l’on insère une ligne dans la table Animal avec la requête
ci-dessous ?
INSERT INTO V_chat (nom, espece_id, date_naissance) VALUES (‘Plop’,
1, NOW());
 L’insertion réussira.
 L’insertion échouera parce que la vue permet la modification de données,
mais pas l’insertion.
 L’insertion échouera à cause de WITH CHECK OPTION.
 L’insertion échouera parce que la requête d’insertion n’est pas correcte.

51

51

Application
 Parmi les quatre éléments suivants, lequel ne sert à rien si l’on
veut améliorer les performances d’une application ?
 Une vue matérialisée
 Une vue
 Parmi les affirmations suivantes, qui concernent les index,
laquelle est fausse ?
 Un index permet d'accélérer les requêtes d’insertion.
 Lorsque l’on met une clé sur une colonne (primaire ou étrangère),
automatiquement, un index existe sur cette colonne.
 Un index permet d’accélérer certaines requêtes de sélection.
 Il peut y avoir plusieurs index sur une même table.
 Une colonne peut être utilisée par plusieurs index.

52

52

26
03/11/2020

Questions ???

53

53

27