Les Vues

Définition

Permet de faire de nouveaux points de vues sur les données. Une vue est une table virtuelle, stockée nul part, définie par une requête et recalculée à chaque requête.

Une vue matérielle, ou snapshot, est une vue stockée et recalculée non pas à chaque requête mais à intervalles fixes. Peut également être recalculée au déclenchement d'un évenement comme une mise-à-jour. (Non disponible sous mysql < 4.)

Équivalent à une sous-requête, en plus lisible et un peu plus performant. Permet également de gérer des droits utilisateurs plus finement (vendeurs livres n'ont accès qu'a la vue

Syntaxe pour créer une vue :

CREATE VIEW nom
AS SELECT...;

Manipulation

Exemple

CREATE VIEW v_rayon_livres
AS SELECT *
FROM produits
WHERE type
LIKE 'livre';

SELECT * FROM v_rayon_livres;
# équivalent à la sous-requête :
SELECT * FROM (SELECT * FROM produits WHERE type LIKE 'livre');

Métabilité à jour (updatability)

Propriété d'une vue qui dit si la vue peut être mise à jour en insertion, en modification ou en suppression en les insérant dans la table d'origine

S'il manque des attributs importants (clé primaire, attributs ne pouvant être nuls, etc.) ou qu'il y a un aggrégat elle ne pourra pas être mise à jour.

On peut mettre à jour une vue si les attributs modifiés ou insérés proviennent de la même table. On ne peut pas insérer dans plusieurs tables à la fois.

Exemple

CREATE VIEW v_noteEp2
AS select *
FROM note
WHERE numEpreuve = 2;

INSERT INTO v_noteEp2 (numEtudiant, numEpreuve, note)
VALUES (14, 2, 4);

Tous les attributs sont présents, l'insertion fonctionne. Sans l'attribut non-null numEpreuve l'insertion aurait été impossible.

Check Option

Mais avec cette vue l'on peut insérer des notes dans les autres épreuves, pas forcément la 2. Pour interdire ces insertions l'option WITH CHECK OPTION s'assure que les données insérées soient cohérentes avec la vue.

mysql> CREATE VIEW v_noteEp3
    -> AS SELECT * FROM note WHERE numEpreuve = 3
    -> WITH CHECK OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO v_noteEp3 (numEtudiant, numEpreuve, note)
    -> VALUES (7, 3, 11.5);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO v_noteEp3 (numEtudiant, numEpreuve, note)
    -> VALUES (7, 9, 11.5);
ERROR 1369 (HY000): CHECK OPTION failed 'ecole.v_noteEp3'

Exemples SQL

#1. Quelle est l'épreuve qui a la meilleure moyenne ?
create view v_moyennes
as select numEpreuve, max(moyenne)
from note
group by numEpreuve;

select numEpreuve
from v_moyennes
where moyenne = (select max(moyenne) from v_moyennes);

#2. Utiliser des vues pour insérer
create view v_notes_gpre_1
as select note.*
from note
join participation on note.numEtudiant = participation.numEtudiant
where participation.numGroupe = 1;

insert into v_notes_gpre_1 (numEtudiant, numEpreuve, note) values (2, 8, 11);

#2.2 avec le check option
create view v_notes_gpre_2
as select note.*
from note
join participation on note.numEtudiant = participation.numEtudiant
where participation.numGroupe = 2
with check option;

insert into v_notes_gpre_1 (numEtudiant, numEpreuve, note) values (1, 5, 3);