abap视图字段限制_【第八章】视图

bd5b698839f1e74c9b667fc78d8d9a33.png

上一级目录:Mosh_完全掌握SQL课程_学习笔记

其它相关:数据概要


【第八章】视图

Views (时长18分钟)

1. 创建视图

Creating Views (5:36)

小结

就是创建虚拟表,自动化一些重复性的查询模块,简化各种复杂操作(包括复杂的子查询和连接等)

注意视图虽然可以像一张表一样进行各种操作,但并没有真正储存数据,数据仍然储存在原始表中,视图只是储存起来的模块化的查询结果,是为了方便和简化后续进一步操作而储存起来的虚拟表。

案例

创建 sales_by_client 视图

USE sql_invoicing;CREATE VIEW sales_by_client ASSELECT client_id,name,SUM(invoice_total) AS total_salesFROM clients cJOIN invoices i USING(client_id)GROUP BY client_id, name;-- 虽然实际上这里加不加上name都一样

若要删掉该视图用 DROP VIEW sales_by_client 或右键

创建视图后可就当作 sql_invoicing 库下一张表一样进行各种操作

USE sql_invoicing;SELECT s.name,s.total_sales,phone
FROM sales_by_client s
JOIN clients c USING(client_id)
WHERE s.total_sales > 500

练习

创建一个客户差额表视图,可以看到客户的id,名字以及差额(发票总额-支付总额)

USE sql_invoicing;CREATE VIEW clients_balance ASSELECT client_id,c.name,SUM(invoice_total - payment_total) AS balanceFROM clients cJOIN invoices USING(client_id)GROUP BY client_id

2. 更新或删除视图

Altering or Dropping Views (2:52)

小结

修改视图可以先DROP在CREATE,但最好是用CREATE OR REPLACE

视图的查询语句可以在编辑模式下查看和修改,但最好是保存为sql文件并放在源码控制妥善管理

案例

想在上一节的顾客差额视图的查询语句最后加上按差额降序排列

法1. 先删除再重建

USE sql_invoicing;DROP VIEW clients_balance;
-- 若不存在这个视图,用DROP会报错CREATE VIEW clients_balance AS ……ORDER BY balance DESC

法2. 用REPLACE关键字,即用 CREATE OR REPLACE VIEW clients_balance AS, 这个比较通用,不管现在这个视图现在是否已经存在都不会出问题,推荐使用种这种方式。

USE sql_invoicing;CREATE OR REPLACE VIEW clients_balance AS……ORDER BY balance DESC

方法

如何保存视图的原始查询语句?

法1.

(推荐方法) 将原始查询语句保存为 views 文件夹下的和与视图同名的 clients_balance.sql 文件,然后将这个文件夹放在源码控制下(put these files under source control), 通常放在 git repository(仓库)里与其它人共享,团队其他人因此能在自己的电脑上重建这个数据库

法2.

若丢失了原始查询语句,要修改的话可点击视图的扳手按钮打开编辑模式,可看到如下被MySQL处理了的查询语句

MySQL在前面加了些莫名其妙的东西并且在所有库名表名字段名外套上反引号防止名称冲突(当对象名和MySQL里的关键字相同时确保被当作对象名而不是关键字),但这都不影响

直接做我们需要的修改,如加上ORDER BY balance DESC 然后点apply就行了

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER
VIEW `clients_balance` ASSELECT `c`.`client_id` AS `client_id`,`c`.`name` AS `name`,SUM((`invoices`.`invoice_total` - `invoices`.`payment_total`)) AS `balance`FROM(`clients` `c`JOIN `invoices` ON ((`c`.`client_id` = `invoices`.`client_id`)))GROUP BY `c`.`client_id`ORDER BY balance DESC

法2是没有办法的办法,当然最好还是将 views 保存为 sql 文件并放入源码控制

3. 可更新视图

Updatable Views (5:12)

小结

