8. 视图

简介: 8. 视图

创建视图

sql

复制代码

USE sql_invoicing;
CREATE VIEW sales_by_client AS
    SELECT 
        client_id,
        name,
        SUM(invoice_total) AS total_sales
    FROM clients c
    JOIN invoices i USING(client_id)
    GROUP BY client_id, name;

使用create view ... as可以创建一个视图

注意:视图不存储数据,数据存储在原本的表中表中。可以完全当成一张表的执行各种操作,但是和一张存储数据的表不等价

sql

复制代码

CREATE VIEW clients_balance AS 
    SELECT 
        client_id,
        name,
        SUM(invoice_total - payment_total) AS balance
    FROM clients c
    JOIN invoices i USING(client_id)
    GROUP BY client_id, name;
2 Myworks 50.89
5 Topiclounge 767.63
3 Yadel 481.35
1 Vinte 728.34

更改或者删除视图

  1. 先删除再重建

sql

复制代码

USE sql_invoicing;
DROP VIEW IF EXISTS clients_balance;
-- 若不存在这个视图,直接 DROP 会报错,所以要加上 IF EXISTS 先检测有没有这个视图
CREATE VIEW clients_balance AS 
    ……
    ORDER BY balance DESC
  1. 通过工具修改,workbench 或者保存好视图的 sql 文件

可更新视图

sql

复制代码

CREATE OR REPLACE VIEW ... AS

如果一个视图的原始查询语句中没有如下元素:

  1. DISTINCT 去重
  2. GROUP BY/HAVING/聚合函数 (后两个通常是伴随着 GROUP BY 分组出现的)
  3. UNION 纵向连接

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

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

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

sql

复制代码

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作为事前筛选和事后筛选的区别时提到过 */
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 OPTION CHECK

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

sql

复制代码

USE sql_invoicing;
CREATE OR REPLACE VIEW invoices_with_balance AS
SELECT 
    *
FROM invoices
WHERE (invoice_total - payment_total) > 0
with check option;
delete from invoices_with_balance
where invoice_id = 2;    -- 失败,无法删除

sql

复制代码

UPDATE invoices_with_balance
SET payment_total = invoice_total
WHERE invoice_id = 3
-- 还是失败,因为这里修改了之后,这条语句不满足这个视图的条件会消失,所以这个条件可以阻止它运行
-- Error Code: 1369. CHECK OPTION failed 'sql_invoicing.invoices_with_balance'

视图优点总结

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


相关文章
|
数据采集 机器学习/深度学习 数据挖掘
python数据分析——数据预处理
数据预处理是数据分析过程中不可或缺的一环,它的目的是为了使原始数据更加规整、清晰,以便于后续的数据分析和建模工作。在Python数据分析中,数据预处理通常包括数据清洗、数据转换和数据特征工程等步骤。
634 0
|
关系型数据库 MySQL 数据库连接
gorm连接mysql数据库以及建表和自动迁移
gorm连接mysql数据库以及建表和自动迁移
290 0
|
缓存 负载均衡 监控
每日一博 - 反向代理、API 网关、负载均衡
每日一博 - 反向代理、API 网关、负载均衡
715 0
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
448 3
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能电动车充电站优化
使用Python实现深度学习模型:智能电动车充电站优化
468 4
|
Prometheus 监控 Cloud Native
使用mysqld_exporter监控所有MySQL实例
使用mysqld_exporter监控所有MySQL实例
1371 2
独家直播|DB-GPT架构设计与源码解读(第一期)
🚀 DB-GPT首期源码解读系列上线啦! 10.8 晚7点,与DB-GPT项目发起人陈发强一起,深入探索DB-GPT的架构设计与源码解读。 🔎 直播看点: ● 架构全剖析:从设计思考到架构逻辑,全面剖析DB-GPT。 ● 源码速度解读:多模型管理、智能体、RAG、AWEL等核心模块一网打尽。 ● 项目作者面对面:陈发强,蚂蚁集团DB-GPT开源项目发起人,分享实战经验与洞见。 ● 有问必答:围绕DB-GPT的使用问题有问必答,线上帮你解issue! 👉 立即扫码预约,与DB-GPT作者零距离交流!
|
存储 数据采集 数据处理
效率与精准并重:掌握Pandas与NumPy高级特性,赋能数据科学项目
在数据科学领域,Pandas和NumPy是Python生态中处理数据的核心库。Pandas以其强大的DataFrame和Series结构,提供灵活的数据操作能力,特别适合数据的标签化和结构化处理。NumPy则以其高效的ndarray结构,支持快速的数值计算和线性代数运算。掌握两者的高级特性,如Pandas的groupby()和pivot_table(),以及NumPy的广播和向量化运算,能够显著提升数据处理速度和分析精度,为项目成功奠定基础。
219 2
ly~
|
传感器 存储 供应链
大数据在供应链管理中的具体应用案例
在供应链管理中,大数据的应用显著提升了效率与预测准确性。例如,沃尔玛利用销售数据与外部信息如天气预报,实现精准需求预测,提前调配应急物资,既满足顾客需求又减少库存积压。亚马逊则通过分析商品入库时间、销售速度等数据,优化库存水平,确保畅销品备货充足,小众品库存灵活,从而降低运营成本。DHL借助运输工具上的传感器收集的数据,优化物流路线,避免拥堵并合理装载货物,同时预测设备故障,减少物流延误,提升整体运输效率。
ly~
1764 2
|
机器学习/深度学习 算法 大数据
[ICLR 2024] 基于Pathways架构的自适应多尺度时间序列预测模型Pathformer
阿里云计算平台大数据基础工程技术团队主导,与华东师范大学数据科学与工程学院合作的论文《Pathformer: Multi-Scale Transformers With Adaptive Pathways For Time Series Forecasting》被ICLR 2024接收,该论文提出了基于Pathways架构的自适应多尺度时间序列预测模型Pathformer,它从时间分辨率和时间距离角度进行多尺度时序建模,同时进一步提出自适应Pathways来动态调整多尺度建模过程,基于两者,Pathformer在阿里云数据集和公开数据集上取得SOTA预测效果,并展现出不错的泛化性和迁移性。