SQL VIEW 视图
学习创建和使用视图 · 难度:高级 · +15XP
SQL VIEW 视图
视图(View)是一种虚拟表,它不存储实际数据,只是一个被保存的 SQL 查询语句。当你查询视图时,数据库会动态执行视图关联的 SELECT 语句并返回结果。视图就像是给复杂查询起了一个名字,之后你可以像操作普通表一样从这个名字中查询数据,大大简化了复杂查询的复用和管理。
视图的核心优势
- 简化复杂查询:将多表 JOIN、聚合计算等复杂逻辑封装为视图,使用时只需简单的 SELECT
- 安全性:隐藏表的某些列,只暴露必要字段给不同用户
- 逻辑独立性:表结构变化时只需修改视图定义,应用层代码无需改动
- 数据一致性:所有使用视图的地方看到的都是同一套逻辑,避免各处重复编写查询
创建视图
-- 基本语法
CREATE VIEW 视图名 AS
SELECT 列1, 列2, ... FROM 表名 WHERE 条件;
-- 示例:创建一个高分学生视图
CREATE VIEW top_students AS
SELECT name, score FROM students WHERE score >= 85;
-- 示例:创建包含多表JOIN的视图
CREATE VIEW student_course AS
SELECT s.name, c.course_name, sc.score
FROM students s
JOIN scores sc ON s.id = sc.student_id
JOIN courses c ON sc.course_id = c.id;
使用视图
视图创建后,你可以像查询普通表一样使用它:
-- 查询视图
SELECT * FROM top_students;
-- 对视图加条件过滤
SELECT * FROM top_students WHERE score > 90;
-- 视图也可以参与 JOIN
SELECT t.name, t.score, c.course_name
FROM top_students t
JOIN scores sc ON t.name = sc.student_name
JOIN courses c ON sc.course_id = c.id;
修改和删除视图
-- 修改视图定义
CREATE OR REPLACE VIEW top_students AS
SELECT name, score, age FROM students WHERE score >= 80;
-- 删除视图
DROP VIEW top_students;
-- 删除视图(如果存在才删除,避免报错)
DROP VIEW IF EXISTS top_students;
可更新视图的条件
并非所有视图都可以执行 INSERT/UPDATE/DELETE。可更新视图必须满足:
- 视图基于单表(无 JOIN)
- SELECT 中不包含聚合函数、DISTINCT、GROUP BY、HAVING
- 视图包含了表中所有 NOT NULL 且无默认值的列
实战任务
- 创建一个包含学生姓名和分数的视图
- 通过视图查询分数大于等于 85 的学生
- 尝试修改视图定义,增加年龄列