视图除了可用在查询语句SELECT中,也可以用在增删改(INSERT DELETE UPDATE)语句中,但后者有一定的前提条件。

如果一个视图的原始查询语句中没有如下元素:
1. DISTINCT 去重
2. 聚合函数/GROUP BY/HAVING (聚合函数和HAVING筛选通常是伴随GROUP BY分组出现的)
3. UNION 纵向连接

则该视图是可更新视图(Updatable Views),可以增删改,否则只能查。

另外,增(INSERT)还要满足附加条件:视图必须包含底层原表的所有必须字段

总之,一般通过原表修改数据,但当出于安全考虑或其他原因没有某表的直接权限时,可以通过视图来修改底层数据(?),前提是视图是可更新的。

之后会将关于安全和权限的内容

案例

创建视图(新虚拟表)invoices_with_balance(带差额的发票记录表)

USE sql_invoicing;CREATE OR REPLACE VIEW invoices_with_balance AS
SELECT /* 这里有个小技巧,要插入表中的多列列名时,可从左侧栏中连选并拖入相关列 */invoice_id, number, client_id, invoice_total, payment_total, invoice_date,invoice_total - payment_total AS balance,-- 新增列due_date, payment_date
FROM invoices
WHERE (invoice_total - payment_total) > 0
/* 这里不能用列别名balance,会报错说不存在,
必须用原列名的表达式
之前讲WHERE和HAVING作为事前筛选和事后筛选的区别时提到过 */

该视图满足条件,是可更新视图,故可以增删改:

  1. 删:

删掉id为1的发票记录

DELETE FROM invoices_with_balance
WHERE invoice_id = 1
  1. 改:

将2号发票记录的期限延后两天

UPDATE invoices_with_balance
SET due_date = DATE_ADD(due_date, INTERVAL 2 DAY)
WHERE invoice_id = 2
  1. 增:

在视图中用INSERT新增记录的话还有另一个前提,即视图必须包含其底层所有原始表的所有必须字段
例如,若这个 invoices_with_balance 视图里没有 invoice_date 字段(invoices 中的必须字段),那就无法通过该视图向 invoices 表新增记录,因为 invoices 表不会接受 invoice_date 字段为空的记录

4. WITH CHECK OPTION 子句

THE WITH CHECK OPTION Clause (2:18)

小结

在视图的原始查询语句最后加上 WITH CHECK OPTION 可以防止执行那些会让视图中某些行(记录)消失的修改语句。

案例

接前面的 invoices_with_balance 视图的例子,该视图与原始的 orders 表相比增加了balance(invouce_total - payment_total) 列,且只显示 balance 大于0的行(记录),若将某记录(如2号订单)的 payment_total 改为和 invouce_total 相等,则 balance 为0,该记录会从视图中消失:

UPDATE invoices_with_balance
SET payment_total = invoice_total
WHERE invoice_id = 2

更新后会发现invoices_with_balance视图里2号订单消失。

但在视图原始查询语句最后加入 WITH CHECK OPTION 后,对3号订单执行类似上面的语句后会报错:

UPDATE invoices_with_balance
SET payment_total = invoice_total
WHERE invoice_id = 3-- Error Code: 1369. CHECK OPTION failed 'sql_invoicing.invoices_with_balance'

5. 视图的其他优点

Other Benefits of Views (2:37)

小结

三大优点:

简化查询、增加抽象层和减少变化的影响、数据安全性

具体来讲:

  1. (首要优点)简化查询 simplify queries
  2. 增加抽象层,减少变化的影响 Reduce the impact of changes:视图给表增加了一个抽象层(模块化),这样如果数据库设计改变了(如一个字段从一个表转移到了另一个表),只需修改视图的查询语句使其能保持原有查询结果即可,不需要修改使用这个视图的那几十个查询。相反,如果没有视图这一层的话,所有查询将直接使用指向原表的原始查询语句,这样一旦更改原表设计,就要相应地更改所有的这些查询。
  3. 限制对原数据的访问权限 Restrict access to the data:在视图中可以对原表的行和列进行筛选,这样如果你禁止了对原始表的访问权限,用户只能通过视图来修改数据,他们就无法修改视图中未返回的那些字段和记录。但注意这通常并不简单,需要良好的规划,否则最后可能搞得一团乱。

