视图之一--创建简单的视图
一、视图
视图是数据库中的一个虚拟表,其内容由查询语句查询出来的。就像真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。它的行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
视图优点如下:
- 视点集中
- 简化操作
- 定制数据
- 合并分割数据
- 安全性
-- ---------------------------- -- 学生表 -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (`stu_no` varchar(255) NOT NULL,`name` varchar(255) NOT NULL,`age` int(11) DEFAULT NULL,`password` varchar(255) DEFAULT NULL,PRIMARY KEY (`stu_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ---------------------------- -- 学生记录 -- ---------------------------- INSERT INTO `student` VALUES ('10001', '张三', '20', 'zhang123'); INSERT INTO `student` VALUES ('10002', '李四', '21', 'lisi123'); INSERT INTO `student` VALUES ('10003', '王五', '22', 'wang123'); -- ---------------------------- -- 学生成绩表 -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` (`id` int(11) NOT NULL AUTO_INCREMENT,`stu_no` varchar(255) NOT NULL,`name` varchar(255) NOT NULL,`score` int(11) NOT NULL,PRIMARY KEY (`id`),KEY `id_fk` (`stu_no`),CONSTRAINT `id_fk` FOREIGN KEY (`stu_no`) REFERENCES `student` (`stu_no`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;-- ---------------------------- -- 学生成绩记录 -- ---------------------------- INSERT INTO `course` VALUES ('1', '10001', 'c++', '70'); INSERT INTO `course` VALUES ('2', '10001', 'java', '80'); INSERT INTO `course` VALUES ('3', '10001', 'lisp', '90'); INSERT INTO `course` VALUES ('4', '10002', 'c++', '75'); INSERT INTO `course` VALUES ('5', '10002', 'java', '80'); INSERT INTO `course` VALUES ('6', '10003', 'lisp', '91'); INSERT INTO `course` VALUES ('7', '10003', 'c++', '73');
学生表与学生成绩表通过stu_no学生学号这个字段进行关联。
1、视图创建
语法如下:
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名 [(属性清单)]
AS SELECT 语句
[WITH [CASCADED|LOCAL] CHECK OPTION];
ALGORITHM子句:
ALGORITHM子句是可选的,是对标准SQL的MySQL扩展。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。
对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它应该倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。
WITH CHECK OPTION可用于对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为“真”。意思是说更新后,所更新的结果是否还会在视图中存在。如果更新后的值不在视图范围内,就不允许更新。如果创建视图的时候.没有加上with check option,更新视图中的某项数据的话,mysql并不会进行有效性检查。删掉了就删掉了。在视图中将看不到了。
例:对于一下视图使用WITH CHECK OPTION
1 CREATE TABLE t1 (a INT); 2 CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2 3 WITH CHECK OPTION; 4 CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0 5 WITH LOCAL CHECK OPTION; 6 CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0 7 WITH CASCADED CHECK OPTION;
v1视图的内容是t1表中的,v2视图的内容是视图v1中的,v3视图的内容是视图v1中的,但是v3视图定义的时候使用了WITH CHECK OPTION。现在我们执行一些语句
1 INSERT INTO v3 VALUES (2); -- [Err] 1369 - CHECK OPTION failed 'test.v3' 2 INSERT INTO v2 VALUES (2);
执行第一行的时候会报错。v3视图定义的时候使用了WITH CHECK OPTION,索引v3具有CASCADED检查选项。因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。这里对v1进行了检查,v1视图中不符合,所以插入失败。
执行第二行会成功。v2具有LOCAL检查选项,因此,仅会针对v2检查对插入项进行测试。因为v2定义的时候没有时候WITH CHECK OPTION,索引v2不会对v1继续检查,索引插入成功。
DROP VIEW IF EXISTS highest_course; CREATE VIEW highest_course AS SELECT s.NAME AS stuname, c.NAME AS course, max(c.score) AS score FROMcourse AS c, student AS s WHEREs.stu_no = c.stu_no GROUP BYc.stu_no;
执行DESCRIBE highest_course;可以查看这个视图的结构,如字段,字段大小是否为空等。执行结果如下:
执行SELECT * FROM highest_course;即可查询视图数据内容,结果如下:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]AS
select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
在原来的视图增加一个studentno字段
1 -- 修改mysql视图 2 ALTER VIEW highest_course AS 3 SELECT s.stu_no AS studentno, s.NAME AS stuname, c.NAME AS course, max(c.score) AS score 4 FROM 5 course AS c, student AS s 6 WHERE 7 s.stu_no = c.stu_no 8 GROUP BY 9 c.stu_no; 10 DESCRIBE highest_course;
修改mysql
执行第10行之后视图结构如下:
已经增加了一个字段studentno。
3、删除视图
DROP VIEW highest_course;
4、关于查看视图的相关语句
SELECT * FROM highest_course; -- 查询视图的所有内容 DESCRIBE highest_course; -- 查询视图的每个字段的信息 SHOW CREATE VIEW highest_course; -- 查询视图的创建语句
三、视图主要点
视图定义服从下述限制:
- SELECT语句不能包含FROM子句中的子查询。
- SELECT语句不能引用系统或用户变量。
- SELECT语句不能引用预处理语句参数。
- 在存储过程内,定义不能引用子程序参数或局部变量。
- 在定义中引用的表或视图必须存在。但是,创建了视图后,能够删除定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
- 在定义中不能引用临时表,不能创建临时视图。
- 在视图定义中命名的表必须已存在。
- 不能将触发程序与视图关联在一起。
- 在视图定义中使用了ORDER BY,但是调用的时候使用了新的ORDER BY,那么视图中定义的ORDER BY 将失效,会按照调用时候的ORDER BY排序。
对于更新视图的内容,我们可以通过更新表数据的方式从而间接地去更新视图内容。
视图的内容是否更新与WITH CHECK OPTION子句有关,有些视图是可以更新,有些视图是不能。也与视图的可更新性可能会受到系统变量updatable_views_with_limit的值的影响。
转载于:https://www.cnblogs.com/always-online/p/3947449.html
视图之一--创建简单的视图相关推荐
- IOS 创建简单表视图
创建简单表视图 此实例主要实现UITableViewDataSource协议中必需要实现的两个方法tableView:numberOfRowsInSection: 和tableView:cellFor ...
- 视图——概述 || 创建或者修改视图 || 查看视图 || 删除视图
视图概述 视图(View)是一种虚拟存在的表. 视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的. 通俗的讲,视图就是一条SELECT语句执行后返回的结 ...
- mysql视图之创建可更新视图
我们知道,在mysql中,视图不仅是可查询的,而且是可更新的.这意味着我们可以使用insert或update语句通过可更新视图插入或更新基表的行. 另外,我们还可以使用delete语句通过视图删除底层 ...
- 关于SQL视图的创建和使用方法
SQL视图的创建和使用 视图这个东西在其他的软件中,我们也经常看得到,例如word中就有视图,我们不难发现,视图似乎是一种显示方式,就像WORD一样,有几种显示版面,这就是视图,那么SQL中的视图又该 ...
- 实验4 视图的创建与使用
实验名称 实验4 视图的创建与使用 日期 2020年 06 月 11 日 一.实验目的: (1)理解视图的概念. (2)掌握创建视图.测试.加密视图的方法. (3)掌握更改 ...
- 实验五、视图的创建与使用
一.实验目的 (1)理解视图的概念. (2)掌握创建视图.测试.加密视图的方法. (3)掌握更改视图的方法. (4)掌握用视图管理数据的方法. 二.实验内容 创建视图 (1)创建一个名为stuview ...
- Oracle 视图(1)建立视图
一. 视图是基于表的表或者视图的逻辑表,与储存数据的表一样都是Oracle的方案对象. 视图通常用于下面: 1.通过提供用户所需要的的基表中的数据,可以简化用户对数据的理解,隐藏表结构的复杂性,而且可 ...
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开 ...
- oracle 物化视图 重建,Oracle物化视图:创建最简单物化视图-开发技术
SQL> create materialized view mv_testcf 2 as 3 select * from xiaotg.testcf; Materialized view cre ...
最新文章
- python小程序代码50 到100行-Python代码不到四十行简单暴力,微信跳一跳小程序轻松过万...
- 信息系统项目管理师优秀论文:项目风险管理--jiangyiwu
- QTP的那些事---通过html标签的属性获取对象(类似onclick的属性)
- 财务管理的革新带动财务软件的变革
- hibernate中的所有属性
- Angular自学笔记(?)属性型指令
- 验证必须是数字php,Element 中表单非必填数据项 必须为数字的验证问题
- python随机数调用
- 利用T-SQL处理SQL Server数据库表中的重复行
- 2018双十一苏宁20+篇技术干货全整理
- RenderTransformOrigin 的作用
- 一张图了解软件测试流程
- Captain Flint and a Long Voyage
- 公园遛狗 / 小白逛公园【线段树】
- 机器人图形变变变_中班公开课数学教案《图形变变变》
- python网盘搜索引擎_打造一个蓝奏云网盘搜索引擎
- 基于ROS下的安卓手机图像和IMU跑ORB-SLAM3
- MDIO/MDC接口
- 世界杯优化算法及其Python实现
- 格雷码解析以及计算(仅供自己记录查阅)
热门文章
- python爬虫:爬取某网站视频
- 虚拟机服务器被攻击,Linux服务器被攻击用来挖矿了
- python将字符串s和换行符写入文件fp_Python 文件操作
- 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)
- php gzip 关闭,php能否在当前脚本页关闭nginx的gzip输出
- 顺序表中有效元素的长度_图解线性表,启动数据结构的大门,深刻理解链式存储和顺序存储!...
- mysql canvert mongo_如何在MongoDB中的$match中使用聚合运算符(例如$year或$dayOfMonth)?...
- 某程序员9点离岗被主管罚款200,写bug扣光主管年终奖?
- 零基础学python看什么书好?
- 实现购物车的Session