当前位置: 首页 > news >正文

MySQL 视图

核心目标: 学习如何创建和使用视图,以简化复杂的查询、提供数据访问控制、实现逻辑数据独立性,并通过 WITH CHECK OPTION 保证数据一致性。

什么是视图?
视图(View)是一种虚拟表,其内容由一个 SQL 查询定义。它本身不包含任何数据,而是像一个窗口,通过它可以查看或操作一个或多个基表(实际存储数据的表)中的数据。视图存储的是 SELECT 语句,而不是数据本身。视图有助于简化复杂性并可以增强安全性。

为什么使用视图?

  1. 简化复杂查询: 封装复杂的 JOINWHERE 子句。
  2. 数据访问控制: 只暴露允许用户查看的数据列或行。
  3. 逻辑数据独立性: 基表结构变化对视图查询的影响较小。
  4. 数据一致性: (通过 ALTER VIEW 添加 WITH CHECK OPTION) 确保通过视图修改的数据仍然符合视图的定义标准。

1. 创建视图

作用:定义并创建一个新的视图。

语法:

create [or replace] view view_name [(column_list)]
as
select_statement;

说明:

  • or replace: 若视图存在则替换。
  • view_name: 视图名称。
  • (column_list): (可选) 视图列名。
  • select_statement: 定义视图的 SELECT 查询。

示例:

-- 创建只显示计算机科学专业学生的视图
create view cs_students_view as
select student_id, student_name, gpa
from students
where major = '计算机科学';-- 创建显示员工姓名和部门名称的视图 (基于 JOIN)
create view employee_department_view as
select e.emp_name, d.dept_name
from employees e
inner join departments d on e.dept_id = d.dept_id;-- 创建视图并指定列名
create view product_summary_view (id, name, available_stock) as
select product_id, product_name, stock_quantity
from products
where stock_quantity > 0;

2. 查询视图

作用:像查询普通表一样查询视图。

语法:

select column_list from view_name [where condition ...];

示例:

-- 查询所有计算机科学专业的学生信息
select * from cs_students_view;-- 查询特定员工的部门信息
select dept_name from employee_department_view where emp_name = 'Alice';

3. 修改视图

作用:更改现有视图的定义,可以修改 SELECT 语句,也可以添加或移除 WITH CHECK OPTION

语法:

alter view view_name [(column_list)]
as
new_select_statement
[with [cascaded | local] check option];

说明:

  • 参数与 CREATE VIEW 类似,但用于修改已存在的视图。
  • WITH [CASCADED | LOCAL] CHECK OPTION: (可选) 此子句用于可更新视图。它强制检查通过视图进行的 INSERTUPDATE 操作,确保结果行仍然满足视图定义中的 WHERE 条件。如果操作违反此条件,将被拒绝。
    • LOCAL: 只检查当前视图的 WHERE 条件。
    • CASCADED (默认): 检查当前视图及其所有基础视图的 WHERE 条件。

示例:

-- 示例 1: 修改 cs_students_view,增加显示 email 列
alter view cs_students_view as
select student_id, student_name, email, gpa
from students
where major = '计算机科学';-- 示例 2: 给一个已存在的视图 high_stock_products_view 添加 WITH CHECK OPTION
alter view high_stock_products_view as
select product_id, product_name, stock
from products
where stock > 100
with check option; -- 添加检查选项 (默认为 CASCADED)-- 示例 3: 演示 CASCADED 检查选项
-- 假设已存在视图 v_expensive_products (price > 100)
-- create view v_expensive_products as select * from products where price > 100;
-- 再假设已存在视图 v_expensive_electronics 基于 v_expensive_products
-- create view v_expensive_electronics as select * from v_expensive_products where category = 'Electronics';-- 现在修改 v_expensive_electronics 添加 CASCADED 检查
alter view v_expensive_electronics as
select product_id, product_name, category, price
from v_expensive_products
where category = 'Electronics'
with cascaded check option; -- 明确使用 CASCADED-- 后续如果尝试通过 v_expensive_electronics 更新某产品价格低于 100
-- (如: update v_expensive_electronics set price = 80 where product_id = 1;)
-- 该操作将会失败,因为 CASCADED 会检查基础视图 v_expensive_products 的 price > 100 条件。

4. 删除视图

作用:永久删除一个或多个视图。不影响基表数据。

语法:

drop view [if exists] view_name1, [view_name2, ...];

示例:

-- 删除视图
drop view if exists product_summary_view;

5. 视图的可更新性

