Appearance
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 表:
| id | name | age | grade | gender |
|---|---|---|---|---|
| 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;执行结果:
| id | name | age | gender |
|---|---|---|---|
| 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;执行结果:
| id | name | age | grade | gender | age_category |
|---|---|---|---|---|---|
| 1 | 张三 | 18 | 高三 | 男 | 青少年 |
| 2 | 李四 | 17 | 高二 | 女 | 青少年 |
| 3 | 王五 | 16 | 高一 | 男 | 青少年 |
| 4 | 赵六 | 18 | 高三 | 女 | 青少年 |
| 5 | 钱七 | 17 | 高二 | 男 | 青少年 |
示例 3:创建基于多个表的视图
假设我们还有一个 scores 表:
| id | student_id | subject | score |
|---|---|---|---|
| 1 | 1 | 数学 | 95 |
| 2 | 1 | 英语 | 88 |
| 3 | 2 | 数学 | 92 |
| 4 | 2 | 英语 | 90 |
| 5 | 3 | 数学 | 85 |
| 6 | 3 | 英语 | 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_id | name | subject | score |
|---|---|---|---|
| 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;视图的优点
简化查询:视图可以将复杂的查询封装起来,使用户可以通过简单的查询访问复杂的数据。
数据安全性:视图可以限制用户只能访问特定的列或行,提高数据安全性。
数据一致性:视图可以确保用户看到的数据是一致的,因为视图的定义是固定的。
逻辑独立性:视图可以屏蔽底层表结构的变化,当表结构发生变化时,只需要更新视图的定义,而不需要修改应用程序。
视图的缺点
性能开销:每次查询视图时,都会执行视图定义中的查询,可能会导致性能开销。
更新限制:并不是所有的视图都可以更新,只有满足一定条件的视图才能更新。
复杂性:过多的视图可能会增加数据库的复杂性,使维护变得困难。
可更新视图的条件
在大多数数据库系统中,视图可以更新的条件包括:
视图必须只引用一个表的列,或者引用多个表但使用了连接条件。
视图中不能包含聚合函数(如 SUM、COUNT、AVG 等)。
视图中不能包含 GROUP BY 子句。
视图中不能包含 DISTINCT 关键字。
视图中不能包含计算列。
小结
SQL VIEW 是一种虚拟表,其内容由查询定义。视图可以简化查询、提高数据安全性、确保数据一致性和提供逻辑独立性。然而,视图也有一些缺点,如性能开销和更新限制。在使用视图时,需要根据实际情况权衡其优缺点,合理使用视图。