项目六 视图

本文介绍了如何在MySQL数据库中查看、创建、修改和删除视图,包括查看视图结构、状态和定义,以及通过视图进行数据的增删改查操作。同时,强调了视图在数据安全性及简化查询方面的作用,并给出了创建单表和多表视图的示例,以及使用WITHCHECKOPTION进行约束检查的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务1 认识和查看视图

一、数据库的三级模式

1.模式

2.外模式

3.内模式

4.三级模式间的映射

二、视图简介

1.基本概念

2.视图的作用

三、查看数据库所有视图名

1.查看db_shop数据库的表和视图名。

SHOWFULLTABLESIN db_shop;

2.查看db_shop数据库的所有视图名。

SHOWFULLTABLESIN db_shop WHERE Table_type='VIEW';

四、查看视图结构信息

说明:DESCRIBE关键字可用其缩写DESC,用于显示视图中的字段名称、数据类型、是否为空等数据字段定义信息。

1.查看db_shop数据库下的v_sell_dept视图信息。

USE db_shop;
DESC v_sell_dept;

五、查看视图状态信息

说明:show table status[LIKE'视图名'] 不带[LIKE'视图名']时,显示的是当前数据库的表和视图的状态信息。

1.查看db_shop数据库的视图状态。

USE db_shop;
SHOWTABLESTATUSLIKE'v_sell_dept'\G

六、查看指定视图定义

语法:show create view 视图名

说明:查看视图的详细定义

1.查看db_shop数据库中v_dp_staffer视图的详细定义

USE db_shop;
SHOWCREATEVIEW v_sell_dept;

七、查看所有视图详细信息

说明:Information_schema是MYSQL数据库的元数据信息系统数据库,用于存储有关数据库、表、视图等数据对象的定义信息。VIEWS表存储了所有视图详细信息。

1.查看db_shop数据库所有视图详细信息

SELECT*FROM information_schema. VIEWSWHERE TABLE_SCHEMA='db_shop'\G

八、查看用户创建视图的相关权限

作用:查看各用户的各类权限

1.查看各用户有关视图创建的相关权限

SELECT*FROM mysql.user;

九、任务实施

(1)选择db_shop数据库

USE db_shop;

(2)查看db_shop数据库的所有视图对象

SHOWFULLTABLESIN db_shop WHERE Table_type='VIEW';

(3)查看v_sell_dept视图的结构信息

DESC v_sell_dept;

(4)查看v_shell_dept视图的状态信息

SHOWTABLESTATUSLIKE'v_sell_dept'\G

(5)查看v_sell_dept视图的定义语句

SHOWCREATEVIEW v_sell_dept;

(6)查看db_shop数据库的所有视图详细信息

SELECT*FROM information_schema. VIEWSWHERE TABLE_SCHEMA='db_shop'\G

任务2 创建视图

一、创建语句

执行HELP CREATE VIEW 可以查看帮助文档

创建视图的用户必须具有执行CREATE VIEW 的权限,若加了【OR REPLACE】则用户还必须具有执行DROP VIEW 的权限

二、创建单表数据视图

单表数据视图指视图显示的数据只来自一个表。定义视图的SQL语句可以检索单表,也可以进行跨表连接的检索。只检索单表的视图可以像表一样,用来增加、修改、删除、查询记录、

1.建立部门的视图v_dept,并使用它来查询部门记录。

第一步:创建视图
USE db_shop;
CREATEVIEW v_dept1(Dname,phone,memo)ASSELECT dept_name,dept_phone,dept_memo FROM department;

说明:创建的单表视图若计划用来更新基表,则基表中不允许空且没有默认值的字段必须出现在视图对应列

第二步:查询视图

视图建立好以后,可以像查询表一样查询视图,通过查询视图来查询基表的数据。

SELECT*FROM v_dept1;

2.建立女员工的视图vf_staffer,并使用它来查询女员工记录

第一步:创建视图
CREATE VIEW vf_staffer(username,deptID,Sname,sex) AS SELECT staff_name,dept_id,staff_name,sex FROM staffer WHERE sex='F'; 

第二步:查询视图
SELECT*FROM vf_staffer;

三、创建多表数据视图

多表数据视图即视图显示的数据是来自多个表的字段,视图的SQL定义语句使用了跨表连接查询。来自多个表字段的视图一般不能用来处理数据,只能用来检索数据。

1.建立部门员工视图,显示部门名称和员工对外查阅资料

第一步:创建视图
USE db_shop;
CREATEVIEW v_staffer ASSELECT dept_name,staff_name,sex,phone FROM staffer INNERJOIN department ON staffer.dept_id=department.id;

