在 SQL 操作中,你是否遇到过 “频繁查询多表关联的固定结果”“不想让他人看到表中的敏感字段” 这类问题?比如 “每周都要查‘技术部员工的姓名、职位、薪资’”,每次都写多表关联语句很麻烦;又比如 “给实习生开放数据查询权限,但不能让他们看到员工的身份证号、手机号”。这时候,视图(View) 就是解决这些问题的高效工具。今天我们用 “企业员工信息表” 和 “部门表” 为案例,从零学会视图的创建、使用与权限控制,代码可直接复制运行。

我整理了一些学习资料,包含专业、考试、课程等资料,还有游戏和软件的合集。

学习资料合集文档https://www.kdocs.cn/l/cjchDXwklk1B

一、先搞懂:什么是视图?

简单来说,视图就是 “一张虚拟的表”—— 它不是真实存储数据的表,而是由一个 SQL 查询语句(比如多表关联查询、字段筛选查询)定义的 “结果集”。我们可以像操作普通表一样查询视图,但视图的底层数据还是来自原表:

  • 原表数据更新时,视图的查询结果也会同步更新;
  • 视图本身不存储数据,只保存定义它的 SQL 语句。

核心价值:简化复杂查询、控制数据访问权限、保证数据一致性。

准备案例数据:员工表与部门表

为了体现视图的作用,我们创建两张关联表:“员工表(employee)” 和 “部门表(department)”,包含敏感字段(如身份证号、手机号)和关联字段(部门 ID),代码可直接运行:

-- 1. 创建部门表(存储部门信息)
CREATE TABLE department (dept_id INT PRIMARY KEY,  -- 部门ID(主键)dept_name VARCHAR(20) NOT NULL,  -- 部门名称(如技术部、销售部)dept_location VARCHAR(30) NOT NULL  -- 部门位置(如1号楼3层)
);-- 2. 创建员工表(存储员工信息,关联部门表)
CREATE TABLE employee (emp_id INT PRIMARY KEY AUTO_INCREMENT,  -- 员工ID(自增主键)emp_name VARCHAR(20) NOT NULL,  -- 员工姓名dept_id INT NOT NULL,  -- 部门ID(关联部门表)position VARCHAR(20) NOT NULL,  -- 职位(如工程师、经理)salary DECIMAL(10,2) NOT NULL,  -- 月薪id_card CHAR(18) NOT NULL,  -- 身份证号(敏感字段)phone CHAR(11) NOT NULL,  -- 手机号(敏感字段)hire_date DATE NOT NULL,  -- 入职日期-- 外键约束:确保员工的部门ID在部门表中存在FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);-- 3. 插入部门数据
INSERT INTO department (dept_id, dept_name, dept_location)
VALUES
(101, '技术部', '1号楼3层'),
(102, '销售部', '1号楼5层'),
(103, '人事部', '2号楼2层');-- 4. 插入员工数据(包含3个部门的员工,含敏感字段)
INSERT INTO employee (emp_name, dept_id, position, salary, id_card, phone, hire_date)
VALUES
('张三', 101, '后端工程师', 15000.00, '110101199501011234', '13812345678', '2020-03-15'),
('李四', 101, '前端工程师', 14000.00, '110101199602022345', '13987654321', '2021-05-20'),
('王五', 102, '销售经理', 18000.00, '110101199303033456', '13711112222', '2019-01-10'),
('赵六', 102, '销售员', 12000.00, '110101199704044567', '13633334444', '2022-07-05'),
('孙七', 103, '人事专员', 10000.00, '110101199805055678', '13555556666', '2023-02-28'),
('周八', 103, '招聘主管', 13000.00, '110101199406066789', '13477778888', '2021-09-12');-- 查看原表数据(确认插入成功)
SELECT * FROM department;
SELECT * FROM employee LIMIT 3;

原表数据示例(员工表):

emp_id

emp_name

dept_id

position

salary

id_card

phone

hire_date

1

张三

101

后端工程师

15000.00

110101199501011234

13812345678

2020-03-15

2

李四

101

前端工程师