并非所有视图都可更新(支持 INSERT, UPDATE, DELETE)。通常需要满足:

  • 无聚合函数、DISTINCTGROUP BYHAVINGUNION 等。
  • 基于单个基表(或特定类型 JOIN)。
  • INSERT 时,视图包含基表所有 NOT NULL 列。

简单判断:视图的行能唯一映射回基表的一行,则通常可更新。

6. 视图的优点与注意点

优点:

  • 简化性
  • 安全性
  • 一致性
  • 逻辑独立性

注意点:

  • 性能: 视图是虚拟的,每次查询都执行其定义。复杂视图需关注性能。
  • 更新限制: 不是所有视图都可更新。
  • 嵌套视图: 避免过多嵌套。

练习题

假设使用之前的 employeesdepartments 表。

  1. 创建一个名为 it_employees_view 的视图,显示所有 IT 部门(dept_id=2)员工的 ID (emp_id)、姓名 (emp_name) 和工资 (salary)。
    答案:

    create view it_employees_view as
    select emp_id, emp_name, salary
    from employees
    where dept_id = 2;
    
  2. 查询 it_employees_view 视图,找出工资高于 78000 的 IT 部门员工。
    答案:

    select * from it_employees_view where salary > 78000;
    
  3. 创建一个名为 dept_summary_view 的视图,显示每个部门的名称 (dept_name) 以及该部门的员工总数(列名为 employee_count)。
    答案:

    create view dept_summary_view as
    select d.dept_name, count(e.emp_id) as employee_count
    from departments d
    left join employees e on d.dept_id = e.dept_id
    group by d.dept_name;
    
  4. 查询 dept_summary_view 视图,找出员工人数为 0 的部门。
    答案:

    select * from dept_summary_view where employee_count = 0;
    
  5. 修改 it_employees_view 视图,为其添加 WITH CHECK OPTION,以确保将来通过此视图进行的任何更新或插入操作都必须保持员工的 dept_id 为 2。
    答案:

    alter view it_employees_view as
    select emp_id, emp_name, salary
    from employees
    where dept_id = 2
    with check option;
    
  6. 删除 dept_summary_view 视图。
    答案:

    drop view if exists dept_summary_view;
    

相关文章:

MySQL 视图

核心目标: 学习如何创建和使用视图,以简化复杂的查询、提供数据访问控制、实现逻辑数据独立性,并通过 WITH CHECK OPTION 保证数据一致性。 什么是视图? 视图(View)是一种虚拟表,其内容由一个 …...

[操作系统] 信号

信号 vs IPC 板书最后提到了 “信号 vs IPC”,暗示了信号也是一种进程间通信 (Inter-Process Communication, IPC) 的机制。虽然信号的主要目的是事件通知,但它也可以携带少量的信息(即信号的类型)。 初探“信号”——操作系统的“…...

网络基础(协议,地址,OSI模型、Socket编程......)

目录 一、计算机网络发展 二、协议 1.认识协议 2.OSI七层模型 3.TCP/IP 五层(或四层)模型 4.协议本质 三、网络传输流程 1.MAC地址 2.协议栈 3.IP地址 IP地址 vs MAC地址 1. 核心区别 2. 具体通信过程类比 3. 关键总结 为什么需要两者? 4.协议栈图解…...

产品经理学习过程

一:扫盲篇(初始产品经理) 阶段1:了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二:准备篇 阶段2:工…...

深入理解Java包装类:自动装箱拆箱与缓存池机制

深入理解Java包装类:自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类:基本类型和引用类型。作为一门面向对象编程语言, 一切皆对象是Java语言的设计理念之一。但基本类型不是对象,无法直接参与面向对象操作&…...

Linux中的信号量

目录 信号量概念 定义 操作 类型 应用 信号量封装 一、创建信号量 头文件 函数原型 参数说明 返回值 示例 二、设置信号量初始值 头文件 函数原型 参数解释 返回值 示例 三、信号量的P操作 头文件 函数原型 参数解释 返回值 示例 四、信号量的V操作 示…...

深入理解linux操作系统---第15讲 Web 服务器 Nginx

