首页 > 数据库 >MySQL视图

MySQL视图

时间:2023-11-22 13:56:15浏览次数:33  
标签:语句 xld 视图 MySQL 数据 select view

视图(view)

1. 常见的数据库对象

对象 描述
表(table) 表是存储数据的单元,以行和列的形式存在,列就是字段,行就是记录
数据字典(系统表) 就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改,只能查看
约束(constraint) 执行数据校验的规则,用于保证数据完整性的规则
视图(view) 一个或者多个数据表里的数据逻辑显示,视图并不存储数据
索引(index) 用于提高查询性能,相当于书的目录
存储过程(procedure) 用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调用环境
存储函数(function) 用于完成一次特定的计算,具有一个返回值。(可以理解为自定义的(单行)函数)
触发器(trigger) 相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理

2. 视图概述

视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同用户制定不同的查询视图。

2.1 视图的理解

  • 视图是一种"虚拟表",本身是"不具有数据的",占用很少的内存空间,是SQL中一个重要概念,其本质就是存储起来的 select 语句。

  • 视图建立在已有表的基础上,视图赖以建立的这些表称为 "基表"

  • 视图本身的创建和删除只影响视图本身,不影响对应的"基表"。但是当对视图中的数据进行增加,删除和修改操作时,"基表"中的数据会相应地发生改变

  • 视图,在小型项目中不经常使用。但在大型项目中可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解使用都方便

3. 创建视图(DDL)

3.1 精简版

create view 视图名称 as select 语句

例如

CREATE VIEW VIEW xld_view AS
SELECT id,person_name,create_time FROM xld
  • 创建视图时,select 语句中字段的别名会作为视图中字段的名称

  • 也可以基于视图,创建视图。也就是说:视图的"基表"也可以是一个视图

3.2 复杂版 - 进阶版

创建视图语法:

