CREATE VIEW
CREATE VIEW v_campagne_volume AS
SELECT ca.id, ca.libelle, ca.commune, ca.prix_litre,
COALESCE(SUM(c.litres), 0) AS volume_total,
COUNT(c.id) AS nb_participants
FROM campagne ca
LEFT JOIN commande c ON c.campagne_id = ca.id
GROUP BY ca.id, ca.libelle, ca.commune, ca.prix_litre;
-- on l'interroge comme une table
SELECT * FROM v_campagne_volume WHERE volume_total >= 5000;
Une vue ne stocke pas de données — elle mémorise la requête : à chaque appel MySQL réexécute le SELECT, donc les données sont toujours à jour. (Pas de vue « matérialisée » native, contrairement à PostgreSQL.)
Modifier, supprimer
CREATE OR REPLACE VIEW v_campagne_ouverte AS SELECT id, libelle, prix_litre FROM campagne WHERE statut = 'OUVERTE'; ALTER VIEW v_campagne_ouverte AS SELECT id, libelle, prix_litre, commune FROM campagne WHERE statut = 'OUVERTE'; DROP VIEW IF EXISTS v_campagne_ouverte;
Vues modifiables & CHECK OPTION
Une vue simple (une table, sans agrégat) est modifiable : écrire dessus agit sur la table source. WITH CHECK OPTION empêche d'écrire une ligne qui sortirait du périmètre de la vue.
CREATE VIEW v_campagne_ouverte AS
SELECT id, libelle, statut FROM campagne
WHERE statut = 'OUVERTE'
WITH CHECK OPTION;
-- refusé : la ligne ne satisferait plus la condition
UPDATE v_campagne_ouverte SET statut = 'CLOTUREE' WHERE id = 1;
🛢️ Sur le projet Fioul Groupé
v_campagne_volume est parfaite pour l'appli : elle expose directement le volume cumulé et le nombre de participants, sans réécrire l'agrégation à chaque écran. On peut aussi créer une v_campagne_publique sans les données internes, à donner à la couche mobile.
À retenir
- Une vue est une requête nommée, réévaluée à chaque appel (données à jour).
- CREATE OR REPLACE / ALTER / DROP pour la maintenir.
- Une vue simple est modifiable ; WITH CHECK OPTION pose un garde-fou.
- Usage fioul : exposer le volume agrégé et masquer les colonnes internes.