14000.00

110101199602022345

13987654321

2021-05-20

3

王五

102

销售经理

18000.00

110101199303033456

13711112222

2019-01-10

二、视图的核心操作:创建、查询、修改、删除

视图的操作语法简单,核心围绕 “创建视图(CREATE VIEW)” 和 “使用视图(SELECT)”,我们逐个讲解。

1. 创建视图(CREATE VIEW):核心语法

语法:

CREATE VIEW 视图名 AS 定义视图的SQL查询语句;

场景 1:创建 “简化多表关联” 的视图

需求:频繁需要 “查询员工姓名、部门名称、职位、薪资、入职日期”,这个需求需要关联员工表和部门表(employee JOIN department),每次写关联语句很麻烦,所以创建一个视图来简化操作。

代码:

-- 创建视图:员工-部门关联视图(简化多表查询)
CREATE VIEW emp_dept_view AS
SELECT e.emp_name AS 员工姓名,d.dept_name AS 部门名称,e.position AS 职位,e.salary AS 月薪,e.hire_date AS 入职日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;  -- 多表关联逻辑封装在视图中
场景 2:创建 “隐藏敏感字段” 的视图

需求:给实习生开放数据查询权限,但不能让他们看到员工的身份证号、手机号,所以创建一个不含敏感字段的视图。

代码:

-- 创建视图:员工信息公开视图(隐藏敏感字段)
CREATE VIEW emp_public_view AS
SELECT emp_name AS 员工姓名,position AS 职位,salary AS 月薪,hire_date AS 入职日期
FROM employee;  -- 只包含非敏感字段
场景 3:创建 “筛选特定数据” 的视图

需求:经常需要查询 “技术部的员工信息”,所以创建一个只包含技术部员工的视图。

代码:

-- 创建视图:技术部员工视图(筛选特定部门数据)
CREATE VIEW tech_dept_emp_view AS
SELECT e.emp_name AS 员工姓名,e.position AS 职位,e.salary AS 月薪,e.hire_date AS 入职日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id
WHERE d.dept_name = '技术部';  -- 筛选条件封装在视图中

2. 查询视图:像查普通表一样简单

创建视图后,查询视图的语法和查询普通表完全一致,不用再写复杂的关联或筛选逻辑。

例子 1:查询 “员工 - 部门关联视图”

需求:查看所有员工的姓名、部门、职位、薪资。

代码:

-- 查询视图:直接用SELECT查视图,无需多表关联
SELECT * FROM emp_dept_view;

运行结果

员工姓名

部门名称

职位

月薪

入职日期

张三

技术部

后端工程师

15000.00

2020-03-15

李四

技术部

前端工程师

14000.00

2021-05-20

王五

销售部

销售经理

18000.00

2019-01-10

赵六

销售部

销售员

12000.00

2022-07-05

孙七

人事部

人事专员

10000.00

2023-02-28

周八

人事部

招聘主管

13000.00

2021-09-12

例子 2:查询 “技术部员工视图” 并筛选

需求:查看技术部入职时间在 2021 年之后的员工。

代码:

-- 查询视图时,还能加WHERE筛选条件
SELECT * FROM tech_dept_emp_view
WHERE hire_date >= '2021-01-01';

运行结果

员工姓名

职位

月薪

入职日期

李四

前端工程师

14000.00

2021-05-20

3. 修改视图:两种方式(ALTER VIEW / CREATE OR REPLACE VIEW)

如果需要修改视图的定义(比如添加字段、修改筛选条件),有两种常用方式:

方式 1:用 ALTER VIEW 修改

需求:给 “员工 - 部门关联视图” 添加 “部门位置” 字段。

代码:

-- ALTER VIEW修改视图定义
ALTER VIEW emp_dept_view AS
SELECT e.emp_name AS 员工姓名,d.dept_name AS 部门名称,d.dept_location AS 部门位置,  -- 新增字段e.position AS 职位,e.salary AS 月薪,e.hire_date AS 入职日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;-- 验证修改结果
SELECT 员工姓名, 部门名称, 部门位置 FROM emp_dept_view;
方式 2:用 CREATE OR REPLACE VIEW 重建(推荐)

