Skip to content

SQL VIEW

SQL VIEW(视图)是一个虚拟表,其内容由查询定义。视图包含行和列,就像一个真实的表一样,但是视图中的数据并不是存储在数据库中的,而是在查询视图时动态生成的。

语法

创建视图

sql
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

创建或替换视图

sql
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

删除视图

sql
DROP VIEW view_name;

-- 条件删除视图(仅在视图存在时删除)
DROP VIEW IF EXISTS view_name;

更新视图

sql
-- 方式 1:使用 CREATE OR REPLACE VIEW
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

-- 方式 2:先删除再创建
DROP VIEW view_name;
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

示例

示例 1:创建基本视图

假设我们有以下 students 表:

idnameagegradegender
1张三18高三
2李四17高二
3王五16高一
4赵六18高三
5钱七17高二
sql
-- 创建一个只包含高三学生的视图
CREATE VIEW senior_students AS
SELECT id, name, age, gender
FROM students
WHERE grade = '高三';

-- 查询视图
SELECT * FROM senior_students;

执行结果:

idnameagegender
1张三18
4赵六18

示例 2:创建带计算列的视图

sql
-- 创建一个包含学生信息和年龄分类的视图
CREATE VIEW student_age_category AS
SELECT 
    id, 
    name, 
    age, 
    grade, 
    gender,
    CASE 
        WHEN age < 16 THEN '未成年'
        WHEN age >= 16 AND age <= 18 THEN '青少年'
        ELSE '成年'
    END AS age_category
FROM students;

-- 查询视图
SELECT * FROM student_age_category;

执行结果:

idnameagegradegenderage_category
1张三18高三青少年
2李四17高二青少年
3王五16高一青少年
4赵六18高三青少年
5钱七17高二青少年

示例 3:创建基于多个表的视图

假设我们还有一个 scores 表:

idstudent_idsubjectscore
11数学95
21英语88
32数学92
42英语90
53数学85
63英语80
sql
-- 创建一个包含学生姓名和成绩的视图
CREATE VIEW student_scores AS
SELECT 
    s.id AS student_id,
    s.name,
    sc.subject,
    sc.score
FROM students s
JOIN scores sc ON s.id = sc.student_id;

-- 查询视图
SELECT * FROM student_scores;

执行结果:

student_idnamesubjectscore
1张三数学95
1张三英语88
2李四数学92
2李四英语90
3王五数学85
3王五英语80

示例 4:更新视图

sql
-- 创建或替换视图
CREATE OR REPLACE VIEW senior_students AS
SELECT id, name, age, gender, grade
FROM students
WHERE grade = '高三';

-- 查询更新后的视图
SELECT * FROM senior_students;

示例 5:删除视图

sql
-- 删除视图
DROP VIEW senior_students;

-- 条件删除视图
DROP VIEW IF EXISTS senior_students;

视图的优点

  1. 简化查询:视图可以将复杂的查询封装起来,使用户可以通过简单的查询访问复杂的数据。

  2. 数据安全性:视图可以限制用户只能访问特定的列或行,提高数据安全性。

  3. 数据一致性:视图可以确保用户看到的数据是一致的,因为视图的定义是固定的。

  4. 逻辑独立性:视图可以屏蔽底层表结构的变化,当表结构发生变化时,只需要更新视图的定义,而不需要修改应用程序。

视图的缺点

  1. 性能开销:每次查询视图时,都会执行视图定义中的查询,可能会导致性能开销。

  2. 更新限制:并不是所有的视图都可以更新,只有满足一定条件的视图才能更新。

  3. 复杂性:过多的视图可能会增加数据库的复杂性,使维护变得困难。

可更新视图的条件

在大多数数据库系统中,视图可以更新的条件包括:

  1. 视图必须只引用一个表的列,或者引用多个表但使用了连接条件。

  2. 视图中不能包含聚合函数(如 SUM、COUNT、AVG 等)。

  3. 视图中不能包含 GROUP BY 子句。

  4. 视图中不能包含 DISTINCT 关键字。

  5. 视图中不能包含计算列。

小结

SQL VIEW 是一种虚拟表,其内容由查询定义。视图可以简化查询、提高数据安全性、确保数据一致性和提供逻辑独立性。然而,视图也有一些缺点,如性能开销和更新限制。在使用视图时,需要根据实际情况权衡其优缺点,合理使用视图。