MySQL视图的概念和操作函数详解
作者:瀛台夜雪 发布时间:2024-01-24 15:27:22
常见的数据库对象
对象 | 描述 |
---|---|
表(TABLE) | 表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录 |
数据字典 | 就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护, 程序员通常不应该修改,只可查看 |
约束 (CONSTRAINT) | 执行数据校验的规则,用于保证数据完整性的规则 |
视图(VIEW) | 一个或者多个数据表里的数据的逻辑显示,视图并不存储数据 |
索引(INDEX) | 用于提高查询性能,相当于书的目录 |
存储过程 (PROCEDURE) | 用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调 用环境 |
存储函数 (FUNCTION) | 用于完成一次特定的计算,具有一个返回值 |
触发器 (TRIGGER) | 相当于一个事件 * ,当数据库发生特定事件后,触发器被触发,完成相应的处理 |
视图的概念
视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。
视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据(DML)进行增加、删除和 修改操作时,数据表中的数据会相应地发生变化,反之亦然。
视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句
在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删 除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。
视图,是向用户提供基表数据的另一种表现形式。通常情况下,小型项目的数据库可以不使用视 图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我 们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。
创建视图
查询语句中字段的别名会作为视图的别名出现
CREATE VIEW vu_emps
AS
SELECT employee_id,last_name,salary
FROM emps;
CREATE VIEW vu_emps2(emp_id,name,monthly_sal)
AS
SELECT employee_id,last_name,salary
FROM emps;
针对多表的视图创建
CREATE VIEW vu_emp_dept
AS
SELECT employee_id,e.department_id,department_name
FROM emps e JOIN depts d
ON e.department_id = d.department_id;
SELECT * FROM vu_emp_dept;
利用视图对数据进行格式化
CREATE VIEW vu_emp_dept1
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;
基于视图创建视图
CREATE VIEW vu_emp4
AS
SELECT department_id,department_name FROM vu_emp_dept;
SELECT * FROM vu_emp4;
查看视图
查看数据库的表对象,视图对象
SHOW TABLES;
查看数据库结构
DESC vu_emp4;
查看数据的属性信息
mysql> SHOW TABLE STATUS LIKE 'vu_emp4'\G;
*************************** 1. row ***************************
Name: vu_emp4
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.00 sec)
ERROR:
No query specified
查看视图的详细定义信息
mysql> SHOW CREATE VIEW vu_emp4\G;
*************************** 1. row ***************************
View: vu_emp4
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `vu_emp4` AS select `vu_emp_dept`.`department_id` AS `department_id`,`vu_emp_dept`.`department_name` AS `department_name` from `vu_emp_dept`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
ERROR:
No query specified
更新视图数据
更新视图中的数据,会导致基表中数据的修改
更新表中的数据,也会导致视图中的数据的修改
要使视图可更新,视图中的行和底层基本表中的行之间必须存在 一对一 的关系。另外当视图定义出现如下情况时,视图不支持更新操作:
在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;
在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT,也 不支持UPDATE使用了数学表达式、子查询的字段值;
在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、 聚合函数 、 GROUP BY 、 HAVING 、 UNION 等,视图将不支持INSERT、UPDATE、DELETE;
在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持 INSERT、UPDATE、DELETE;
视图定义基于一个 不可更新视图 ; 常量视图。
虽然可以更新视图数据,但总的来说,视图作为虚拟表 ,主要用于方便查询 ,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。
修改视图
方式1:使用CREATE OR REPLACE VIEW 子句修改视图
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id
FROM employees
WHERE department_id = 80;
CREATE OR REPLACE VIEW vu_emp4
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;
说明:CREATE VIEW 子句中各列的别名应和子查询中各列相对应。
方式2:ALTER VIEW
修改视图的语法是:
ALTER VIEW 视图名称
AS
查询语句
ALTER VIEW vu_emp4
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id;
删除视图
DROP VIEW vu_emp4;
DROP VIEW IF EXISTS vu_emp1;
视图的优缺点
优点:
操作简单
减少数据冗余
数据安全
适应灵活多变的需求
能够分解复杂的查询逻辑
缺点:
维护成本高
可读性不好
来源:https://blog.csdn.net/sxycylq/article/details/129180889
猜你喜欢
- 一、问题故事起源于一个查询错漏率的报表:有两个查询结果,分别是报告已经添加的项目和报告应该添加的项目,求报告无遗漏率何为无遗漏?即,应该添加
- 本文实例讲述了PHP实现ASCII码与字符串相互转换的方法。分享给大家供大家参考,具体如下:<?phpclass ascii { &n
- 众所周知,IE 6只支持单通道的PNG图片(即只有透明/不透明2种状态,gif图片的透明单通道透明),因此如果需要使用alpha透明的png
- 下表列出了 Microsoft ACCESS 的命令行选项:选项 效果database 打开指定的 Microsoft Access 数据库
- 本文实例讲述了python递归计算N!的方法。分享给大家供大家参考。具体实现方法如下:def factorial(n): if
- 本文实例讲述了Python网络编程之TCP与UDP协议套接字用法。分享给大家供大家参考,具体如下:TCP协议服务器端:#!/usr/bin/
- 测试结果: 整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间完整程序,拿去可用 整个程序分了三个模块:购票模块(
- 使用axios固定url请求前缀main.js中添加:使用方法:定义axios默认路径前缀或动态修改前缀如:每个请求url前都要加一个前缀,
- 1.var、let、const简介 ECMAS
- 装饰器的基础使用(装饰带参函数)def decorator(func): def inner(info): &nb
- 前言博主参与过大大小小十次数学建模比赛,也获得了不少建模奖项。对于一些小批量样本数据去做预测或者是评估其规律性的话,比较适合的模型一般都是选
- 一、前期准备1.1 案例分析适用场景:单例布局1.2 方 * V视图 HTML+CSS+调试C js实现控制流程D数据 优化扩展二、代码结构&
- 在Oracle 8i中,往往会出现要在存储过程中运行操作系统命令的情况。一般来说,利用Oracle Enterprise Manager设定
- torch.repeat_interleave()函数解析1.函数说明官网:torch.repeat_interleave(),函数说明如下
- truncate table 表名 ( 数据不可恢复性的删除 truncate 标识列会重排 ) LinqUtil.Db.ExecuteCo
- 一、简介1、概述因为信息是展现在命令行中的,众所周知,命令行展现复杂的文本看起来着实累人,于是就想着能像表格那样展示,那看起来就舒服多了。p
- 随机背景--当你每次进入该页面时,从已指定的图片文件夹中,随机选取一个图片作为背景显示。这里介绍的方法是用ASP+CSS来实现的。 &nbs
- 接触 Python 不久,看到很多人写2048,自己也捣鼓了一个,主要是熟悉Python语法。程序使用Python3 写的,代码150行左右
- 1.VUE验证邮箱export const isEmail = (s) => { return /^([a-
- 准备在以后制作的网站中尝试一些变化,比如:先提交内容,后提示注册/登陆。感觉这样可以绑架更多用户……不想注册再发言?那就先让你上钩发言,然后