15.1 Nginx 概述 核心特性与历史背景 Nginx由俄罗斯工程师Igor Sysoev于2002年开发,2004年正式发布,旨在解决传统服务器(如Apache)的C10K问题(即单机万级并发连接处理)。其采用事件驱动(Event…...

深度解析算法之前缀和

25.【模版】一维前缀和 题目链接 描述 输入描述 输出描述 输出q行,每行代表一次查询的结果. 示例 输入: 3 2 1 2 4 1 2 2 3 复制 输出: 3 6 这个题的话就是下面的样子,我们第一行输入 3 2的意思即是这个数组是3个元素大小的数组&…...

混合精度训练中的算力浪费分析:FP16/FP8/BF16的隐藏成本

在大模型训练场景中,混合精度训练已成为降低显存占用的标准方案。然而,通过NVIDIA Nsight Compute深度剖析发现,‌精度转换的隐藏成本可能使理论算力利用率下降40%以上‌。本文基于真实硬件测试数据,揭示不同精度格式的计算陷阱。…...

6.8 Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度

Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度 实现每日和每周定时任务 关键词:定时任务调度、Python 原生调度器、Cron 脚本、异常重试机制、任务队列管理 1. 定时任务架构设计 采用 分层调度架构 实现灵活的任务管理: #mermaid-svg-PnZcDOgOklVieQ8X {f…...

[Android] 豆包爱学v4.5.0小学到研究生 题目Ai解析

[Android] 豆包爱学 链接:https://pan.xunlei.com/s/VOODT6IclGPsC7leCzDFz521A1?pwdjxd8# 拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学,一般又称河马爱学教育平台app,河马爱学。 关…...

swift-12-Error处理、关联类型、assert、泛型_

一、错误类型 开发过程常见的错误 语法错误(编译报错) 逻辑错误 运行时错误(可能会导致闪退,一般也叫做异常) 2.1 通过结构体 第一步 struct MyError : Errort { var msg: String } 第二步 func divide(_ …...

每日定投40刀BTC(14)20250409 - 20250419

定投 坚持 《磨剑篇》浮生多坎壈,志业久盘桓。松柏凌霜易,骅骝涉险难。砺锋临刃缺,淬火取金残。但使精魂在,重开万象端。...

【刷题Day20】TCP和UDP(浅)

TCP 和 UDP 有什么区别? TCP提供了可靠、面向连接的传输,适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输,适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性,保证数据按顺序…...

大数据建模与评估

文章目录 实战案例:电商用户分群与价值预测核心工具与库总结一、常见数据挖掘模型原理及应用(一)决策树模型(二)随机森林模型(三)支持向量机(SVM)模型(四)K - Means聚类模型(五)K - Nearest Neighbors(KNN)模型二、运用Python机器学习知识实现数据建模与评估(一…...

Python语法系列博客 · 第6期[特殊字符] 文件读写与文本处理基础

上一期小练习解答(第5期回顾) ✅ 练习1:字符串反转模块 string_tools.py # string_tools.py def reverse_string(s):return s[::-1]调用: import string_tools print(string_tools.reverse_string("Hello")) # 输出…...

Pandas取代Excel?

有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…...

《解锁图像“高清密码”:超分辨率重建之路》

在图像的世界里,高分辨率意味着更多细节、更清晰的画面,就像用高清望远镜眺望远方,一切都纤毫毕现。可现实中,我们常被低分辨率图像困扰,模糊的监控画面、老旧照片里难以辨认的面容……不过别担心,图像超分…...

杨校老师课堂之C++入门练习题梳理

采用C完成下列题目,要求每题目的时间限制:1秒 内存限制:128M 1. 交换个位与十位的数字 时间限制:1秒 内存限制:128M 题目描述 试编写一个程序,输入一个两位数,交换十位与个位上的数字并输出。 …...

基于springboot的老年医疗保健系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…...

数据分析与挖掘

一 Python 基本语法 变量与数据类型 : Python 中变量无需声明,直接赋值即可。 常见的数据类型有数值型(整型 int、浮点型 float、复数型 complex)、字符串型(str,用单引号、双引号或三引号括起来&#xff…...

RoBoflow数据集的介绍

https://public.roboflow.com/object-detection(该数据集的网址) 可以看到一些基本情况 如果我们想要下载,直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指,右边是可供选择的一些yolo模型的格式 如果你想下载…...

大模型Rag - 两大检索技术

一、稀疏检索:关键词匹配的经典代表 稀疏检索是一种基于关键词统计的传统检索方法。其基本思想是:通过词频和文档频率来衡量一个文档与查询的相关性。 核心原理 文档和查询都被表示为稀疏向量(如词袋模型),只有在词…...

【T型三电平仿真】SVPWM调制

目录 仿真模型分析 克拉克变换 大扇区判断​编辑 小区域判断 计算基本电压矢量作用时间 确定基本电压矢量的作用顺序 作用时间和矢量作用顺序对应 七段式化生成阶梯图 矢量状态分布 本人学习过程中提出的问题和解释 SVPWM调制实现了什么功能 SVPWM的算法步骤是什么…...

树莓派5-开发应用笔记

0.树莓派系统目录 /home:用户目录。 除了root用户外,其他所有的使用者的数据都存放在这个目录下,在树莓派的系统中,/home目录中有一个pi的子目录,这个就是pi用户的默认目录。 /bin: 主要放置系统的必备执行文件目录。 …...

[Java实战经验]异常处理最佳实践

一些好的异常处理实践。 目录 异常设计自定义异常为异常设计错误代码(状态码)设计粒度全局异常处理异常日志信息保留 异常处理时机资源管理try-with-resources异常中的事务 异常设计 自定义异常 自定义异常设计,如业务异常定义BusinessExce…...

AOSP的Doze模式-LightIdle初识

前言 从Android 6.0开始,谷歌引入了Doze模式(打盹模式)的省电技术延长电池使用时间。根据第三方测试显示,两台同样的Nexus 5,开启的Doze的一台待机能达到533小时,而未开启Doze的一台待机只能达到200小时。Doze省电效果十分明显。…...

QML动画--ParticleSystem

ParticleSystem 是 QML 中用于创建和管理粒子系统的组件,可以制作各种粒子效果如火焰、烟雾、爆炸等。 基本用法 qml import QtQuick.Particles 2.15ParticleSystem {id: particleSystemImageParticle {source: "particle.png"color: "red"a…...

Win 11 重装 Ubuntu 双系统方法

有时候 Ubuntu 环境崩溃了,或者版本过低,需要卸载重装。本文介绍重装的方法,默认已经有一个双系统。 1. 删除原先 Ubuntu 分区 首先打开 Win 的磁盘管理,找到 Ubuntu 的分区,右键删除分区(注意不要错删 wi…...

单例模式:懒汉式的两种优化写法

单例模式:全局唯一实例 懒汉式:获取时才初始化 ①静态局部变量实现(Meyer’s Singleton)【推荐】 /* 类内创建自身实例的可行性分析:在C中,类可以通过静态成员函数创建自身实例。这种机制的核心在于&…...

详细解释浏览器是如何渲染页面的?

渲染流程概述 渲染的目标:将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务&#xff0…...

高速系统设计简介

1.1 PCB 设计技术回顾 1981 年 8 月 12 日,IBM 正式发布了历史上第一台个人电脑,自此之后,个人电脑融入了人们生活和工作的各个角落,人类从此进入了个人电脑时代。个人电脑的出现,不仅促进了电子产品在消费领域的发展…...

不规则曲面上两点距离求取

背景 在CT中求皮肤上两点间的弧长。由于人体表面并不是规则的曲面,不可能用圆的弧长求取方法来计算出两点间的弧长。 而在不规则的曲面上求两点的距离,都可以用类似测地线距离求取的方式来求取(积分),而转化为搜索路…...

用usb网卡 虚拟机无法开到全双工的解决办法

今天突发奇想 给unraid宿主机插了两个一摸一样的usb网卡 2.5g的 直通给不同的虚拟机 这里unraid需要安装"USB Manager" 请给unraid自备环境 直通的时候 第一次还没生效 看不到网卡 我又在unraid的管理界面 顶部可以看到多出来一个 "usb"页面 打开可…...

webpack 中 chunks详解

webpack 中 chunks详解 在 Webpack 项目中,webpack.config.js 是核心配置文件,而非 webpack.json。chunks 的概念与 Webpack 的代码分割(Code Splitting)功能密切相关,通过 optimization.splitChunks 配置项可以实现对…...

Java @Serial 注解深度解析

Java Serial 注解深度解析 1. 注解本质 Serial 是 Java 14 引入的编译时校验注解,用于标记序列化相关成员,帮助开发者避免常见的序列化错误。 2. 核心作用 (1) 主要用途 标记序列化相关的特殊方法/字段 提供编译时检查 替代传统的命名约定验证 (…...

齐次坐标变换+Unity矩阵变换

矩阵变换 变换(transform):指的是我们把一些数据,如点,方向向量甚至是颜色,通过某种方式(矩阵运算),进行转换的过程。 变换类型 线性变换:保留矢量加和标量乘的计算 f(x)…...

Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧

上一期小练习解答(第8期回顾) ✅ 练习1:整数转字符串列表 nums [1, 2, 3, 4, 5] str_list list(map(str, nums))✅ 练习2:筛选回文字符串 words ["madam", "hello", "noon", "python&qu…...

Python语法系列博客 · 第4期[特殊字符] 函数的定义与使用:构建可复用的模块

上一期小练习解答(第3期回顾) ✅ 练习1:创建一个列表,添加5个名字,并用循环打印 names ["Alice", "Bob", "Charlie", "David", "Eva"] for name in names:print…...

6547网:2025年3月 Python编程等级考试一级真题试卷

2025年3月青少年软件编程Python等级考试(一级)真题试卷 题目总数:37 总分数:100 选择题 第 1 题 单选题 下列哪个软件不能运行Python程序?( ) A.JupyterNotebook B.Pycharm C.原版…...

微前端框架Module Federation

以下是 Module Federation 的核心知识点,并结合微前端架构的设计思想,帮助我们构建完整的知识体系: 一、Module Federation 基础概念 1. 什么是 Module Federation? 定义:Webpack 5 引入的一项革命性功能,允许在运行时动态加载其他独立构建的应用模块(微前端),实现跨…...

AUTOSAR图解==>AUTOSAR_SWS_IntrusionDetectionSystemManager

AUTOSAR 入侵检测系统管理器 (IdsM) 详解 AUTOSAR安全框架的核心组件 1. 概述 AUTOSAR 入侵检测系统管理器(Intrusion Detection System Manager, IdsM)是AUTOSAR标准中安全防护框架的关键组成部分,专门负责处理车载安全事件。IdsM模块提供了…...

Alan AI - 面向Web的生成式AI SDK

本文翻译整理自:https://github.com/alan-ai/alan-sdk-web 文章目录 一、关于 Alan AI相关链接资源关键功能特性Alan AI StudioAlan AI SDKAlan AI Cloud 二、为什么选择Alan AI?三、快速开始四、下载安装五、示例应用六、其他平台SDK七、获取帮助 一、关…...

递归下降 ll(1) 型文法 识别二元组文法分析

#include <stdio.h> #include <string.h>FILE* fp; FILE* fa2;char* str new char[1200]; // 循环读取文件&#xff0c;分200字节读取char* peek;// 表格 typedef struct table {char* sign;char* kind;char* message; } signtable;signtable* list; // 数…...

Qt unknown module(s) in qt:serialport解决方法

在Ubuntu和CentOS系统中,若使用Qt时遇到Unknown module(s) in QT: serialport错误,通常是由于未正确安装Qt的串口模块(QSerialPort)或项目配置不当导致。以下是针对两种系统的解决方案: 一、安装Qt串口模块 1. Ubuntu/Debian系列 安装开发包: 执行以下命令安装Qt5串口模…...

金融数学专题6 证券问题与资本利得税

一、固定利息证券 特点&#xff1a;利息固定&#xff0c;且可以在证券名字中体现。 发行价格:公司公开发行证券的价格。 固定利率证券通常在其名称中包括应付利率&#xff0c;例如&#xff0c;8% Treasury Stock 2021 或 5% Treasury Gilt 2018。每位持有人应得的年利息是通…...

XGBoost

XGBoost 假设一共有 m m m个基模型&#xff0c;分别为 f 1 ( x ) , f 2 ( x ) , … , f m ( x ) f_1(x),f_2(x),\dots,f_m(x) f1​(x),f2​(x),…,fm​(x)&#xff0c; n n n个样本&#xff0c; x 1 , x 2 , … , x n x_1,x_2,\dots,x_n x1​,x2​,…,xn​&#xff0c;则XGBoo…...

Kubernetes 多主多从集群部署完整文档

好久不见呀&#xff01;今天给大家整点干货尝尝&#xff08;其实是自己的总结&#xff09;&#xff0c;主打的就是全程无尿点。 Kubernetes 多主多从集群部署完整文档 1. 机器列表 PS: master&#xff0c;lb&#xff0c;nfs机器均为CentOS 7&#xff0c;其他为Ubuntu 22.04 L…...

使用Spring Validation实现参数校验

引入Spring Validation 起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数校验失败异常处理 所有的http请求异常都会被拦截处理 exception…...

用思维导图解锁计算机科学导论的知识宝库

引言 在计算机科学的浩瀚海洋中&#xff0c;“计算机科学导论” 如同开启宝藏的钥匙&#xff0c;是众多学习者踏入这片领域的第一步。今天&#xff0c;我将借助思维导图这一强大工具&#xff0c;带大家梳理计算机科学导论的关键知识点&#xff0c;同时也希望能为大家在学习的道…...