第二步:查询视图
SSELECT * FROM v_staffer;

四、创建带约束检查的视图

当使用WITH CHECK OPTION 子句创建视图时,MYSQL 会通过视图检查正在更改操作的每个行,例如插入、更新、删除操作,以使其符合视图的定义条件,不符合则不能通过视图更新记录。

1.创建销售部的视图,并查看能否超出视图条件添加记录

分析:当定义表单视图的SELECT 语句带有WHERE条件时,如果没有使用WITH CHECK OPTION进行约束检查,那么是可以通过视图越过视图的定义条件添加记录的。

第一步:创建视图
USE db_shop;
CREATEVIEW v_sell_dept1 ASSELECT*FROM department WHERE dept_name='销售部';

第二步:查看视图
SELECT*FROM v_sell_dept1;

第三步:通过视图添加记录

这是一个单表视图,在符合添加表记录的情况下也可以用来添加记录。先尝试为销售部视图添加一条记录(部门名称:公关部;电话:020-38128912)。

INSERT INTO v_sell_dept(dept_name,dept_phone) VALUES ('公关部','020-38128912');

第四步:查看视图和基础表(部门表)
SELECT * FROM v_sell_dept;
SELECT * FROM department;

说明:公关部记录通过销售部视图添加到视图基表的部门表中,但查看销售部视图是看不到的,相当于越过视图条件添加了记录,要解决这个问题,定义视图时要使用WITH CHECK OPTION子句

2.建立市场部视图,做到不能超越视图条件添加记录

分析:创建视图时,WITH CHECK OPTION 可以检查对视图的更新是否符合视图定义条件,若不符合条件,则添加记录失败。

第一步:创建视图
CREATEVIEW v_mk_dept ASSELECT*FROM department WHERE dept_name='市场部'WITHCHECKOPTION;

第二步:查看视图
SELECT*FROM v_mk_dept;

第三步:添加部门记录

部门名称:公关部2;电话:020-38230126

INSERTINTO v_mk_dept(dept_name,dept_phone)VALUES('公关部2','020-38230126')

说明:可以看到添加失败,就是添加的记录“公关部2”不能满足视图定义的条件,从而阻止了该记录的添加。这是WITH CHECK OPTION的作用

五、在视图上建立视图

可以在已经建立好的视图上建立视图。在一个视图上建立一个新的视图,这两个视图之间就建立了依赖与被依赖的父子关系,也就是继承关系,在应用了WITH CHECK OPTION 组件的情况下,具有级联约束关系。

1.在db_shop数据库中,建立一个男员工的视图,再基于这个视图创建薪水超过8000元的职员视图。

第一步:建立男员工的视图
CREATE VIEW v_male_staffer AS SELECT * FROM staffer WHERE sex='M'; 

第二步:在视图上建立视图
CREATE VIEW v_highSalary_male_staffer AS SELECT * FROM v_male_staffer WHERE salary>8000 WITH CHECK OPTION;

第三步:通过v_highSalary_male_staffer分别添加2个员工记录

分别增加一个薪水为8500元的男员工信息、一个薪水为8500元的女员工信息

INSERT INTO v_highSalary_male_staffer(staff_name,dept_id,sex,birthday,phone,salary,staff_memo) VALUES ('XST','1','M','2001-07-17','123456789','8500','NULL');
INSERT INTO v_highSalary_male_staffer(staff_name,dept_id,sex,birthday,phone,salary,staff_memo) VALUES ('XXX','1','F','2001-07-17','123456789','8500','NULL');

说明:符合当前高新条件同时符合父视图的男员工才能添加成功,只符合高新条件的女员工记录在CHECK检查时失败。

六任务实施

完成db_shopping数据库视图的创建

(1)选择db_shopping数据库

USE db_shopping;

(2)建立一个部门表的员工视图,显示部门名称、员工姓名、性别、职工电话,并查看建立好的视图。

CREATE VIEW v_dept_staffer AS SELECT dept_name,staff_name,sex,phone FROM staffer INNER JOIN department ON staffer.dept_id=department.id;
SELECT * FROM v_dept_staffer;

(3)建立一个详细订单表视图,显示订单编号、订购号、商品名称、供应商名称、单项订购数量、单项总价,并查看建立好的视图。

CREATEVIEW v_goods_sup_item ASSELECT id,order_id,goods_name,supplier_name,quantity,total_price FROM item INNERJOIN goods ON goods.id=item.goods_idINNERJOIN supplier ON supplier.id=goods.supplier_id;
SELECT*FROM v_goods_sup_item;

(4)建立一个订购视图,显示订购编号、订购总额、生成时间、支付状态、处理职员姓名

