带你了解现行数据库的高级特性和新方法

数据库的高级特性和新方法

  • 数据库的高级操作
    • 数据库事务
    • 用户权限控制
    • 数据的备份与还原
    • Binlog运行日志
    • 数据库的新特性
      • 窗口函数的使用

阅读指南:
本文探讨了数据库的高级特性和新方法,详细介绍了这些高级特性及其操作方式,并涵盖了一些最新的操作方法。如果读者感兴趣,我们将会在后续的数据库教程合集里更新更多高级操作内容,欢迎大家与我们一起学习和讨论。这篇文章是本系列的最后一篇,感谢大家的阅读和支持。
合集链接:
数据库详细基础教程

数据库的高级操作

数据库事务

数据库事务概述:

  • 数据库事务是一套操作数据命令的有序集合,一个不可分割的工作单位。

  • 事务中单个命令不会立刻改变数据库数据,当内部全部的命令都生效且成功时,才算一次成功,如果有任一任务失败,可以进行状态回滚

  • 事务哟事务开始与事务结束之间执行的全部数据库操作组成

事务的作用:

  • 为数据库提供了一个从失败中恢复到正常状态的方法
  • 当对个应用程序在并发访问数据库时,可以有效避免彼此的操作互相干扰

♦️事务的ACID特性:

  1. 原子性(Automicity)

​ 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  1. 一致性(Consistency)

​ 一致性是指事务内部的操作的状态前后一致,即成功则都成功,失败则都失败。

  1. 隔离性(Isolation)

​ 隔离性是指一个事物的执行不能被其他事物干扰,即一个事物内部的操作即使用的数据对并发的其他事务是隔离的,并发实现的各个事务之间都不能相互干扰。

  1. 持久性(Durability)

​ 持久性是指一个事物一旦被提交,他对数据库中数据的改变就是永久性的,后面的操作对其不成影响。

事务的开启,提交,回滚:

前提:

​ MySQL默认情况下是自动提交事务的。

​ 默认每一条语句都是一个独立的事务,一旦成功就提交了。语句失败报错就回滚。

​ 那要将多条语句作为一个事物,有如下方法

方法一:手动提交模式

# 开启手动提交模式,这个模式的生命周期只在一次服务时间内,也就是说,如果关闭了sql服务,则再次打开时需要再一次开启,最好在终端进行操作
SET AUTOCOMMIT = FALSE;
或 
SET AUTOCOMMIT = 0;# 恢复自动提交
SET AUTOCOMMIT = TRUE; 
或 
SET AUTOCOMMIT = 1;# 查看是否自动提交
SHOW VARIABLES LIKE 'AUTOCOMMIT';# 成功 —> 提交,失败 -> 回滚COMMIT;     ROLLBACK;

方法二: 自动提交模式下开启独立事务

START TRANSACTION;	# 开启独立事务..........	# 多个sql命令COMMIT;ROLLBACK;

注:
事务只支持在update,insert,delete这类对数据产生变化的方法中,不支持删表,删库那种操作。

事务的隔离性:

​ 一个书屋内部的操作即使用的数据对并发的其他事物是隔离的,并发执行的各事务之间不能相互干扰

隔离级别概述脏读不可重复读幻读
read-uncommitted读未提交事务数据
read-committed读已提交事务数据(orcle默认)×
repeatable-read可重复度(MySQL默认)××√(小概率)
aseializable串行化和序列化×××

脏读:一个事务读取了另一个事务未提交的数据

不可重复读取:一个事务读取了另一个事务所提交的修改数据,不符合数据的一致性

幻读:一个事务读取了另一个事务新增,删除的记录情况,与实际情况不同。

# 改变隔离级别
SET TRANSACTION_ISOLATION = '隔离级别';# 查看隔离级别
SELEC T@@TRANSACTION_ISOLATION;

注:

隔离等级越高,越安全,但是性能越低。

用户权限控制

