06--视图、索引、事务、权限

news/2024/2/29 15:43:00/文章来源:https://blog.csdn.net/weixin_46612641/article/details/135607372

1、视图(view)

1.1 什么是视图

视图是一种根据查询(也就是SELECT表达式)定义的数据库对象,用于获取想要看到和使用的局部数据

视图有时也被成为“虚拟表”。

视图可以被用来从常规表(称为“基表”)或其他视图中查询数据。

相对于从基表中直接获取数据,视图有以下好处:

  • 访问数据变得简单
  • 可被用来对不同用户显示不同的表的内容

用来协助适配表的结构以适应前端现有的应用程序

视图作用:

  • 提高检索效率
  • 隐藏表的实现细节【面向视图检索】

1.2 创建视图

案例:查询工资等级为3级的员工

-- 查询工资等级为3级的员工
select e.*,g3.grade from emp e,(select * from salgrade where grade = 3) g3 where e.sal > g3.losal and e.sal < g3.hisal;-- 创建视图
create view grade3 as select e.*,g3.grade from emp e,(select * from salgrade where grade = 3) g3 where e.sal > g3.losal and e.sal < g3.hisal;select * from grade3;

为什么使用视图?

因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题。

注意:只有DQL语句才能以视图对象的方式创建出来。

对 视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)

可以对视图进行CRUD操作。

1.3 删除视图

-- 删除视图
drop view geade3;
drop view if exists grade3;

2、索引(index)

2.1 索引原理

索引被用来快速找出一个列上某一特定值的记录。

没有索引,MySQL不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。对于一个有序字段,可以运用二分查找(Binary Search),这就是为什么性能能得到本质上的提高。MYISAM引擎和INNODB引擎都是用B+Tree作为索引结构(主键,unique 都会默认的添加索引)

2.2 索引的应用

2.2.1 创建索引

什么时候需要给字段添加索引?

  • 表中该字段中的数据量庞大
  • 经常被检索,经常出现在where子句中的字段
  • 经常被DML操作的字段不建议添加索引
-- 创建索引create index 索引名 on 表名(字段名);-- 创建索引create index stuIndex on stu(age);

2.2.2 查看索引

show index from stu;

2.2.3 删除索引

-- 删除索引drop index stuIndex on stu;alter table stu drop index stuIndex;

2.3 查看SQL语句的执行

explain select name,age from stu where age = 18;

2.4 索引分类

B树索引、普通索引、主键索引、唯一键索引、空间索引、全文索引。

单一索引:给单个字段添加索引

复合索引: 给多个字段联合起来添加1个索引

主键索引:主键上会自动添加索引

唯一索引:有unique约束的字段上会自动添加索引

2.5 索引失效

索引什么时候失效?

select name from stu where name like '%宇%';

模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。

索引作用: 提高查询的效率

一般用于数据量比较大的情况下我们建立索引,如果数据量太小也必要去建立索引

3、事务(transaction)

3.1 事务概述

一个事务是一个完整的业务逻辑单元,不可再分。

事务可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。

事务具有四个特征ACID

特征

介绍

A

原子性(Atomicity)

整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。

C

一致性(Consistency)

在事务开始之前与结束之后,数据库都保持一致状态。

I

隔离性(Isolation)

一个事务不会影响其他事务的运行。

D

持久性(Durability)

在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。

事务中存在一些概念:

a) 事务(Transaction):一批操作(一组DML)

b) 开启事务(Start Transaction)

c) 回滚事务(rollback)

d) 提交事务(commit)

e) 添加保存点(savepoint)

注意:rollback,或者commit后事务就结束了。

只有DML语句支持事务。

3.2 事务的提交与回滚

3.2.1 测试1

1) 创建表

create table user(id int (11) primary key not null auto_increment ,username varchar(30),password varchar(30)
);

2) 查询表中数据

3) 开启事务start transaction;

4) 插入数据

insert into user (username,password) values ('zhangsan','123');

5) 查看数据

7) 修改数据

8) 查看数据

9) 回滚事务

10) 查看数据

3.2.2 测试2

1) 创建表

create table user(id int (11) primary key not null auto_increment ,username varchar(30),password varchar(30)
);

2) 窗口1查询表中数据

3) 窗口2查询表中数据

4) 窗口1开启事务start transaction;

5) 窗口1插入数据

insert into user (username,password) values ('zhangsan','123');

6) 窗口1查看数据

7) 窗口2查看数据

8) 窗口1提交事务

9) 窗口1查看数据

10) 窗口2查看数据

3.3 事务的隔离级别

3.3.1 隔离级别

事务的隔离级别决定了事务之间可见的级别。

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

脏读取(Dirty Read)

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交,这就出现了脏读取。

不可重复读(Non-repeatable Read)

在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。

幻像读(Phantom Read)

幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。

3.3.2 四个隔离级别

InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务:

读未提交(READ UMCOMMITTED)

允许一个事务可以看到其他事务未提交的修改。

读已提交(READ COMMITTED)