CREATEVIEW v_staf_cus_orders ASSELECT id,amount_money,create_time,status,staff_name FROMorderINNERJOIN staffer ON staffer.id=order.staff_id;
SELECT*FROM v_staf_cus_orders;

任务三 应用视图

视图可以像表一样用SELECT语句检索基本资料、统计、排序和汇总数据。实际应用中,为简化数据检索或提高数据库的安全性,通常将查询对象建立视图,再从视图中选择查询数据。

1.在已经建立的部门视图v_dept上查询部门记录信息

第一步:建立视图(前面已经建立过的可以不用建立)
USE db_shop;
CREATEORREPLACEVIEW v_dept(Dname,phone,memo)ASSELECT dept_name,dept_phone,dept_memo FROM department;

第二步:查询视图
USE db_shop;
SELECT*FROM v_dept;

2.通过部门视图v_dept查看部门数量

USE db_shop;
SELECT COUNT(*) AS 部门数 FROM v_dept;  

3.通过员工视图v_staffer,按员工电话排序查看员工记录信息

第一步:创建视图
USE db_shop;
CREATE OR REPLACE VIEW v_staffer AS SELECT dept_name,staff_name,sex,phone FROM staffer INNER JOIN department ON staffer.dept_id=department.id;

第二步:应用视图查看基本记录数据
USE db_shop;
SELECT * FROM v_dept ORDER BY phone;

通过视图也可以分类统计数据,总之,通过视图可以像基表一样实现检索,又能简化基表的内部逻辑复杂性和保护需要对用户隐藏的数据。

二、使用视图添加记录数据

视图添加数据记录必须符合以下条件:

1.基表中未被视图引用的字段必须有默认值、自增值或允许空。

2.添加的数据必须符合基本数据的各种约束。

3.如果视图来自多个基表的字段,则一般用于查询而不作为数据处理使用。

1.利用前面建立了部门信息的视图来进行部门信息的添加

分析:若前面没有建立部门视图,则执行如下部门视图定义语句。

CREATE VIEW v_dept(Dname,phone,memo) AS SELECT dept_name,dept_phone,dept_memo FROM department;

建立好以后,直接利用视图添加部门记录

第一步:查看是否已经创建视图
USE db_shop;
SHOW FULL TABLES IN db_shop WHERE Table_type='VIEW';
第二步:查看视图结构字段描述,并添加记录
DESC v_dept;
第三步:利用视图添加1条测试部的部门记录
INSERT INTO v_dept(Dname,phone) VALUES ('测试部','020-33461783');

说明:通过视图操作,使用的字段必须是视图中的字段名,而不是基表字段名

第四步:查看视图是否已经添加了测试部的记录,也可以查看基表是否已经添加
SELECT*FROM v_dept;
SELECT*FROM department;

说明:查看基表数据是否同步

三、使用视图修改记录数据

并不是所有视图都可以用来修改记录的,通过视图修改数据必须符合以下条件:

1.在一个UPDATE语句中修改的字段必须属于同一个基表,如果要对多个基表的数据进行修改,则需要使用多各UPDATE语句完成。

2.对于基表数据的修改,必须满足在字段上设置的约束,例如是否具有唯一性、是否可以未空值。

3.如果在视图定义中用WITH CHECK OPTION子句,则通过这个视图进行修改时提供的数据必须满足视图定义中的条件,否则UPDATE语句将被终止并返回错误信息。

4.视图中汇总函数或计算字段的值不能更改。

5.视图定义中包含有UNION、DISTINCT 、GROUP BY 等关键字时,不能用来修改记录。

6.视图定义语句中包含子查询时或来自不可更新的视图时,不能用来修改记录

1.通过部门员工信息视图v_dept将部门“测试部”的memo字段改为“功能测试”。

USE db_shop;
UPDATE v_dept SET memo='功能测试'WHERE Dname='测试部';

说明:可以查看视图和基础表是否修改了记录

查看是视图和基础表是否修改了记录

SELECT*FROM v_dept;
SELECT*FROM department;

四、使用视图删除记录数据

用视图删除数据记录必须符合下列条件:

通过一个视图删除基表中的数据时,必须保证该视图定义的FROM子句中只引用了一个表。

1.删除部门“测试部”的记录。

USE db_shop;
DELETE FROM v_dept WHERE Dname='测试部';

通过查看视图和部门表,可以检查记录是否已经被删除

五、任务实施

(1)选择db_shopping数据库

USE db_shopping;

(2)应用前面建立的订单详细表视图,进行查询统计