了解这些优点,但不要盲目将他们运用在所有的情形中。

导航

下一章将讲解储存过程和函数


6d3b16764b072a9fac8d524656e7e279.png

上一级目录:Mosh_完全掌握SQL课程_学习笔记

其它相关:数据概要

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

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

相关文章

生活质量衡量系统_数据质量与数据质量八个维度指标

数据质量与数据质量八个维度指标数据的质量直接影响着数据的价值,并且直接影响着数据分析的结果以及我们以此做出的决策的质量。质量不高的数据不仅仅是数据本身的问题,还会影响着企业经营管理决策;错误的数据还不如没有数据,因为…

linux的内置的账户_6 款面向 Linux 用户的开源绘图应用程序

既然你是一名 Linux 用户,为什么不关注一下开源绘图应用程序呢?-- Ankush Das(作者)小时候,当我开始使用计算机(在 Windows XP 中)时,我最喜欢的应用程序是微软的“画图”。我能在它上面涂鸦数个小时。出乎意料,孩子们…

ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS

前言现在接到小程序需要改版的需求,由于使用Ionic的经验,希望以后能够统一开发语言降低开发成本,所以想使用TypeScript进行开发。开发前准备工作先是看官网,在微信小程序的官方开发文档中找到TypeScript相关的支持介绍。微信官网描…

cad统计多条线段总长度插件_超级实用CAD技巧应用汇总!技巧大全、插件合集、快捷键合集等...

超级实用CAD技巧应用汇总!技巧大全、插件合集、快捷键合集等各位朋友,CAD福利来啦!超级实用CAD技巧应用汇总,千万不能错过!有技巧大全、插件合集、快捷键合集、字体大全、常用图库大全、常见问题及解决办法、版本转换&…

局部放大_Origin教程|巧用ZOOM功能做数据对比和快速绘制局部放大图

微信公众号:有宝物的柜子编辑:落水无波2020-06-28 原创有时候在分析一些数据时,既需要观察整体又需要局部观测,那么怎么才能做到同时查看呢,就类似上面这样。这样就很容易的去发现有没有峰位偏移,同时查看与…

操作多台_一支热电偶能否连接多台显示仪表

一支热电偶能否连接多台显示仪表,这个问题常有人提出,因为随着DCS系统的应用及对管理工作的要求,需要对一个信号在多处显示也是常有的事。一支热电偶能否连接多台显示仪表或DCS系统板卡,连接后能否保证测量精度,这是人…

个性签名设计软件_佩服!我用Python设计了一个签名软件

临近年末,大家都忙着签发礼品,写的一手好的签名,会让大家更有成就感,今天,小安就带领大家来设计一个基于tkinter爬虫的签名设计软件,方便大家设计签名。要设计这款软件,就需要了解tkinter与爬虫…

华为硬件工程师社招机考题库_中级会计机考你了解吗?机考操作常见八大问题速看...

中级会计考试采用无纸化机考的形式,考生们在备考时要多熟悉机考操作,为了帮助考生提前了解无纸化机考,东奥小编整理了一些机考的常见问题,希望能够帮助到大家!一、参加无纸化考试的考生允许带计算器入场吗?…

网站攻击软件_佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机

佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机Garmin 遭勒索攻击的风波未平,近日,佳能又遭受了勒索软件攻击,攻击除了让佳能的一些网站宕机外,据说还导致佳能服务器中高达 10TB 的数据被盗。 影响…

js datagrid新增一行_Django接口新增页面编写_2(十五)