​ 授予的权限可分为三个级别:数据库级别,表级别或特定操作上。

创建用户语法:

CREATE USER 'username' @ '服务器ip地址(%代表所有ip)' IDENTIFIED BY 'password';
# username 表示要创建的用户的用户名
# password 表示创建的用户的用户名

赋予权限语法:

# 1. 赋予全部权限
GRANT ALL PRIVIEGES ON 库名(*代表全部).表名(*代表全部) TO 'username' @ '服务器ip地址(%代表所有ip)';
# 2.指定库和权限
GRANT SELECT, INSERT ON 库名.表名 TO 'username' @ '服务器ip地址(%代表所有ip)';

回收权限语法:

# 撤销全部权限
REMOVE ALL PRIVILEGES ON database_name.* FROM 'username' @ 'IP';
# 撤销部分权限
REMOVE SELECT, INSERT,UPDATE ON database_name.table_name FROM 'username' @ 'IP';

查看权限语法:

# 查看权限
SHOW GRANTS FOR 'username' @ 'IP';# 查看有用户列表
SELECT User, Host FROM mysql.user;

删除用户语法:

# 删除用户
DROP USER '用户名';

数据的备份与还原

全量备份

# 备份单库和单表的数据
mysqldump -u username -p database_name 表名>backup.sql# 备份单库和多表
mysqldump -u username -p database_name 表名1 表名2...>backup.sql# 备份单库的所有表
mysqldump -u username -p database_name > backup.sql#-p如果写密码,必须紧贴着
# 以上命令必须在未连mysql的状态下执行(CMD执行)

全量恢复

# 还原数据
mysql -u username -p database_name < backup.sql# 需要提前准备数据库,导入已存在的数据库,同时,数据库的MySQ版本要兼容

Binlog运行日志

​ Binlog日志是一个MySQL的二进制的日志记录,里面记录了数据库所有的增删改查的操作,同时也包括了操作的执行时间,所以,我们可以通过该日志查询误删除数据的恢复,增量复制,主从同步等。

Binlog配置文件的地址

​ 默认在:MySQL服务/my.ini

​ 其中有一部分是

[mysqld]
……
datadir = MySQL服务/Data    # 默认的存储详细Binlog的二进制文件地址
……
log-bin = Binlog的文件名	# 此处Binlog的文件名默认是以电脑名称命名,可以修改

对日志的操作(以下操作在 SQLyog 中使用):

示例:

# 清空原有日志文件
RESET MASTER;# 准备数据,插入数据 --> 00000001日志文件
CREATE DATABASE text_binlog;
USE text_binlog;
CREATE TABLE table_binlog(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL
);
INSERT INTO table_binlog (NAME) VALUES ('二狗子'),('驴蛋蛋');# 重启一个新的日志文件 --> 00000002日志文件
FLUSH LOGS;		# 创建一个新日志# 将删除数据和插入数据植入到第二个日志文件中-->00000002日志文件
DELETE FROM table_binlog WHERE id = 2;	  # 删除驴蛋蛋
INSERT INTO table_binlog(NAME) VALUES('狗剩子');
SELEC *FROM table_binlog;# 查看日志文件目录
SHOW BINARY LOGS;# 查兰某个日志的命令清单
# 语法:
SHOW BINARY EVENTS;		查看第一个日志的清单
SHOW BINARY EVENTS IN '清单名' [FROM pos(具体信息位置) LIMIT OFSET, NUMBER]0; 
# 实例:
SHOW BINARY EVENTS IN 'MY_LOGIN.00000002' FROM 391 LIMIT 1, 3;

CMD下的日志操作:

注:在binlog的文件目录下进行cmd

# 跳过步骤找回数据
mysqlbinlog my-logbin.000001> d:/my_binlog.000001.sql # 将其他的日志完整导出
mysqlbinlog --stop-POSITION=删除命令的开始的pos my-logbin.000002> d:/my_binlog.391.sql # 02日志删除之前
mysqlbinlog --start-POSITION=删除命令的下一个命令开始pos my-logbin.000002> d:/my_binlog.441.sql # 02日志删除之后

