MySQL进阶学习三(视图)

一、什么是视图

视图是基于一个或多个表的查询结果构建的虚拟表 ,本身不存储数据 (除非物化视图),只保存查询定义。

  • 虚拟表:使用时才执行底层 SQL
  • 不占数据空间:只存定义(普通视图)
  • 简化查询:把复杂 SQL 封装成"表"
  • 安全控制:只暴露部分列/行

二、创建视图语法

  1. 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;
相关推荐
苍何4 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
代码什么用5 小时前
Spring基础使用
java·后端·spring
明月_清风6 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网6 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
程序员Sunday7 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
Yyyyyy~8 小时前
[ Mysql ] 库的操作
mysql
小米里的大麦8 小时前
16 MySQL 事务
数据库·mysql
用户69371750013848 小时前
2026,程序员的时代拐点到了
android·前端·后端
Titan20249 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
惜鸟9 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端