允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。

可重复读(REPEATABLE READ)

确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。(银行总账)

该隔离级别为InnoDB的缺省设置。

串行化(SERIALIZABLE)【序列化】

将一个事务与其他事务完全地隔离。

oracle数据库默认的隔离级别是:读已提交。

mysql数据库默认的隔离级别是:可重复读。

3.3.3 隔离级别与一致性问题的关系

隔离级别

脏读数据

不可重复读

幻象读

读未提交

可能

可能

可能

读已提交

不可能

可能

可能

可重复度

不可能

不可能

对InnoDB不可能

串行化

不可能

不可能

不可能

4、用户权限DCL

4.1 新建用户

-- 查询用户
select * from mysql.user;-- 新建用户
create user 'sanshi'@'localhost' identified by '123456';
create user 'sanshi'@'%' identified by '123456';		-- % 代表任意ip

新创建的用户可以登录但是只可以看见一个库 information_schema

4.2 用户授权

命令详解

*.*表示所有数据库下的所有表

%代表任何ip

权限主要包括:

create:创建新的数据库或表

alter:修改数据库的表

drop:删除数据库/表

insert:添加表数据

delete:删除表数据

update:更新表数据

select:查询表数据

index:创建/删除索引

all:允许任何操作

usage:只允许登录

-- 添加权限
grant select on *.* to 'sanshi'@'localhost'; -- 语法
grant 权限1,权限2 on 数据库名.表名 to '用户名'@'ip';

4.3 回收权限

-- 回收权限
revoke select on *.* from 'sanshi'@'localhost';revoke 权限1,权限2 on 数据库名.表名 from 用户;

4.4 删除用户

-- 删除用户
drop user '用户名'@'主机名';-- 删除用户
drop user 'sanshi'@'%' ;

4.5 修改密码

-- 使用以下命令进行修改密码
set password for 'root'@'localhost' = password('abc');-- 修改已登录用户密码
set password=password('新密码');

5、数据导入导出

使用第三方工具

5.1 数据备份--导出

5.2 数据导入

新建数据库

6、数据库三大范式

第一范式:数据库表中不能出现重复记录,每个字段是原子性的不能再分,每一行必须唯一,也就是每个表必须有主键,这是我们数据库设计的最基本要求。

第二范式:是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖

第三范式:建立在第二范式基础上的,非主键字段不能传递依赖于主键字段。(不要产生传递依赖

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。

第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。

7、横表/纵表

7.1 纵表/横表概述

纵表:

纵表

优点:如果现在要给这个表加一个字段,只需要添加一些记录。

缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐。

横表:

横表

优点:一行表示了一个实体记录,清晰可见,一目了然。

缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。

7.2 纵表转横表

有如下纵表

create table proper(student_name varchar(20),course_name varchar(20),score double
);INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('张三', '语文', 67);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('张三', '数学', 78);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('李四', '语文', 90);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('李四', '英语', 89);

将其转为横表

select 
-- 第一列显示的字段
p.student_name,
-- 当course_name的名字是‘语文’,把对应的成绩显示
sum(case p.course_name when '语文' then p.score end ) as 语文, 
sum(case p.course_name when '数学' then p.score end ) as 数学, 
sum(case p.course_name when '英语' then p.score end ) as 英语
from proper p 
-- 对名字进行分组
group by p.student_name

7.3 横表转纵表

有如下横表

create table score_horizontal (student_name varchar(20),chinese varchar(20),math varchar(20),english varchar(20)
);INSERT INTO `score_horizontal`(`student_name`, `chinese`, `math`, `english`) VALUES ('张三', '67', '78', NULL);
INSERT INTO `score_horizontal`(`student_name`, `chinese`, `math`, `english`) VALUES ('李四', '90', NULL, '89');

将其横表转为纵表

select s.student_name,'chinese' as 科目,s.chinese as 成绩
from score_horizontal s
union all 
select s.student_name,'math' as 科目,s.math as 成绩
from score_horizontal s
union all 
select s.student_name,'english' as 科目,s.english as 成绩
from score_horizontal s;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_925781.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s 存储卷和pvc,pv

存储卷---数据卷 容器内的目录和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;deletek8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 一旦回到初始状态&#xff0c;所有的后天编辑的文件的都会消失。 …

PySide6/PyQt6如何设置全局热键,全局热键!

文章目录 📖 介绍 📖🏡 环境 🏡📒 实现方法 📒⚓️ 相关链接 ⚓️📖 介绍 📖 我们在使用PySide6/PyQt6设置热键的时候一般都是使用QShortcut,、QKeySequence两个类来实现,但是这样写的快键键并不是全局快捷键,需要用户激活软件窗口才能实现快捷键对应的功能,…

【面试合集】说说微信小程序的发布流程?

面试官&#xff1a;说说微信小程序的发布流程&#xff1f; 一、背景 在中大型的公司里&#xff0c;人员的分工非常仔细&#xff0c;一般会有不同岗位角色的员工同时参与同一个小程序项目。为此&#xff0c;小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团…

数据结构【树+二叉树】

目录 线性表和非线性表 树的概念 树的存储表示 二叉树的概念 特殊二叉树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 本篇我们开始进入数据结构中【树】的学习。 线性表和非线性表 逻辑结构&#xff1a;人想象出来的物理结构&#xf…

css 怎么绘制一个带圆角的渐变色的边框

1&#xff0c;可以写两个样式最外面的div设置一个渐变的背景色。里面的元素使用纯色。但是宽高要比外面元素的小。可以利用里面的元素设置padding这样挡住部分渐变色。漏出来的渐变色就像边框一样。 <div class"cover-wrapper"> <div class"item-cover…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

【软件测试】学习笔记-测试基础架构

这篇文章探讨什么是测试基础架构。 什么是测试基础架构&#xff1f; 测试基础架构指的是&#xff0c;执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此&#xff0c;我们也把测试基础架构称之为广义的测试执行环境。通常来讲&#xff0c;测试基础 架构主要包括…

【PostgreSQL内核学习(二十三)—— 执行器(ExecEndPlan)】

执行器&#xff08;ExecEndPlan&#xff09; 概述ExecEndPlan 函数ExecEndNode 函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用…

压力测试+接口测试(工具jmeter)

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

opencv-4.8.0编译及使用

1 编译 opencv的编译总体来说比较简单&#xff0c;但必须记住一点&#xff1a;opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0&#xff0c;opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后&#xff0c;默认看到的是git分支&…

DC电源模块与AC电源模块的对比分析

DC电源模块与AC电源模块的对比分析 BOSHIDA DC电源模块和AC电源模块是两种常见的电源模块&#xff0c;它们在供电方式、稳定性、适用范围等方面有所不同&#xff0c;下面是它们的对比分析&#xff1a; 1. 供电方式&#xff1a; DC电源模块通过直流电源供电&#xff0c;通常使用…

shiro实战

接下来我将用编码的方式&#xff0c;来演示如何使用shirojwt实现认证并下发token&#xff0c;但是没有整合到springboot中。只是shiro的API的调用 1. shirojwt 实现登录认证、获取资源的流程图 2.编码实现 &#xff08;1&#xff09;工程结构 &#xff08;2&#xff09;核心代…

msvcr110.dll缺失怎么解决,修复msvcr110.dll缺失的方法分享

首先&#xff0c;我们来了解一下msvcr110.dll是什么文件。msvcr110.dll是Microsoft Visual C 2012 Redistributable的一个组件&#xff0c;它包含了许多运行库函数&#xff0c;这些函数在编译和运行使用Visual C编写的程序时是必不可少的。简单来说&#xff0c;msvcr110.dll就是…

Unity解决Udp客户端无法接收数据的问题

Unity解决Udp客户端无法接收数据的问题 在我之前做过的项目中&#xff0c;其中不少涉及Udp客户端的项目。在这些项目中&#xff0c;一般只需要实现客户端向服务器端发送数据的功能就可以了&#xff0c;一般都不用接收服务器端发送的数据&#xff0c;但是也有同学使用了我分享的…

[C#]winform部署官方yolov8-obb旋转框检测的onnx模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-obb&#xff08;You Only Look Once version 8 with Oriented Bounding Boxes&#xff09;是一种先进的对象检测算法&#xff0c;它在传统的Yolov3和Yolov4基础上进行了优化&#xff0c;加…

Next.js 开发指​南(GitHub 115k star​)

Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架&#xff0c;它扩展了最新的 React 特性&#xff0c;集成了基于 Rust 的 JavaScript 工具&#xff0c;可以帮助你快速创建全栈 Web 应用 &#xff08;full-stack Web applications&#xff09; 。 对于有一定 React 基础…

软件测试|使用selenium进行多窗口操作

简介 在我们进行自动化测试的工作中&#xff0c;经常会点击某个元素或者链接就会自动打开一个新页面&#xff0c;需要我们转到新打开的页面去进行操作&#xff0c;这个时候我们就需要能够自动切换到新页面进行后续的操作&#xff0c;selenium同样支持这个功能&#xff0c;本文…

FineBI报表页面大屏小屏自适应显示问题

大屏正常显示 显示正常 小屏BI自适应显示 存在遮挡字体情况 小屏浏览器缩放显示 等比缩放后显示正常

【CV】使用 matplotlib 画统计图,并用 OpenCV 显示静图和动图

1. 效果 静图 动图 2.思路 准备数据使用 pyplot 画统计图图片写入流&#xff0c;流转图&#xff08;numpy&#xff09;matplotlib 颜色 RGB 转 OpenCV 颜色 BRG 4. 静图 代码过程有注释&#xff0c;很简单的实现。注意 matplotlib RGB 转 OpenCV BGR image image[:, :,…

【51单片机系列】proteus仿真单片机的串口通信

本文参考&#xff1a;https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据&#xff0c;并将接收的数据发送出去&#xff0c;利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口&am…