如果视图不存在,就创建;如果已存在,就覆盖修改,避免 “视图已存在” 的报错。

需求:修改 “技术部员工视图”,增加 “部门位置” 字段。

代码:

-- CREATE OR REPLACE VIEW:存在则修改,不存在则创建
CREATE OR REPLACE VIEW tech_dept_emp_view AS
SELECT e.emp_name AS 员工姓名,d.dept_name AS 部门名称,d.dept_location AS 部门位置,  -- 新增字段e.position AS 职位,e.salary AS 月薪,e.hire_date AS 入职日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id
WHERE d.dept_name = '技术部';-- 验证修改结果
SELECT * FROM tech_dept_emp_view;

4. 删除视图:DROP VIEW

如果视图不再需要,用DROP VIEW删除,不会影响原表数据(因为视图是虚拟表)。

代码:

-- 删除“员工信息公开视图”
DROP VIEW IF EXISTS emp_public_view;  -- IF EXISTS:避免“视图不存在”的报错-- 验证删除结果(会提示“表不存在”,说明删除成功)
SELECT * FROM emp_public_view;

三、视图的核心作用:3 个实用价值

通过前面的案例,我们能直观感受到视图的作用,这里总结 3 个核心价值,帮你判断什么时候该用视图:

1. 简化复杂查询,提高效率

把多表关联、复杂筛选的逻辑封装在视图中,后续查询只需要SELECT * FROM 视图名,不用重复写长 SQL。比如前面的 “员工 - 部门关联视图”,把JOIN逻辑封装后,每次查询都能节省写关联语句的时间。

2. 控制数据权限,保护敏感信息

通过视图隐藏原表中的敏感字段(如身份证号、手机号、薪资),给不同角色开放不同视图的权限,实现 “数据隔离”。比如给实习生开放 “emp_public_view”(不含敏感字段),给部门经理开放 “emp_dept_view”(含部门信息),保证数据安全。

3. 保证数据查询的一致性

如果多个场景需要用相同的查询逻辑(比如 “查询月薪大于 12000 的员工”),把这个逻辑封装在视图中,所有场景都查这个视图,避免不同人写的 SQL 逻辑不一致导致结果差异。比如创建 “high_salary_emp_view”(筛选月薪 > 12000 的员工),所有人都查这个视图,确保结果统一。

四、视图的权限控制:给不同角色分配权限

在实际工作中,视图的权限控制通常和 “数据库用户” 结合 —— 创建不同的数据库用户,给他们分配不同视图的查询权限,实现 “按需授权”。这里以 MySQL 为例,讲解基础的权限分配操作。

1. 创建数据库用户(给实习生创建用户)

-- 创建用户:用户名=intern,密码=123456(仅本地访问,@'localhost'表示本地)
CREATE USER IF NOT EXISTS 'intern'@'localhost' IDENTIFIED BY '123456';

2. 给用户分配视图的查询权限(只能查,不能改)

需求:给实习生用户(intern)分配 “tech_dept_emp_view” 和 “emp_dept_view” 的查询权限(SELECT权限),但不能分配原表的权限,也不能分配修改视图的权限。

代码:

-- 给intern用户分配两个视图的SELECT权限
GRANT SELECT ON student_management.tech_dept_emp_view TO 'intern'@'localhost';
GRANT SELECT ON student_management.emp_dept_view TO 'intern'@'localhost';-- 刷新权限,让授权生效
FLUSH PRIVILEGES;

3. 验证权限(切换到 intern 用户)

用 intern 用户登录数据库后,只能查询被授权的视图,不能查询原表(如 employee、department),也不能修改视图:

-- 能查询授权的视图(正常返回结果)
SELECT * FROM tech_dept_emp_view;-- 不能查询原表(会提示“拒绝访问”)
SELECT * FROM employee;-- 不能修改视图(会提示“没有权限”)
ALTER VIEW tech_dept_emp_view AS SELECT * FROM employee;

4. 收回权限(如需取消授权)

