Skip to content

Les vues

Une vue est une requete SQL enregistrée sur le serveur. C’est un objet de base de données qui partage le meme espace de noms des tables. Une vue ne peut avoir le meme nom qu’une table dans une meme base de données car, une vue est apparentée à une table virtuelle. On aura les memes types de manipulation qu’une table.

Pourquoi choisir une vue?

Permet d’enregistrer des requetes complexes.

Améliore la sécurité : un utilisateur possedant des privileges sur une vue n’aura pas forcément les memes sur les tables sous-jacentes.

Présentation différente d’une meme information.

Afficher une information provenant de différentes tables

Syntaxe

	CREATE || REPLACE
	[ALGO {  } ]
	[definer = {user|current_user}]
	[SQL SECURITY {DEFINER|INVOKER}]
	VIEW nom_vue
	AS SELECT
	[WITH CASCADED|LOCAL CHECK OPTION]

Attention : Si on donne le meme nom qu’une table, MySQL renvoie une erreur

Lorsque la table est modifiée, la vue restera sous sa forme originale

Lorsque on fait SHOW TABLES, on peut voir les TABLES mais aussi les VUES de la base de données. Pour les distinguer, on spécifiera FULL.

Pour visualiser la requete de création de la vue, on fera un SHOW CREATE VIEW nom_vue;

Spécificité

L’instruction SELECT ne peut avoir de sopus-requetes dans sa clause FROM.

Dans l’instruction SELECT, on ne peut pas avoir de référence sur une variable systeme ou une variable utilisateur.

On ne peut faire référence à une requete préparée.

On ne peut créer une vue sur une table temporaire.

On ne peut créer de vues sur une table inexistante.

mysql> SHOW FULL TABLES;
+-----------------+------------+
| Tables_in_test  | Table_type |
+-----------------+------------+
| city            | BASE TABLE |
| country         | BASE TABLE |
| countrylanguage | BASE TABLE |
+-----------------+------------+
3 rows in set (0.00 sec)
mysql> INSERT INTO t1(v1,v2) VALUES ('a',1),('b',2),('c',3),('d',4);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 SELECT * FROM t1;
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> CREATE VIEW vue1 AS SELECT * FROM t1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM vue1;
+------+------+
| v1   | v2   |
+------+------+
| a    |    1 |
| b    |    2 |
| c    |    3 |
| d    |    4 |
+------+------+
4 rows in set (0.00 sec)

mysql> ALTER TABLE t1 DROP v1;
Query OK, 4 rows affected (0.08 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM vue1;
ERROR 1356 (HY000): View 'test.vue1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

/*
La modification d'une table influe sur la vue.
*/

mysql> INSERT INTO t1(v1,v2) VALUES ('e',5);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM vue1;
+------+------+
| v1   | v2   |
+------+------+
| a    |    1 |
| b    |    2 |
| c    |    3 |
| d    |    4 |
| e    |    5 |
+------+------+
5 rows in set (0.00 sec)

mysql> DELETE FROM vue1 WHERE v2=5;
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM vue1;
+------+------+
| v1   | v2   |
+------+------+
| a    |    1 |
| b    |    2 |
| c    |    3 |
| d    |    4 |
+------+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t1;
+------+------+
| v1   | v2   |
+------+------+
| a    |    1 |
| b    |    2 |
| c    |    3 |
| d    |    4 |
+------+------+
4 rows in set (0.00 sec)

/*
La modification d'une vue influe sur la table sous-jacente.
*/

mysql> CREATE VIEW vue2 AS SELECT CONCAT(v1,v2) AS v12 FROM t1;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM vue2 WHERE v12 = 'd4';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM vue2;
+------+
| v12  |
+------+
| a1   |
| b2   |
| c3   |
+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM t1;
+------+------+
| v1   | v2   |
+------+------+
| a    |    1 |
| b    |    2 |
| c    |    3 |
+------+------+
3 rows in set (0.00 sec)