【MySQL】视图:简化查询

文章目录

  • create view … as创建视图
  • 更改或删除视图
    • drop view 删除视图
    • replace关键字:更改视图
  • 可更新视图
  • with check option子句:防止行被删除
  • 视图的其他优点
    • 简化查询
    • 减小数据库设计改动的影响
    • 使用视图限制基础表访问

create view … as创建视图

  • 把常用的一段查询保存为视图,以供在很多地方使用。可以大大简化常用到的查询
  • 把下面这段查询保存为一个视图(作用像一张虚拟表),在后续用到这段查询时,可以直接使用这个视图
    • 可以把这个视图和任何有客户id列的表做连接
    • 可以使用where、order by等
  • 注意:视图不存储数据,数据存储在表中
create view sales_by_client as
select c.client_id,c.name,sum(invoice_total) as total_sales
from clients c
join invoices i using (client_id)
group by client_id, name;select *
from sales_by_client
order by total_sales desc

运行结果:返回了这个视图
在这里插入图片描述

  • 练习:查询每个客户的结余(发票总额 - 支付总额),将此查询创建为视图
create view see_balance as
select client_id,name,sum(invoice_total) - sum(payment_total) as balance
from invoices
join clients using (client_id)
group by client_id, name

在这里插入图片描述

更改或删除视图

  • 最好把视图储存在SQL文件中,并放入源码控制。

drop view 删除视图

drop view sales_by_client

replace关键字:更改视图

  • creat or replace view,没有视图的时候就创建,有视图了就更改
create or replace view sales_by_client as
select c.client_id,c.name,sum(invoice_total) as total_sales
from clients cjoin invoices i using (client_id)
group by client_id, name;
  • 如果找不到视图的源码,可以在modify view中对视图做修改
    在这里插入图片描述

可更新视图

  • 如果视图中没有以下内容,这个视图就是可更新视图。
    • distinct
    • 聚合函数,如min、max、sum等
    • group by 或 having
    • union
  • 可更新视图:可以在上面更新数据,所以可以在以下语句中使用可更新视图
    • insert
    • update
    • delete
  • 创建一个有结余列且结余>0的视图
    • 因为这个视图没有上边提到的那些内容,所以这个视图是可更新视图。
    • 可以删除这个视图中id为1的发票。
    • 可以更新id为2的发票的时间,让天数加2
create or replace view invoices_with_balance as
select invoice_id,number,client_id,invoice_total,payment_total,invoice_total - payment_total as balance,invoice_date,due_date,payment_date
from invoices
where (invoice_total - invoices.payment_total) > 0
delete from invoices_with_balance
where invoice_id = 1
update invoices_with_balance
set due_date = date_add(due_date, interval 2 day)
where invoice_id = 2

with check option子句:防止行被删除

  • 更新视图,让id为2号的支付和总额相等,也就是结余=0。执行后发现视图中id为2号的数据被删除了。
update invoices_with_balance
set payment_total = invoice_total
where invoice_id = 2
  • 如果不希望update或delete语句将某行从视图中删除,就在创建视图的代码最后面写 with check option
    • 此时让id为3号的支付和总额相等,也就是结余=0时,执行代码会报错,显示”检查视图失败“
create or replace view invoices_with_balance as
select invoice_id,number,client_id,invoice_total,payment_total,invoice_total - payment_total as balance,invoice_date,due_date,payment_date
from invoices
where (invoice_total - invoices.payment_total) > 0
with check optionupdate invoices_with_balance
set payment_total = invoice_total
where invoice_id = 3;

运行结果:报错,无法删除id为3的行。
在这里插入图片描述

视图的其他优点

简化查询

减小数据库设计改动的影响

  • 视图为数据库提供了一种抽象化,这种抽象化减少了变动带来的影响。

  • 如果所有的查询都是基于视图,不会受基础表改动的影响

使用视图限制基础表访问

  • 可加强数据安全性

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

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

相关文章

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

回答关于模糊C均值聚类(FCM)的一些问题!FCM停止迭代的条件是什么,FCM中的隶属度起什么作用?

文章目录 一、模糊C均值聚类(FCM)中的隶属度是起什么作用二、FCM停止迭代的条件是什么 一、模糊C均值聚类(FCM)中的隶属度是起什么作用 表示样本点对各个聚类中心的隶属程度。隶属度取值范围是0-1之间,值越大表示样本点越可能属于…

Windows系列:windows server 2003 - 组策略部署软件

通过组策略为域内用户部署(deploy)软件,可分为指派(assign)和发布(publish)。 软件指派给用户:用户在域内登录后,被“通告 advertised”给用户,此时仅安装了部…

nvm 下载node时候下载不到npm包的解决方法

个人博客链接 公众号-nvm 下载node时候下载不到npm包的解决方法 求关注 可以跳过的背景 最近项目比较有空,所以就可以有时间写一些demo,主要测试下react的一些语法,毕竟自己上次写react已经是22年的7月份了,期间对于react-router等的hook…

E云管家微信群聊机器人开发

请求URL: http://域名地址/modifyGroupRemark 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是String登录实例标识chatRo…

11月30日作业

作业&#xff1a; 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using n…

13-Vue基础之自定义指令与插槽的使用

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具

文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…

Android系统源码中添加可编译运行执行程序,java

文章目录 Android系统源码中添加可编译运行执行程序&#xff0c;java1.Android设备中执行编译运行java代码2.编译执行jar包 Android系统源码中添加可编译运行执行程序&#xff0c;java 1.Android设备中执行编译运行java代码 新建一个文件夹&#xff0c;以及Java类的包路径 测…

万界星空科技仓库管理wms系统

企业在管理库存时&#xff0c;尤其是生产制造企业&#xff0c;使用传统方式比如纸笔、Excel 管理库存&#xff0c;由于工具和信息化存在局限&#xff0c;导致在管理库存时出现如下问题&#xff1a; 1、通过纸笔记录出入库申请&#xff0c;人为手动计算易出错&#xff0c;数据易…

ACM程序设计课内实验(2) 排序问题

基础知识‘ sort函数 C中的sort函数是库中的一个函数&#xff0c;用于对容器中的元素进行排序。它的原型如下&#xff1a; template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);参数…

windows远程桌面登录,提示:“出现身份验证错误,要求的函数不受支持”

问题&#xff1a; windows登录远程桌面&#xff0c;提示&#xff1a;“出现身份验证错误&#xff0c;要求的函数不受支持”&#xff0c;如下图&#xff1a; 问题原因&#xff1a; windows系统更新&#xff0c;微软系统补丁的更新将 CredSSP 身份验证协议的默认设置进行了调…