数据库的新特性

窗口函数的使用

窗口函数:

  • 序号函数: row_number()

  • 序号函数: rank()

  • 序号函数: dense_rank()

  • 分步函数: PERCENT_RANK()

    (rank - 1) 1 / (rows - 1)

  • 前后函数: LAG(expr,n)

    LAG(expr,n)函数返回当前行的前n行的expr的值。

  • 首尾函数: FIRST_VALUE(expr)

    FIRST_VALUE(expr)函数返回第一个expr的值。

示例:

数据的准备

CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,category_id INT,category VARCHAR(15),NAME VARCHAR(30),price DECIMAL(10,2),stock INT,upper_time DATETIME
);INSERT INTO goods(category_id,category,NAME,price,stock,upper_time)
VALUES
(1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '卫衣', 89.90, 1500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '牛仔裤', 89.90, 3500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00'),
(2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'),
(2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'),
(2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
(2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'),
(2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'),
(2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');

使用聚合函数的方式

# 聚合函数也是窗口函数 [理解]
# 查询所有的商品编号,价格,和类别名以及整体平均价格SELECT id , NAME ,price, category , AVG(price) OVER () FROM goods;SELECT id , NAME , price , category , AVG(price) OVER() FROM goods ;# 查询所有的商品编号,价格,和类别名以及类别平均价格
SELECT id , NAME ,price, category , AVG(price) OVER (PARTITION BY category) FROM goods;SELECT id , NAME , price , category , AVG(price) OVER(PARTITION BY category_id) FROM goods ;

使用窗口函数:

# 查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。
SELECT ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) AS num,id , category , NAME ,price FROM goods;SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, id,category_id, category, NAME, price, stock FROM goods;
# 窗口函数 over (partition by 分组 order by 排序 )# 查询 goods 数据表中每个商品分类下价格最高的3种商品信息。
SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, 
id, category_id, category, NAME, price, stock FROM goods) tWHERE row_num <= 3;# 使用RANK()函数获取 goods 数据表中各类别的价格从高到低排序的各商品信息。
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id, category_id, category, NAME, price, stockFROM goods;# 使用RANK()函数获取 goods 数据表中类别为“女装/女士精品”的价格最高的4款商品信息SELECT * FROM(SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,id, category_id, category, NAME, price, stockFROM goods) tWHERE category_id = 1 AND row_num <= 4;# 使用DENSE_RANK()函数获取 goods 数据表中各类别的价格从高到低排序的各商品信息。
SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num, id, category_id, category, NAME, price, stock  FROM goods;# 使用DENSE_RANK()函数获取 goods 数据表中类别为“女装/女士精品”的价格最高的4款商品信息。
SELECT * FROM( SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,  id, category_id, category, NAME, price, stock FROM goods) t WHERE category_id = 1 AND row_num <= 3;# 计算 goods 数据表中名称为“女装/女士精品”的类别下的商品的PERCENT_RANK值。
# 写法一:
SELECT RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS r,PERCENT_RANK() 
OVER (PARTITION BY category_id ORDER BY price DESC) AS pr,id, category_id, category, 
NAME, price, stock FROM goods WHERE category_id = 1;# 写法二:
SELECT RANK() OVER w AS r,PERCENT_RANK() OVER w AS pr,id, category_id, category, NAME, price, stockFROM goodsWHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price DESC);# 查询goods数据表中前一个商品价格与当前商品价格的差值。
SELECT id, category, NAME, price, pre_price, price - pre_price AS diff_priceFROM (SELECT  id, category, NAME, price,LAG(price,1) OVER w AS pre_price FROM goodsWINDOW w AS (PARTITION BY category_id ORDER BY price)) t;# 按照价格排序,查询第1个商品的价格信息。
SELECT id, category, NAME, price, stock,FIRST_VALUE(price) OVER w AS first_priceFROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);

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

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

相关文章

客户案例|某 SaaS 企业租户敏感数据保护实践

近年来&#xff0c;随着云计算技术的快速发展&#xff0c;软件即服务&#xff08;SaaS&#xff09;在各行业的应用逐渐增多&#xff0c;SaaS 应用给企业数字化发展带来了便捷性、成本效益与可访问性&#xff0c;同时也带来了一系列数据安全风险。作为 SaaS 产品运营服务商&…

韩国锂电池工厂火灾:行业安全警钟再次敲响

三天前&#xff0c;6月24日上午&#xff0c;韩国京畿道华城市一电池厂突发火灾&#xff0c;造成严重人员伤亡&#xff0c;其中包括多名中国籍员工。这一事件不仅令人痛心&#xff0c;更为全球锂电池行业安全敲响了警钟。 事发当天&#xff0c;电池厂内堆放锂电池成品的区域突然…

TypeError: %c requires int or char

踩坑&#xff1a;在用python写脚本查询sql数据时&#xff0c;使用%s来替换sql语句里的变量&#xff0c;结果一直报&#xff0c;而其他sql使用同样的方法正常&#xff0c;最后发现是因为sql语句里有模糊查询 like "%测试%"&#xff0c;这里的%被误以为%s&#xff0c;解…

Mendix 创客访谈录|Mendix开发制造业客户复杂应用的强大实力

本期创客 郑立 Eviden中国低代码服务团队负责人 大家好&#xff0c;我是郑立&#xff0c;目前担任Eviden中国低代码服务团队的负责人&#xff0c;Mendix是Eviden中国在低代码领域的最重要的合作伙伴&#xff0c;目前我们在多个制造业客户中推广和实施Mendix低代码项目&#xff…

[MQTT]Mosquitto的權限管理_使用者/密碼(pwfile)和訪問控制清單(aclfile)

延續Mosquitto的內網連接(intranet)和使用者/密碼權限設置文章&#xff0c;經解讀mosquitto官網文檔&#xff0c;在權限管理部分&#xff0c;除了設置使用者/密碼(pwfile)之外&#xff0c;還有訪問控制清單(Access Control List, aclfile)可以設置。經過測試&#xff0c;同時設…

Linux 中变量的取用与设定

优质博文&#xff1a;IT-BLOG-CN Linux是一个多人多任务的环境&#xff0c;每个人登录系统都能取得一个bash shell&#xff0c;每个人都能够使用bash下达mail这个指令来接收自己的邮箱等等。问题是&#xff0c;bash如何得知你的邮箱是那个文件&#xff1f;这就需要『变量』的帮…

【ubuntu noble】docker 容器无法使用 nvidia gpu

运行ai模型的时候提示 no GPU available 执行 nvidia-smi 提示 Failed to initialize NVML: Unknown Error 解决方案 一. 宿主机执行sudo docker info&#xff0c;确保 runtime 字段中有 nvidia 字样 Runtimes: nvidia runc io.containerd.runc.v2 Default Runtime: runc 注…

从0开始学习pyspark--pyspark的核心概念[第0节]

在学习 PySpark时会遇到很多新的关键词,理解这些概念,对我们学习PySpark有极大的帮助,以下是一些PySpark的关键概念及其详细解释&#xff1a; 1. PySpark PySpark是Apache Spark的Python API。Spark是一个用于大规模数据处理的开源分布式计算系统&#xff0c;支持内存计算和基…

基于Java的宠物领养管理系统【附源码】

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;宠物管理系统利用计算机网络实现信息化管理&#xff0c;使整个宠物领养的发展和服务水平有显著提升。 本文拟采用IDEA开发工具…

《分析模式》漫谈07-怎样把一张图从不严谨改到严谨

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 下图是《分析模式》原书第2章的图2.10&#xff0c;里面有一些错误和考虑不周的地方&#xff1a; 2004中译本和2020中译本的翻译如下&#xff1a; 基本上都是照搬&#xff0c;没有改过…

【02-02】SpringMVC基于注解的应用

一、请求处理 1、常用注解 RequestMapping 作用&#xff1a;用来匹配客户端发送的请求&#xff08;用来处理URL映射&#xff0c;将请求映射到处理方法中&#xff09;&#xff0c;可以在类或者方法上使用。 用在类上&#xff0c;可以将请求模块化&#xff0c;避免请求方法中的…

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…

【小红书标题打造】规则+底层逻辑解析|辅助工具|爆款必备

前言 大家好&#xff0c;我是一名自媒体工具人&#xff0c;今天不是教大家去自己写标题&#xff08;现在这个时代自己写真没必要&#xff09;而是教大家了解爆款标题的相关知识以及辨别。后面会附赠 安装此文规则生成标题的输出工具。在这个工具发展庞大的时代&#xff0c;如果…

【知识图谱系列】一步步指导:安装与配置JDK和Neo4j的完美搭配

本文将提供详细的步骤&#xff0c;介绍如何下载、安装和配置Java开发工具包&#xff08;JDK&#xff09;以及流行的图形数据库Neo4j。将从选择合适的JDK版本开始&#xff0c;然后是下载和配置环境变量&#xff0c;接着以同样的方式处理Neo4j。最后&#xff0c;会通过一些检查步…

Windows应急响应靶机 - Web3

一、靶机介绍 应急响应靶机训练-Web3 前景需要&#xff1a;小苕在省护值守中&#xff0c;在灵机一动情况下把设备停掉了&#xff0c;甲方问&#xff1a;为什么要停设备&#xff1f;小苕说&#xff1a;我第六感告诉我&#xff0c;这机器可能被黑了。 这是他的服务器&#xff…

【CSS in Depth 2 精译】1.6 本章小结

1.6 本章小结 浏览器遵循层叠规则来确定哪些样式在哪些元素上生效&#xff1b;选择器优先级由选择器中的 id 数、class 类的个数以及标签名的个数来共同确定。优先级更高的声明将覆盖较低声明&#xff1b;当某些属性没有层叠值时&#xff0c;它们会从父元素继承一个样式值。这…

YouCompleteMe插件安装方法简述

一、前言 YouCompleteMe是VIM中进行C/C 开发的重要工具&#xff0c;可以极大提升linux下C/C开发效率。 YCM需要高版本的gcc (8.0以上版本&#xff0c;支持C17) 和 vim&#xff08;8.0以上&#xff0c;支持python3.6以上&#xff09; 二、编译gcc_8.3 1. 获取源码 wget https:…

Shopee API接口——获取商家店铺商品列表

一、引言 在跨境电商领域&#xff0c;Shopee作为东南亚地区领先的电商平台&#xff0c;为众多商家提供了广阔的市场和丰富的销售机会。本文将详细介绍如何通过Shopee API获取商家店铺商品列表&#xff0c;并探讨其应用场景。 二、核心功能介绍 Shopee API获取商家店铺商品列…

HarmonyOS NEXT Developer Beta1中的Kit

从HarmonyOS NEXT Developer Preview1&#xff08;API 11&#xff09;版本开始&#xff0c;HarmonyOS SDK以Kit维度提供丰富、完备的开放能力&#xff0c;涵盖应用框架、系统、媒体、图形、应用服务、AI六大领域&#xff0c;例如&#xff1a; 应用框架相关Kit开放能力&#xff…

转行大数据开发:知识、能力及学习路线详解

引言 随着数据量的爆炸性增长&#xff0c;大数据开发已经成为IT行业中的热门职业。对于希望转行进入大数据开发领域的专业人士来说&#xff0c;了解需要掌握的知识和技能&#xff0c;并制定清晰的学习路线至关重要。本文将详细解析转行大数据开发所需的知识体系、能力要求及学…