如果实习生离职,用REVOKE收回权限:

-- 收回intern用户对tech_dept_emp_view的SELECT权限
REVOKE SELECT ON student_management.tech_dept_emp_view FROM 'intern'@'localhost';-- 刷新权限
FLUSH PRIVILEGES;

五、视图的使用注意事项:3 个避坑点

  1. 视图不能替代原表:视图是基于原表的虚拟表,不能存储数据,修改视图的查询结果(如UPDATE 视图名 SET 字段=值)会同步修改原表数据(需谨慎!),建议尽量只用于查询,不用于修改。
  1. 复杂视图可能影响性能:如果视图包含多层嵌套(视图基于另一个视图创建)、大量JOIN或GROUP BY,查询视图时可能会变慢,建议避免过度嵌套

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95929.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95929.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95929.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全部更新完毕】2025数学建模国赛C题思路代码文章高教社杯全国大学生数学建模-NIPT 的时点选择与胎儿的异常判定

B题全部更新完毕 包含完整的文章全部问题的代码、结果、图表 完整内容请看文末最后的推广群NIPT 的时点选择与胎儿的异常判定 摘要 在问题一中,我们以无创产前检测(NIPT)数据为研究对象,围绕“胎儿 Y 染色体浓度”(记为 (V)) 随孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel(哨兵)是一种用于管理 Redis 实例的高可用性解决方案。它提供了监控、通知和自动故障转移等功能,确保 Redis 服务在发生故障时能够自动恢复,提供高可用性和可靠性。以下是详细介绍 Redis Sentinel 的功能及其代码示…

蓓韵安禧DHA纯植物藻油纯净安全零添加守护母婴健康

在母婴健康领域,选择合适的营养补充品至关重要。纯植物藻油DHA源自纯净藻类,有效规避了海洋重金属污染的风险,确保安全无隐患。配方坚持零添加香精、色素和防腐剂,避免不必要的化学物质摄入,让妈妈和宝宝更安心。同时&…

钉钉 AI 深度赋能制造业 LTC 全流程:以钉钉宜搭、Teambition 为例

制造业 LTC 流程痛点剖析​在制造业,线索到现金(LTC,Lead to Cash)的全流程包含从潜在客户线索的发现、商机培育、销售转化、订单执行到最终收款的一系列复杂环节。传统制造业在这一流程中面临诸多挑战:客户需求的多样…

理解UE4中C++17的...符号及enable_if_t的用法及SFINAE思想

下面是一段C17的代码&#xff1a;//函数1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建设精品采购指南》案例首推运营商行业数据安全核心推荐厂商

在数字经济加速渗透与《网络数据安全管理条例》全面实施的双重背景下&#xff0c;运营商作为数据要素流通的核心枢纽&#xff0c;其安全防护体系建设已成为数字基础设施保障的关键环节。近日&#xff0c;安全 419 正式公布《甲方安全建设精品采购指南》&#xff0c;从近 300 个…

基础词根-汇总

ros rus粗糙 ris cos cus cis切lite文字 late面 侧面ven 来 cess走/agdotect 覆盖 covercele 聚集 加速 gre 聚集&#xff0c;accumu聚集gress 抵达 靠近&#xff0c;aggressive侵略性humor humir 大地 土地chron 时间 time&#xff0c;宇宙的宙lumi 光lightviv vil volun vot/…

JVM中常见的GC垃圾收集器

文章目录 目录 1. Serial GC&#xff08;串行收集器&#xff09; 2. Parallel GC&#xff08;并行收集器&#xff09; 3. CMS&#xff08;Concurrent Mark-Sweep&#xff0c;并发标记 - 清除&#xff09; 4. G1&#xff08;Garbage-First&#xff0c;垃圾优先&#xff09; …

嵌入式C语言之链表冒泡排序

链表冒泡排序一是可以交换指针域的值&#xff0c;二是可以交换指针typedef struct st_node{int score;struce st_node *next;}Node,*LinkList;LinkList createList(){Node *head (Node *)malloc(sizeof(Node));if(NULL head){printf("内存分配失败!"):return NULL;…