[CREATE|REPLACE]
	[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
	VIEW view_name [{column_list}]
	AS SELECT_STATEMENT
[WITH [CASCADED | LOCAL |] CHECK OPTION]

释义:

字段语句 描述
CREATE / REPLACE 创建 / 替换已创建的视图
ALGORITHM 表示视图选择算法:
1. UNDEFINED:系统自动选择算法(默认)。

2. MERGE:使用的视图语句与视图定义合并起来。

3. TEMPTABLE:结果存入临时表,然后用临时表执行语句。
view_name 视图名称
column_list 属性列
SELECT_STATEMENT SELECT 语句
[WITH [CASCADED / LOCAL] CHECK OPTION] 表示视图在更新时保证在视图的权限范围内:

1. CASCADED 表示更新视图的时候,要满足视图和表的相关条件(默认)。

2. LOCAL 表示更新视图的时候,要满足该视图定义的一个条件即可。

4. 查看视图(DDL)

  • 查看数据库中的表对象,视图对象
show tables
  • 查看视图的结构
desc 视图名称
# 例如
desc xld_view
  • 查看视图的属性信息(显示数据表的存储引擎,版本,数据行数和数据大小等..)
show table status like '视图名称';
# 例如
SHOW TABLE STATUS LIKE 'xld_view'
  • 查看视图的详细定义信息
show create view 视图名称;
# 例如
SHOW CREATE VIEW xld_view;

5. 操作视图的中数据(DML)

5.1 操作视图的语句

注意:要使视图可更新,视图中的行和底层"基表"中的行之间必须存在"一对一"的关系。

  • 修改语句:更新视图的数据,会导致"基表"中数据的修改
update 视图名称 set 字段 = 修改的值,... where 过滤条件
# 例如
UPDATE xld_view SET person_name = 'xld_view' WHERE id = 1 
  • 删除语句:删除视图的数据,会导致"基表"中数据的删除
delete from 视图名称 where 过滤条件
# 例如
DELETE FROM xld_view WHERE id =  1

5.2 不可操作的视图

  • 在定义视图的时候指定了 "ALGORITHM = TEMPTABLE" ,视图将不支持 insert 和 delete 操作

  • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持 insert 操作

  • 在定义视图的 select 语句中使用了 join联合查询,视图将不支持 insert 和 delete 操作

  • 在定义视图的 select 语句中使用了 数据表达式 或 子查询,视图将不支持 insert 和 delete 操作

  • 在定义视图的 select 语句中使用了 去重,聚合函数,group by,having,union 等,视图将不支持 insert 和 delete 以及 update 操作

  • 定义了一个不可更新的视图

  • 常量视图

5.3 开发经验 - 呵呵

虽然可以更新视图数据,但总的来说,视图作为"虚拟表",主要用于"方便查询",不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的

6. 修改,删除视图(DDL)

6.1 修改视图

  • 方式1:(推荐)
alter view 视图名 as
select 语句

# 例如
ALTER VIEW xld_view1 AS
SELECT * FROM xld WHERE id = 4
  • 方式2:(扩展)
create or replace view 视图名 as 
select 语句

# 例如
CREATE OR REPLACE VIEW xld_view AS
SELECT id,person_name,update_time FROM xld where id = 3

6.2 删除视图

drop view 视图名称
# 例如
DROP VIEW xld_view
  • 删除多个视图
drop view if exists 视图名称,视图名称,...
# 例如
DROP VIEW IF EXISTS xld_view,xld_view1,xld_view_xld

注意:基于视图而创建的视图,如果底层的视图删除了,那么使用该视图的所有视图都会受到影响。

说明:基于视图a,b创建了新的视图c,如果将视图a或者视图b删除,会导致视图c的查询失败。这样的视图c需要手动删除或者修改,否则影响使用。

7. 总结(呵呵哒)

7.1 视图优点

7.1.1 操作简单

将经常使用的查询操作定义为视图,开发人员无需关心视图对应数据表的结构,表与表之间的关联,也不需要关心数据表之间的业务逻辑和查询条件,而只需简单的操作视图即可。极大简化了对数据库的操作

7.1.2 减少数据冗余

视图的本质就是一个存储起来的 select 语句,一张虚拟表,而视图本身不存储数据,不占用数据存储资源,减少了数据冗余

7.1.3 数据安全

MySql 可以通过使用控制视图的"访问限制",来实现用户对某些数据的结果集进行控制。建立了用户和数据表之间的"隔离性"。

7.1.4 适应灵活多变的需求 - (必须会)

当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用的比较多。

例如:

  1. 当系统上线后,需要在某张表中添加一两个字段,在不改动原有表的情况下,创建一个视图在视图中添加即可。(体会一下哦)

  2. 可以使用视图将多张有关联关系的表的数据合并一张表,在利用mybatis-plus对单表操作的特性。当然只限于查询。

7.1.5 能够分解复杂的查询逻辑

数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑。

7.2 视图缺点

  • 视图是基于实际数据表的基础上创建的,那么,如果实际数据表的结果变更了,我们就需要及时对相关的视图进行相应的维护。
  • 嵌套视图(基于视图的基础上创建的视图),维护会变的更加复杂,可读性不好,容易变成潜在隐患。
  • 创建视图时,对字段重命名以及复杂的逻辑,也大大增加维护的成本

8. 口诀

操作视图简单口诀:c 创 - d 删 - a 修改(view)

标签:语句,xld,视图,MySQL,数据,select,view
From: https://www.cnblogs.com/xiaolindang/p/17848851.html

相关文章

  • mysql8下载安装及配置
    一、下载官网地址:https://dev.mysql.com/downloads/mysql/8.0.html选择“downloads”-->"mysqlcommunityserver",如下图所示:向下滑动页面,找到你电脑适配的版本,点击“download”,如下图:页面跳转,不需要注册和登陆,点击“Nothanks,juststartmydownload.......
  • mysql 处理 json 字段
    1.查看包含json字段的表信息mysql>desctab_json;+-------+------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------+------------+------+-----+---------+----------------+|id|bigint(20)......
  • java类转mysql表创建语句
    packagecn.eangaie.cloud.wx3562;importcn.hutool.core.io.FileUtil;importcn.hutool.core.lang.Console;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importio.swagger.annotations.ApiModelProper......
  • MySQL-重置主键自动递增值-从头开始
    如果你想要重置MySQL数据库中的AUTO_INCREMENT值并让它从头开始增加新的ID,请按照以下步骤进行操作:首先,确定你要修改的表格名和要修改的字段名。例如,假设你有一个名为“users”的表格,并且该表格中的主键字段名为“id”。然后,执行以下SQL命令来更改该字段的当前自动递增计数器:ALT......
  • mysql无法登陆,报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (
    问题描述在使用命令行登录MySQL时出现了下述问题: 出错原因usingpassword:NO:表示输入没有输入密码就尝试登陆了usingpassword:YES:表示输入了密码,但密码错误 解决方案:修改密码1.修改mysql配置文件my.cnf。在 [mysqld]增加skip-grant-tables 无密码进入mys......
  • 【MySQL】配置文件
    #Disablingsymbolic-linksisrecommendedtopreventassortedsecurityrisks#symbolic-links=0#Settingsuserandgroupareignoredwhensystemdisused.#Ifyouneedtorunmysqldunderadifferentuserorgroup,#customizeyoursystemdunitfilefor......
  • MySql 中 DATEDIFF() 用法
    DATEDIFF函数用于计算两个日期之间的差值,并以天数返回结果。它的语法如下:DATEDIFF(end_date,start_date)其中,end_date和start_date是要计算差值的结束日期和起始日期。以下是一个示例,计算两个日期之间的天数差值:SELECTDATEDIFF('2023-11-21','2023-11-01')ASdays_di......
  • MySQL8.0新特性
    MySql8的其他新特性1.MySQL8新特性概述MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQLOptimizer优化器进行了改进。不仅在速度上得到了改善,还为......
  • 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 Postgr
     C++是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库。以下是一些示例代码,演示如何使用C++连接SQLServer、MySQL、Oracle、ACCESS、SQLite和PostgreSQL、MongoDB数据库。连接SQLServer数据库要使用C++连接SQLServer数据库,可以使用Micro......
  • 监控MySQL数据库
    监控MySQL数据库想通过grafana简单监控一下MySQL数据库的情况.作为笔记处理.创建用户建议给数据库创建一个监控用户:CREATEUSER'mysqlexporter'@'localhost'IDENTIFIEDBY'Testxxxxxxxx'WITHMAX_USER_CONNECTIONS3;GRANTPROCESS,REPLICATIONCLIENT,SELECTON......