百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

关于MySQL视图知识点总结

wptr33 2024-11-26 09:30 27 浏览

一、视图的概念

MySQL视图其实它是一种虚拟表,我们可以看作是它一个存储了特定查询结果的命名查询的结果显示。与物理表不同,视图并不实际存储数据,而是通过执行定义视图时查询的SQL语句获取查询数据。

以下通过案例来说明MySQL视图的概念和用法。

案例背景: 假设我们有一个简单的数据库,其中包含一个名为employees的表,用于存储员工信息,包含以下字段:

  • employee_id: 员工ID(主键)
  • first_name: 员工名字
  • last_name: 员工姓氏
  • department: 员工所属部门
  • salary: 员工薪水

我们希望创建一个视图,用于展示部门为“Sales”的员工信息,只包含员工ID、姓名和薪水这三个字段。我们将通过案例来演示如何创建视图以及如何使用它。

步骤 1:创建员工表 首先,我们创建一个employees表并插入一些示例数据:

sqlCopy codeCREATE TABLE employees (
  employee_id INT PRIMARY KEY,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  department VARCHAR(50),
  salary DECIMAL(10, 2)
);

INSERT INTO employees (employee_id, first_name, last_name, department, salary)
VALUES
  (1, 'John', 'Doe', 'Sales', 50000.00),
  (2, 'Jane', 'Smith', 'HR', 45000.00),
  (3, 'Mike', 'Johnson', 'Sales', 55000.00),
  (4, 'Emily', 'Williams', 'Finance', 60000.00);

步骤 2:创建视图 现在,我们创建一个名为sales_employees的视图,仅包含部门为“Sales”的员工信息:

sqlCopy codeCREATE VIEW sales_employees AS
SELECT employee_id, CONCAT(first_name, ' ', last_name) AS full_name, salary
FROM employees
WHERE department = 'Sales';

上述视图定义了一个查询,选择了employees表中部门为“Sales”的员工的employee_id、first_name和last_name字段,并使用CONCAT函数将名字和姓氏合并为full_name字段。该视图仅返回满足条件的行。

步骤 3:使用视图 现在,我们可以使用刚刚创建的sales_employees视图来查询部门为“Sales”的员工信息,如下所示:

sqlCopy codeSELECT * FROM sales_employees;

查询结果将显示如下:

diffCopy code+-------------+--------------+---------+
| employee_id | full_name    | salary  |
+-------------+--------------+---------+
| 1           | John Doe     | 50000.00|
| 3           | Mike Johnson | 55000.00|
+-------------+--------------+---------+

通过这个案例,我们可以看到使用MySQL视图可以将复杂的查询逻辑封装起来,并提供一个更加简洁方便的数据访问方式。视图还可以帮助我们隐藏底层数据表的细节,只暴露特定的信息给用户,提高了数据库的安全性和易用性。

二、视图的注意点

关于视图的更新,需要注意以下几点:

  1. 可更新视图: 有些视图是可以进行更新的,也就是说,可以通过视图对基本表的数据进行修改、插入和删除操作。这类视图必须满足一定的条件:
    1. 视图必须只涉及单个基本表(不涉及联接操作或子查询)。
    2. 视图的查询中不能包含以下元素:聚合函数(如SUM、COUNT等)、DISTINCT关键字、GROUP BY子句、HAVING子句。
    3. 视图的查询中不能使用子查询。
  1. 不可更新视图: 某些情况下,视图是不可更新的,无法对其进行数据修改、插入和删除操作。这通常出现在涉及到复杂查询的视图或使用了不符合可更新视图条件的查询。
  1. 更新视图的限制: 在对可更新视图进行更新时,需要注意以下限制:
    1. 视图的更新仅能影响其基本表中的数据,而不能修改视图查询中涉及其他表的数据。
    2. 更新视图时,视图的定义中必须包含基本表的主键,这样系统才能准确找到需要更新的行。
    3. 视图的定义必须满足视图可更新的条件,否则更新操作将被拒绝。
  2. 使用UPDATE、INSERT和DELETE进行更新: 可以使用与基本表相同的方式,使用UPDATE、INSERT和DELETE语句对视图进行更新操作。这些更新操作将反映在视图对应的基本表中,其实就是会影响到物理表中的结果。


三、可更新视图

可更新视图的情况:

案例:创建可更新的视图 假设我们有一个名为students的表,用于存储学生信息,包含以下字段:

  • student_id: 学生ID(主键)
  • first_name: 学生名字
  • last_name: 学生姓氏
  • age: 学生年龄

我们创建一个视图young_students,用于显示年龄小于等于25岁的学生信息,并且该视图是可更新的:

sqlCopy codeCREATE VIEW young_students AS
SELECT student_id, CONCAT(first_name, ' ', last_name) AS full_name, age
FROM students
WHERE age <= 25;

现在,我们可以使用该视图来进行更新操作:

sqlCopy code-- 更新视图中学生ID为1的学生的年龄
UPDATE young_students SET age = 26 WHERE student_id = 1;

-- 在视图中插入一条新的学生信息
INSERT INTO young_students (student_id, full_name, age)
VALUES (5, 'Alice Johnson', 23);

-- 从视图中删除学生ID为2的学生信息
DELETE FROM young_students WHERE student_id = 2;

上述更新操作将会修改students表中符合条件的数据,因为young_students视图只显示了年龄小于等于25岁的学生信息,所以更新也仅限于这部分数据。

需要再次强调,更新视图时必须满足可更新视图的条件,否则更新操作将会失败。对于不可更新视图,尝试执行更新操作时会产生错误提示。

四、不可更新视图

不可更新的视图,这类视图不支持对其进行数据修改、插入和删除操作。当尝试对不可更新的视图执行更新操作时,系统会产生错误提示,阻止这些操作的执行。

不可更新视图的主要原因是视图的定义涉及了某些复杂的查询操作或使用了不符合可更新视图条件的查询元素,例如:

  1. 包含聚合函数的视图: 如果视图的查询包含了聚合函数(如SUM、COUNT等)或使用了GROUP BY子句,那么这个视图就是不可更新的。
  2. DISTINCT关键字: 视图的查询中如果使用了DISTINCT关键字,该视图也会成为不可更新的视图。
  3. 包含子查询的视图: 视图的查询中如果使用了子查询,特别是在SELECT列表或WHERE子句中,这样的视图通常也是不可更新的。
  4. 涉及多个基本表的视图: 视图定义涉及多个基本表的联接操作,会使视图成为不可更新的。

下面是一个示例来演示一个不可更新的视图:

案例:创建不可更新的视图 假设我们有一个名为orders的表,用于存储订单信息,包含以下字段:

  • order_id: 订单ID(主键)
  • product_name: 商品名称
  • quantity: 商品数量
  • price: 商品单价

现在,我们尝试创建一个视图high_value_orders,用于显示订单金额大于1000的订单信息:

sqlCopy codeCREATE VIEW high_value_orders AS
SELECT order_id, product_name, quantity * price AS total_price
FROM orders
WHERE quantity * price > 1000;

上述视图的查询使用了quantity * price来计算订单的总金额,然后筛选出金额大于1000的订单。由于涉及了计算和筛选操作,这个视图是不可更新的视图。

因此,如果尝试对high_value_orders视图执行UPDATE、INSERT或DELETE操作,将会产生错误提示,告知视图不可更新的原因。

总结而言,不可更新的视图是基于复杂查询或包含特定元素的查询而定义的,它们主要用于提供只读的数据访问,无法直接修改基本表中的数据。如果需要对数据进行修改,需要使用可更新的视图,并满足视图可更新的条件。

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...