做一个好看的页面真的是一件困难的事情,所以还是遵循复制后修改的原则,首先是借鉴httpbin页面的方式进行块状展开。块状从模版中找到类似的html代码:块状我们可以看到一下它的动态效果,可以自主的展开和合拢。蛮符合我们的要求的动…

uboot下nand flash读写方法_鸿蒙HarmonyOS烧录方法总结

1.烧录工具理解HarmonyOS驱动框架,用户态APP和内核态驱动之间的通信机制。HarmonyOS烧录使用的海思自研的烧录工具Hitool,使用起来相对来说比较简单。整体界面如图所示:2. 烧录内容烧录内容主要分为两部分,一部分是引导文件fastbo…

合成孔径雷达_合成孔径雷达(SAR)基础:汇总

详细分析:合成孔径雷达成像技术对雷达成像的几点补充消费级小型无人机的合成孔径雷达成像我国微型合成孔径雷达发展现状对比三种天基系统,看SAR成像模式星载SAR详解:“高分三号”微波遥感卫星机载Pol-InSAR系统,新体制SAR成像结果…

将命令结果赋给变量_不得不了解的quot;变量quot;(2)—— 变量的赋值

祝大家圣诞快乐,今天晚上下班后去滑雪,第一次尝试单板,看着别玩玩得挺酷的,自己耍起来摔得差点骨头没散架!愈挫愈勇啦,就像我们学习脚本一样,要坚持学下去练下去才能熟练,才能日后装…

vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效

安装SonarQube插件在VScode的扩展里面,安装SonarQube support for Visual Studio Code extension, 在安装了 SonarQube 之后,使用打开 VSCode 命令搜索功能,输入 Sonar,搜索结果如下:sonar lint 全局配置文…

数据立方体_立方体纹理

立方体纹理就是包含6个2D纹理的纹理.6个纹理有序排列在立方体的6个面.其可以通过方向向量采样立方体纹理上的纹素.创建立方体贴图跟创建2D贴图一样,但是绑定到GL_TEXTURE_CUBE_MAP上.glGenTextures(1, &CubeMapID); glBindTexture(GL_TEXTURE_CUBE_MAP, CubeMapID);立方体纹…

华为官方强制线刷工具_一加8/8Pro 线刷救砖

9008线刷是高通平台设备底层的刷机模式,是降级救砖必备良品,有了它,放心刷不想自己动手或遇到困难,可在后台回复: 远程刷机如果你是新手,要9008降级或者救砖,请先准备好充足的时间和良好的心态,…

centos vsftp mysql_CentOS6.4 实现基于mysql的vsftpd

大纲一、安装所需要的软件包二、创建虚拟用户账号三、配置vsftpd四、启动vsftpd服务并查看五、关闭防火墙与SElinux六、配置虚拟用户有不同的访问权限一、安装所需要的软件包1. 安装开发环境[rootftp ~]# yum -y groupinstall "Development Tools" "Development…

java实时监听mysql_java实时监控mysql数据库变化

对于二次开发来说,很大一部分就找找文件和找数据库的变化情况对于数据库变化。还没有发现比较好用的监控数据库变化监控软件。今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化1、打开数据库配置文件my.ini (一般在数据库安装目录)(D:\MYS…

python中cmd如何切换盘_redis 中如何切换db

redis 中如何切换dbredis数据库个数是可以配置的,默认为16个如上图我们如何切换呢?我在redis客户端查询如下 通过用select N 你想要的数据库 就能切到对应的数据库去了每个数据库的key值不会冲突,是分开存储的java代码中如何切换redis db&…

mysql max字符串报错_mysql [Warning] max_join_size报错问题解决办法

文章介绍了关于mysql [Warning] max_join_size报错问题解决办法,有需要的同学看看。100716 06:32:45 d started100716 6:32:45 [Warning] option max_join_size: unsigned value 18446744073709551615 adjusted to 4294967295100716 6:32:45 [Warning] option max_join_size: u…