一、什么是视图
视图是基于一个或多个表的查询结果构建的虚拟表 ,本身不存储数据 (除非物化视图),只保存查询定义。
- 虚拟表:使用时才执行底层 SQL
- 不占数据空间:只存定义(普通视图)
- 简化查询:把复杂 SQL 封装成"表"
- 安全控制:只暴露部分列/行
二、创建视图语法
- OR REPLACE(存在则替换)等价于"存在先删再建",但不报错。
sql
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名 [(列名1, 列名2, ...)]
AS
SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
1. 基本创建
sql
CREATE VIEW v_employee AS
SELECT id, name, dept_id, salary
FROM employee
WHERE status = 1;
2. 指定列名
sql
CREATE VIEW v_emp (emp_id, emp_name, dept, sal) AS
SELECT id, name, dept_id, salary
FROM employee;
不指定列名时,默认用 SELECT 的列名/别名。
三、查看视图
sql
-- 查看所有视图
SHOW FULL TABLES WHERE TABLE_TYPE = 'VIEW';
-- 查看视图定义
SHOW CREATE VIEW v_employee;
-- 查看视图结构
DESC v_employee;
-- 信息模式查询
SELECT * FROM information_schema.VIEWS
WHERE TABLE_NAME = 'v_employee';
四、使用视图
视图使用方式和表一样:
sql
-- 查询
SELECT * FROM v_employee WHERE salary > 10000;
-- 聚合
SELECT dept_id, COUNT(*) FROM v_emp_dept GROUP BY dept_id;
-- 连接
SELECT * FROM v_employee e JOIN department d ON e.dept_id = d.id;
-- 排序分页
SELECT * FROM v_employee ORDER BY salary DESC LIMIT 10;
五、修改视图
方式 1:CREATE OR REPLACE
sql
CREATE OR REPLACE VIEW v_employee AS
SELECT id, name, salary FROM employee WHERE status = 1;
方式 2:ALTER VIEW
sql
ALTER VIEW v_employee AS
SELECT id, name, dept_id, salary FROM employee WHERE status = 1;
两者等价,
ALTER VIEW更语义化。
六、删除视图
sql
DROP VIEW [if exists] v_employee;
-- 多个
DROP VIEW v1, v2, v3;
-- 存在才删(避免报错)
DROP VIEW IF EXISTS v_employee;