42.MySQL视图

1.一个需求

emp 表的列信息很多,有些信息是个人重要信息 (比如 sal, comm, mgr, hiredate),如果我们希望某个用户只能查询 emp 表的 (empno、ename, job 和 deptno ) 信息,有什么办法?

表的数据:

想让用户查询到的:

MySQL提供的视图(view)功能就可以满足我们的需求。

2.视图的基本概念

  1. 视图是一个虚拟表 ,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
  2. 视图和基表关系的示意图
  1. 对视图的总结

①视图是根据基表来创建的,视图是虚拟的表;

②视图也有列,数据来自基表;

③通过视图可以修改基表的数据;

④基表的改变,也会影响到视图的数据。

3.视图的基本使用

3.1创建一个新视图

复制代码
create view 视图名 as select语句  

3.2修改已存在的视图

复制代码
alter view 视图名 as select语句 

3.3查看某个视图的创建语句

复制代码
SHOW CREATE VIEW 视图名

3.4删除一个或多个视图

复制代码
drop view 视图名1,视图名2

4.视图的使用细节

视图(view)

● 视图细节讨论

  1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm) ;

    CREATE VIEW emp_view AS SELECT empno,ename,job,deptno FROM emp;

可以看到视图只有emp_view.frm这个结构文件,而不像别的数据库表有其真正的数据文件。

  1. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ] ;

查询一下基表和视图最原始的样子:

在视图中修改数据,基表也会随之改变:

复制代码
UPDATE emp_view SET job = 'worker' WHERE empno = 7499;

在基表中插入数据,视图也会更新。

复制代码
INSERT INTO emp VALUES(8848,'sakura','worker',8888,'2013-6-1',800,200,30);
  1. 视图中可以再使用视图,数据仍然来自基表。

    CREATE VIEW emp_view_view AS SELECT ename,job,deptno FROM emp;

    SELECT * FROM emp_view_view;

5.视图的使用实例

● 视图练习:针对 emp , dept ,和 salgrade 张三表.创建一个视图,可以显示雇员编号,雇员名,雇员部门名称和薪水级别。

数据库建表准备,并且插入一些示例数据:

复制代码
CREATE TABLE emp (
    empno INT PRIMARY KEY,        
    ename VARCHAR(50) NOT NULL,  
    job VARCHAR(50),             
    mgr INT,                       
    hiredate DATE,                
    sal DECIMAL(10,2) NOT NULL,   
    comm DECIMAL(10,2),           
    deptno INT
);

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES 
(7369, 'SMITH',  'CLERK',     7902, '1980-12-17', 800.00,  NULL,   20),
(7499, 'ALLEN',  'SALESMAN',  7698, '1981-02-20', 1600.00, 300.00, 30),
(7521, 'WARD',   'SALESMAN',  7698, '1981-02-22', 1250.00, 500.00, 30),
(7566, 'JONES',  'MANAGER',   7839, '1981-04-02', 2975.00, NULL,   20),
(7654, 'MARTIN', 'SALESMAN',  7698, '1981-09-28', 1250.00, 1400.00,30),
(7698, 'BLAKE',  'MANAGER',   7839, '1981-05-01', 2850.00, NULL,   30),
(7782, 'CLARK',  'MANAGER',   7839, '1981-06-09', 2450.00, NULL,   10),
(7788, 'SCOTT',  'ANALYST',   7566, '1987-04-19', 3000.00, NULL,   20),
(7839, 'KING',   'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL,   10),
(7844, 'TURNER', 'SALESMAN',  7698, '1981-09-08', 1500.00, 0.00,   30);

CREATE TABLE dept (
    deptno INT PRIMARY KEY,       
    dname VARCHAR(50) NOT NULL,   
    loc VARCHAR(50)      
);

INSERT INTO dept (deptno, dname, loc)
VALUES 
(10, 'ACCOUNTING', 'NEW YORK'),  -- 财务部,对应 emp 中 deptno=10 的雇员(如 KING、CLARK)
(20, 'RESEARCH',   'DALLAS'),    -- 研发部,对应 emp 中 deptno=20 的雇员(如 SMITH、JONES、SCOTT)
(30, 'SALES',      'CHICAGO');   -- 销售部,对应 emp 中 deptno=30 的雇员(如 ALLEN、WARD、MARTIN 等)

CREATE TABLE salgrade (
    grade INT PRIMARY KEY,        -- 薪资等级(1-5级,等级越高薪资范围越大)
    losal DECIMAL(10,2) NOT NULL, -- 该等级的最低工资
    hisal DECIMAL(10,2) NOT NULL  -- 该等级的最高工资
);

-- 插入示例数据(覆盖emp表中所有sal值的范围)
INSERT INTO salgrade (grade, losal, hisal)
VALUES 
(1, 500.00, 1000.00),    -- 对应emp中sal=800.00(SMITH)
(2, 1001.00, 1500.00),   -- 对应emp中sal=1250.00(WARD、MARTIN)、1500.00(TURNER)
(3, 1501.00, 2000.00),   -- 对应emp中sal=1600.00(ALLEN)
(4, 2001.00, 3000.00),   -- 对应emp中sal=2450.00(CLARK)、2850.00(BLAKE)、2975.00(JONES)、3000.00(SCOTT)
(5, 3001.00, 6000.00);   -- 对应emp中sal=5000.00(KING)

创建视图,根据需求写select语句:

复制代码
CREATE VIEW emp_dept_salgrade_view AS SELECT 
    emp.empno AS '雇员编号',      -- 从 emp 表取雇员编号
    emp.ename AS '雇员名',        -- 从 emp 表取雇员名
    dept.dname AS '部门名称',     -- 从 dept 表取部门名称
    salgrade.grade AS '薪水级别'  -- 从 salgrade 表取薪资等级
FROM 
    emp,dept,salgrade
WHERE 
    emp.deptno = dept.deptno AND emp.sal BETWEEN salgrade.losal AND salgrade.hisal;

查看一下该视图:

复制代码
SELECT * FROM emp_dept_salgrade_view;

6.视图的使用总结

  1. 安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
  2. 性能 。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接(JOIN )。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
  3. 灵活 。如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。
相关推荐
山茶花开时。3 小时前
[Oracle] TO_NUMBER()函数
数据库·oracle
耳东哇4 小时前
阿里云百炼平台创建智能体-上传文档
数据库·redis·阿里云
ykuaile_h86 小时前
MySQL梳理三:查询与优化
数据库·mysql
掘根7 小时前
【Redis】string字符串
数据结构·数据库·redis
春天的菠菜8 小时前
【mysql】设置mysql数据库只读权限用户
数据库·oracle
找不到、了8 小时前
Mysql使用Canal服务同步数据->ElasticSearch
数据库·mysql·elasticsearch
宋大水9 小时前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
赵_|大人10 小时前
Qt 自动无法加载数据库为空
开发语言·数据库·qt
2501_9200470311 小时前
Mysql-事务
数据库·mysql·oracle