MySQL 笔记6 -- 函数与事务

MySQL 笔记6 – 函数与事务


MySQL 系列笔记是笔者学习、实践MySQL数据库的笔记

课程链接: MySQL 数据库基础入门教程
参考文档:
MySQL 官方文档
SQL 教程


一、内置函数


1、函数

  • 事先编写的实现某些功能的代码集合,可以直接调用
  • 函数可以用在SELECT语句及其子句,也可以用在UPDATE,DELETE语句当中
  • 格式:SELECT 函数
  • 函数分类:字符串函数、数值函数、日期和时间函数、流程函数、其它函数

2、字符串函数

函数说明
COMCAT(s1,s2…sn)将传入的字符连接成一个字符串,任何字符串与null进行连接结果都是null
INSERT(str,x,y,instr)将字符串str从x(从1开始)位置开始,y个字符长的子串替换为instr
LOWER(Str)/UPPER(str)将字符串转成小/大写
LEFT(str,x)/RIGHT(str,x)返回字符串最左/右边的x个字符,x=null 不返回任何字符
LPAD(str,n,pad)/RPAD(str,n,pad)用字符串pad对str最左/右边进行填充,直到长度为n个字符
REPEAT(str,x)返回str重复x次的结果
REPLACE(str,a,b)用字符串b替换字符串str中所有出现的字符串a
SUBSTRING(str,x,y)返回字符串str中第x位置起y个字符长度的字符

3、数值函数

函数说明
ABS(x)返回X的绝对值
CEIL(x)小数不为零部分上取整,即向上取最近的整数
FLOOR(x)小数部分下取整,即向下取最近的整数
MOD(X,Y)返回X/Y的模
RAND()返回0-1的随机值
RAND()*n返回0-n的随机值

4、日期和时间函数

函数:

函数说明
CURDATE()返回当前日期,只包含年月日
CURTIME()返回当前时间,只包含时分秒
NOW()返回当前日期和时间,年月日时分秒都包含
UNIX_TIMESTAMP返回当前日期的时间戳
FROM_UNIXTIME(unixtime)将一个时间戳转换成日期
WEEK(DATE)返回当前是一年中的第几周
YEAR(DATE)返回所给日期是那一年
HOUR(TIME)返回当前时间的小时
MINUTE(TIME)返回当前时间的分钟
DATE_FORMAT(date,fmt)按字符串格式化日期date值
DATE_ADD(date,interval expr type)计算日期相加
DATEDIFF(date1,date2)计算两个日期相差的天数

格式化日期的格式符:

  • 用在fmt中,形如’%M%D%Y’
  • 可以在格式符中插入自定义的符号,形如’%M-%D-%Y’
格式符说明
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位

5、流程函数

函数说明
IF(value,t,f)如果value是真,返回t,否则返回f
IFNULL(value1,value2)如果value1不为空,返回value1否者返回value2
CASE WHEN value THEN t ELSE f END当value是真,返回t,否则返回f

6、其它函数

函数说明
DATABASE()返回当前数据库名
VERSION()返回当前数据库版本
USER()返回当前登陆用户名
PASSWORD(STR)对str进行加密
MD5()返回str的MD5值

二、自定义函数


1、修改命令结束符

  • 格式:DELIMITER x,将标准分隔符 ; 更改为自定义的 x
  • 因为定义函数时,函数是作为一个整体的,而函数内是多条单独的语句。为了不让让mysql遇到 ;号就解释语句,需要在定义函数开头修改分隔符,完成后把分隔符还原为 ;

2、自定义函数

DELIMITER 自定义分隔符
CREATE FUNCTION 函数名() RETURNS 数据类型
begin
语句1;
语句2;
....
return 和要求的数据类型一样的数据;
end 自定义分隔符
DELIMITER ;
  • 调用自定义函数格式跟内置函数一致

三、事务


1、事务

  • 不可分割的操作,假设某操作有多个步骤组成,其中任意一个步骤操作失败,则认为事务失败,所有步骤全完成该操作才是成功
  • 每条SQL语句都是一个事务,可以把多条SQL语句定义成一个事务
  • 事务只对DML语句有效,对于DQL无效

2、事务的ACID

  • 原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚
  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态,让数据保持一定上的合理,如:一个商品出库时,仓库商品数量减1,对应用户的购物车中商品加1
  • 隔离性(Isolation):当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
  • 持久性(Durability):一个事务一旦被提交了,就不能再回滚了,已经把数据保存到数据库当中了

3、事务的使用

操作语句说明
开启事务start transaction
回滚事务rollback销执行的sql语句,必须在提交事务之前
提交事务commit事务中的所有语句全部执行完毕时提交事务,若没有发生异常,更新到数据库中

在这里插入图片描述


4、事务隔离级别

隔离级别:隔离级别越高,数据的完整性和一致性越好,并发性能越低

级别说明
Read uncommitted(读未提交)未提交事务B修改了数据,事务A读到就是事务B修改的数据;
Read committed(读已提交)未提交事务B修改了数据,事务A读到的数据还是之前的;事务B提交后A读到的数据是B修改后的数据;
Repeatable read(可重复读)未提交事务A开始读取数据后,在提交前读到的数据(select)都是此刻生成的版本,不管事务B是否修改数据是否提交;事务A提交前的insert、update和delete会更新版本为已提交事务B生成的版本;
Serializable(串行)事务串行化顺序执行,事务A执行后才能执行事务B,同时执行会报错;

查看隔离级别:

  • select @@global.tx_isolation,@@tx_isolation;

设置隔离级别:

  • 全局的:set global transaction isolation level 隔离级别;
  • 当前会话: set session transaction isolation level 隔离级别;

5、事务的并发

问题:

问题说明
脏读事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致
幻读未提交事务A查询数据后,已提交事务B刷新了数据库,事务A提交后再查询与上次查询的数据不一致;

各隔离级别会出现的问题:

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed
Repeatable read
Serializable

GOOD LUCK!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值