远场代码学习_FDTD_farfield

项目4.2 farfield3d - Script command在3D模拟中将给定的功率或场剖面监视器或直线数据集投射到远场。返回电场强度|E| 2。语法描述 out farfield3d("mname",f, na, nb, illumination, periodsa, periodsb, index, direction)&#xff1b; 将给定的功率或场分布监…

Adobe Illustrator(Ai) 2022安装教程与下载地址

Adobe Illustrator&#xff08;通常简称 AI&#xff09;是一款由 Adobe 公司开发的、基于矢量图形的专业设计软件。它与 Photoshop&#xff08;基于位图/像素&#xff09;和 InDesign&#xff08;专注于页面排版&#xff09;并称为数字创意领域的“三巨头”&#xff0c;是平面设…

小迪web自用笔记27

框架就是一些封装好的东西*上节课补&#xff1a;JS负责美化框架的&#xff08;发送HTTP请求前端&#xff0c;js相当于前端并且附加上一些连接后端的功能。&#xff09;&#xff0c;JAVA是后端。PHPthink&#xff08;用的最多的框架&#xff09;URL&#xff1a;原&#xff1a;ht…

创建阿里云ECS实例操作(免费试用版)

目录 1、进入阿里云ECS控制台 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查看ECS信息 6、安装apache服务 7、端口规则设置 8、访问测试 9、释放实例 1、进入阿里云ECS控制台 https://www.aliyun.com/ 2、创建ECS实例 3、重置实例密码 4、远程登陆实例 5、查…

JVM相关 4|JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总

目录&#xff1a;&#x1f9e0; 一、JVM调优目标1. 调优核心目标2. 调优常见问题&#x1f9e9; 二、JVM调优核心参数详解1. 堆内存相关参数2. 垃圾回收器相关参数3. GC日志与性能监控4. 元空间&#xff08;Metaspace&#xff09;调优5. 栈内存调优6. 其他关键参数&#x1f4cc;…

HOT100--Day13--104. 二叉树的最大深度,226. 翻转二叉树,101. 对称二叉树

HOT100–Day13–104. 二叉树的最大深度&#xff0c;226. 翻转二叉树&#xff0c;101. 对称二叉树 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型&#xff1a;二叉树。 关键&#xff1a;要深刻理解《递归》 104. 二叉树的最大深度 方法&#xff1a;递归 思路&…

Maven 从 0 到 1:安装、配置与依赖管理一站式指南

Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南Maven 从 0 到 1&#xff1a;安装、配置与依赖管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 仓库机制四、安装Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安装使用docker

一.前置概念Docker 与 Kubernetes 共用同一个 containerd 进程 时&#xff0c;只要满足以下 3 个条件&#xff0c;就不会冲突&#xff1a;检查点要求原因cgroup-driverkubelet 与 containerd 必须同为 systemd二者不一致会导致 Pod 无法调度Unix socketkubelet 指向 /run/conta…

开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究

摘要&#xff1a;本文聚焦于开源AI智能名片链动21模式S2B2C商城小程序在提升客户复购率和转介绍率方面的作用。服务对于促进客户复购和转介绍的重要性不言而喻&#xff0c;维护老客户的成本远低于开发新客户&#xff0c;微商通过推出各项服务来赢得客户忠诚。本文深入探讨开源A…

[数据结构] ArrayList(顺序表)与LinkedList(链表)

目录 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 线性表 3. ArrayList 类(顺序表) 3.1 顺序表定义 3.2 ArrayList链表的功能模拟实现 3.3 ArrayList简介 3.4 ArrayList的构造方法 3.5 ArrayList的遍历 3.5 ArrayList的具体使用实例 3.5.1 杨辉三角 …

Hive使用Tez引擎出现OOM的解决方法

环境是Hive以Tez作为引擎&#xff0c;然后使用客户端&#xff08;比如DataGrip&#xff09;连接Hive运行SQL查询&#xff0c;运行过程中报错信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…连接工具以DataGrip为例&#xff0c;解决办法如下&#xff1a; --…