①定义订单详细表视图(前一任务已经建立的可以不用再建立),查看视图
CREATEVIEW v_goods_sup_item ASSELECT id,order_id,goods_name,supplier_name,quantity,total_price FROM item INNERJOIN goods ON goods.id=item.goods_idINNERJOIN supplier ON supplier.id=goods.supplier_id;
SELECT*FROM v_goods_sup_item;
②从视图v_goods_sup_item统计各份订单的总额,并按总额高低排序
SELECT order_id,SUM(total_price)AS 订单总额 FROM v_goods_sup_item GROUPBY order_id 
ORDERBYSUM(total_price);
③通过视图v_goods_sup_item 统计订单总额超过20的订单编号
SELECT order_id,SUM(total_price)AS 订单总额 FROM v_goods_sup_item GROUPBY  order_id HAVINGSUM(total_price)>=20;

(3)建立部门表的视图,并应用这个视图对部门记录进行添加、修改、删除

①建立视图v_dept
CREATEVIEW v_dept(Dname,phone,memo)ASSELECT dept_name,dept_phone,dept_memo FROM department;
②应用视图v_dept添加部门记录,并查询部门表效果
INSERTINTO v_dept (Dname,phone,memo)VALUES('测试部','87993696','负责测试');
SESLECT *FROM department;
③应用视图v_dept修改部门记录,并查询部门表效果
UPDATE v_shop SET memo='功能测试'WHERE Dname='测试部';
SELECT*FROM department;
④应用视图v_dept删除测试部的部门记录,并查询部门表效果
DELETEFROM v_dept WHERE Dname='测试部';
SELECT*FROM department;

任务四 修改和删除视图

视图建立以后,在实际应用中可能因基表的修订、视图的内容变化等原因,需要修改视图或删除无用的视图。本任务通过商品购物管理系统案例,学习使用SQL中的CREATE VIEW、ALTER VIEW和DROP VIEW等语句对视图进行修改或删除处理

一、修改视图

修改视图是指当视图基表的某些字段名称发生变化时,通过修改视图定义,以保持视图定义内容与基表的一致性。对视图的修改就是对基表的修改,因此在修改时,要满足基本表的数据定义,同时还要先查看该视图的依赖关系,是否会影响依赖此视图的其他对象的执行。

可以使用下面两种方法修改视图

1.使用CREATE OR REPLACE VIEW 修改视图

①修改员工视图v_staffer,使其只查看到员工部门、姓名和性别信息。

说明:若视图已经存在,则修改视图,否则创建视图。

USE db_shop;
CREATE OR REPLACE VIEW v_staffer AS SELECT staff_name,dept_name FROM staffer INNER JOIN department ON staffer.dept_id=department.id;
SELECT * FROM v_staffer;

2.使用ALTER VIEW修改视图

①修改员工视图v_staffer,使其能查看员工部门、姓名、性别、电话
USE db_shop;
ALTER VIEW v_staffer AS SELECT dept_name,staff_name,sex,phone FROM staffer INNER JOIN department ON staffer.dept_id=department.id;

说明:修改完成以后,查看以下视图

SELECT * FROM v_staffer;

二、删除视图

删除视图是指删除不再需要的视图。删除视图时要先查看该视图的依赖关系,是否会影响依赖此视图的其他对象的执行。删除视图只是删除视图的定义,不会对基本表造成影响。

DROP VIEW 语句来创造视图

1.删除已经建立的员工视图v_staffer

USE db_shop;
DROPVIEW v_staffer;

三、任务实施

按下列操作完成db_shopping数据库已建视图的修改和删除

(1)选择db_shopping数据库
USE db_shopping;
(2)应用前面建立的部门视图v_dept进行修改。
ALTERVIEW v_dept(Did,Dname,phone,memo)ASSELECT id,dept_name,dept_phone,dept_memo FROM departmrnt;
(3)查看修改后的视图结构和记录
DESC v_dept;
SELECT*FROM v_dept;
(4)应用前面建立的部门视图v_dept进行删除
DROPVIEW v_dept;
(5)查看删除视图v_dept后的数据库所有视图名
SHOWFULLTABLESIN db_shop WHERE Table_type='VIEW';


/***
 *             ,%%%%%%%%,
 *           ,%%/\%%%%/\%%
 *          ,%%%\c "" J/%%%
 * %.       %%%%/ o  o \%%%
 * `%%.     %%%%    _  |%%%
 *  `%%     `%%%%(__Y__)%%'
 *  //       ;%%%%`\-/%%%'
 * ((       /  `%%%%%%%'
 *  \\    .'          |
 *   \\  /       \  | |
 *    \\/         ) | |
 *     \         /_ | |__
 *     (___________))))))) 攻城湿
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸷鸟之不群

你的鼓励将是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值