> 文章列表 > 12-mysql数据库(3)

12-mysql数据库(3)

12-mysql数据库(3)

mysql数据库(3)

1 数据库的备份与还原

1.1 备份的目的

  • 做灾难恢复:对损坏的数据进行恢复和还原
  • 需求改变:因需求改变而需要把数据还原到改变以前测试(测试新功能是否可用)

1.2 备份命令

示例:

mysqldump -uroot -p123456 db7 > D:\\a.sql

1.3 直接在sqlyog备份

第一步:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07J0iytr-1681261770809)(imgs\\Dingtalk_20230404151124.jpg)]

第二步:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCkFixau-1681261770810)(imgs\\企业微信截图_20230404151347.png)]

1.4 还原

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URHLwJck-1681261770811)(imgs\\Dingtalk_20230404151513.jpg)]

2 事务安全

事务:transaction,一系列要发生的连续的操作。

事务安全:一种保护连续操作的机制。

事务安全的意义:保证数据操作的完整性。

2.1 事务的特点

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

2.2 事务控制语句

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;
  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

2.3 事务处理

用 BEGIN,ROLLBACK,COMMIT来实现:

  • BEGIN开始一个事务
  • ROLLBACK事务回滚
  • COMMIT事务确认

python中使用pymysql实现事务:

import pymysql
con = pymysql.connect(host='localhost',port=3306,user='root',password='123456',db='db6'
)cur = con.cursor()try:sql1 = 'INSERT INTO USER VALUE (NULL, "小明", 30);'sql2 = 'INSERT INTO USER VALUE (NULL, "小红", 40);'sql3 = 'INSERT INTO USER VALUE (NULL, "小刚", 50);'cur.execute(sql1)cur.execute(sql2)cur.execute(sql3)con.commit()print("完成")except Exception as e:print('出现异常')con.rollback()sql4 = "SELECT * FROM USER;"
cur.execute(sql4)
aaa = cur.fetchall()for i in aaa:print(i)cur.close()   #关闭游标
con.close()   #关闭连接

3 mysql数据库函数的使用

MySQL中的函数主要分为以下四类:字符串函数、数值函数、日期函数、流程函数。

3.1 字符串函数

mysql中内置了很多字符串函数,常用的几个如下:

函数 功能
CONCAT(S1,S2,…Sn) 字符串拼接,将S1,S2,… Sn拼接成一个字符串
LOWER(str) 将字符串str全部转为小写
UPPER(str) 将字符串str全部转为大写
LPAD(str,n,pad) 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad) 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str) 去掉字符串头部和尾部的空格
SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串

演示如下:

  • concat:字符串拼接

    select concat('Hello' , ' MySQL');
    
  • lower : 全部转小写

select lower('Hello');
  • upper : 全部转大写

    select upper('Hello');
    
  • lpad : 左填充

    select lpad('01', 5, '-');
    
  • rpad : 右填充

    select rpad('01', 5, '-');
    
  • trim : 去除空格

    select trim(' Hello MySQL ');
    
  • substring : 截取子字符串

    select substring('Hello MySQL',1,5);
    

案例:

由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员
工的工号应该为00001。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HIqy14Wq-1681261770812)(imgs\\企业微信截图_20230404171408.png)]

update emp set workno = lpad(workno, 5, '0');

处理完毕之后,具体的数据为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5lK46FEg-1681261770813)(imgs\\企业微信截图_20230404171618.png)]

3.2 数值函数

常见的函数如下:

函数 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x,y) 返回x/y的模
RAND() 返回0~1内的随机数
ROUND(x,y) 求参数x的四舍五入的值,保留y位小数

演示如下:

  • ceil:向上取整

    select ceil(1.1);
    
  • floor:向下取整

    select floor(1.9);
    
  • mod:取模

    select mod(7,4);
    
  • rand:获取随机数

    select rand();
    
  • round:四舍五入

    select round(2.344,2);
    

案例:

通过数据库的函数,生成一个六位数的随机验证码。

思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础
上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0

select lpad(round(rand()*1000000 , 0), 6, '0');

3.3 日期函数

常见的日期函数如下:

函数 功能
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前日期和时间
YEAR(date) 获取指定date的年份
MONTH(date) 获取指定date的月份
DAY(date) 获取指定date的日期
DATE_ADD(date, INTERVAL exprtype) 返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2) 返回起始时间date1 和 结束时间date2之间的天数

演示如下:

  • curdate:当前日期

    select curdate();
    
  • curtime:当前时间

    select curtime();
    
  • now:当前日期和时间

    select now();
    
  • YEAR , MONTH , DAY:当前年、月、日

    select YEAR(now());
    select MONTH(now());
    select DAY(now());
    
  • date_add:增加指定的时间间隔

    select date_add(now(), INTERVAL 70 YEAR );
    
  • datediff:获取两个日期相差的天数

    aselect datediff('2021-10-01', '2021-12-01');a
    

案例:

查询所有员工的入职天数,并根据入职天数倒序排序。

思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。

# 数据库准备
CREATE TABLE t_emp(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(22) NOT NULL,age INT(10)  NOT NULL,entrydate DATE NOT NULL
)INSERT INTO t_emp VALUE (NULL, "张三", 20, "2023-01-03");
INSERT INTO t_emp VALUE (NULL, "李四", 30, "2023-01-05");
INSERT INTO t_emp VALUE (NULL, "王五", 40, "2023-01-07");
INSERT INTO t_emp VALUE (NULL, "赵六", 50, "2023-01-09");# 查询语句
select name, datediff(curdate(), entrydate) as 'entrydays' 
from emp 
order by entrydays desc;

3.4 流程函数

流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

函数 功能
IF(value , t , f) 如果value为true,则返回t,否则返回f
IFNULL(value1 , value2) 如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [res1] …ELSE [ default ] END 如果val1为true,返回res1,… 否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [res1] … ELSE [ default ] END 如果expr的值等于val1,返回res1,… 否则返回default默认值
  • if

    select if(false, 'Ok', 'Error');
    
  • ifnull

    select ifnull('Ok','Default');
    select ifnull('','Default');
    select ifnull(null,'Default');
    

案例:

判断学员的成绩是否合格

CREATE TABLE score(id INT COMMENT 'ID',NAME VARCHAR(20) COMMENT '姓名',math INT COMMENT '数学',english INT COMMENT '英语',chinese INT COMMENT '语文'
)INSERT INTO score (id, NAME, math, english, chinese)
VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);SELECTid,NAME,(CASE WHEN math >= 85 THEN '优秀' WHEN math >=60 THEN '及格' ELSE '不及格' END )
'数学',(CASE WHEN english >= 85 THEN '优秀' WHEN english >=60 THEN '及格' ELSE '不及格' END )
'英语',(CASE WHEN chinese >= 85 THEN '优秀' WHEN chinese >=60 THEN '及格' ELSE '不及格' END ) 
'语文'
FROM score;

到此mysql的常见函数我们就学完了。

e’ , 23, 66, 90),
(3, ‘Jack’, 56, 98, 76);

SELECT
id,
NAME,
(CASE WHEN math >= 85 THEN ‘优秀’ WHEN math >=60 THEN ‘及格’ ELSE ‘不及格’ END )
‘数学’,
(CASE WHEN english >= 85 THEN ‘优秀’ WHEN english >=60 THEN ‘及格’ ELSE ‘不及格’ END )
‘英语’,
(CASE WHEN chinese >= 85 THEN ‘优秀’ WHEN chinese >=60 THEN ‘及格’ ELSE ‘不及格’ END )
‘语文’
FROM score;


到此mysql的常见函数我们就学完了。