Parfois, tes requêtes SQL deviennent trop longues, trop complexes et tu te retrouves à répéter la même chose partout. Genre, tu fais un rapport sur les étudiants avec leur moyenne et le nombre de cours — et tu copies le même sous-requête cinq fois. Pour éviter de te répéter, utilise les vues — ou VIEW.
VIEW, c'est comme une “requête sauvegardée” à laquelle tu donnes un nom et que tu peux utiliser comme une table. Elle ne stocke pas les données, juste la structure de la requête.
C'est super utile quand tu veux :
- rendre ton SQL plus lisible ;
- réutiliser une sélection compliquée ;
- cacher les détails techniques aux utilisateurs ;
- gérer les niveaux d'accès (montrer seulement ce qu'il faut).
Comment marche une VIEW ?
Créer une vue, c'est créer une pseudo-table basée sur une requête SELECT. Par exemple :
CREATE VIEW student_avg_grades AS
SELECT
s.student_id,
s.name,
AVG(g.grade) AS avg_grade
FROM
students s
JOIN
grades g ON s.student_id = g.student_id
GROUP BY
s.student_id, s.name;
Maintenant tu peux utiliser student_avg_grades comme une table normale :
SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;
Exemple à la fac
Tu analyses souvent les étudiants, leurs cours et leurs notes. Imaginons qu'il faut faire un rapport récapitulatif pour chaque étudiant :
- nom,
- nombre d'inscriptions aux cours,
- note moyenne.
Si tu fais tout d'un coup, ça donne un SQL super long et illisible. C'est plus cool de découper le truc : d'abord on crée deux vues (VIEW), puis on les combine.
Table students
| id | name |
|---|---|
| 1 | Alex Lin |
| 2 | Anna Song |
| 3 | Maria Chi |
| 4 | Dan Seth |
Table enrollments
| student_id | course_id | grade |
|---|---|---|
| 1 | 1 | 90 |
| 1 | 2 | 85 |
| 2 | 2 | 88 |
| 2 | 3 | 91 |
| 3 | 1 | 75 |
| 3 | 3 | NULL |
- Vue : nombre de cours
Cette vue compte combien de cours chaque étudiant a :
CREATE VIEW student_course_count AS
SELECT
student_id,
COUNT(*) AS course_count
FROM
enrollments
GROUP BY student_id;
Résultat :
| name |
|---|
| Alex Lin |
| Anna Song |
| Maria Chi |
- Vue : note moyenne Et ça, c'est la note moyenne de l'étudiant (si pas de note — NULL, et ça ne compte pas) :
CREATE VIEW student_avg_grade AS
SELECT
student_id,
AVG(grade) AS avg_grade
FROM
enrollments
WHERE grade IS NOT NULL
GROUP BY student_id;
- Utilisation de ces
VIEW
SELECT
s.name,
c.course_count,
a.avg_grade
FROM
students s
LEFT JOIN student_course_count c ON s.student_id = c.student_id
LEFT JOIN student_avg_grade a ON s.student_id = a.student_id;
Maintenant t'as une requête propre et claire. Et surtout — c'est facile à maintenir.
Mise à jour des VIEW
Les vues en général ne contiennent pas de données — c'est juste un "wrapper" autour d'une requête. Mais tu peux même les utiliser pour mettre à jour des données, si la VIEW respecte certaines conditions (genre pas de JOIN, GROUP BY, d'agrégats ou de sous-requêtes).
Exemple de vue modifiable :
CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;
Maintenant tu peux faire :
UPDATE active_students SET name = 'Ivan Petrov' WHERE student_id = 2;
Mais si la VIEW est complexe (genre avec JOIN ou GROUP BY), elle devient lecture seule. Pour les updates, tu peux utiliser des INSTEAD OF triggers, mais là c'est déjà du niveau avancé.
Comment supprimer ou modifier une VIEW
Suppression :
DROP VIEW student_avg_grade;
Mise à jour :
CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;
Exemples : quand une VIEW est vraiment utile
- Faire des rapports
Une VIEW — une logique. Tu peux faire report_enrollments_by_month, report_payments_by_year etc.
- Gérer l'accès
Crée une VIEW qui montre seulement les données limitées (genre sans données perso) et donne l'accès juste à celle-là.
- Réutilisation
Au lieu de copier un sous-requête — donne-lui un nom sous forme de VIEW.
Conseils
- Donne des noms clairs :
view_avg_scores_by_group,active_users_view— c'est plus lisible. - Évite les chaînes de
VIEWdansVIEWdansVIEW— ça complique la compréhension et le debug. - Fais gaffe aux perfs : PostgreSQL va recalculer la
VIEWà chaque requête, sauf si c'est uneMATERIALIZED VIEW.
VIEW — c'est un des outils les plus simples et pratiques dans PostgreSQL. Pas besoin d'apprendre de nouveaux trucs, juste changer ta façon de voir : « Et si je sauvegardais cette requête et l'utilisais comme une table ? » Si ta requête devient trop lourde — elle mérite sûrement de devenir une VIEW.
GO TO FULL VERSION