MySQL函数;事务

5、MySQL函数

官网:https://dev.mysql.com/doc/refman/5.7/en/built-in-function-reference.html

5.1、常用函数

-- ================= 常用函数 ==================================================
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回一个0~1之间的随机数
SELECT SIGN(-1,0,1) -- 判断一个数的符号

-- 字符串函数
SELECT CHAR_LENGTH('即使再小的帆也能远航') -- 字符串长度
SELECT CONCAT('真','想','吃') -- 拼接字符串
SELECT INSERT('我爱编程',1,2,'超级热爱') -- 从某个位置开始替换某个长度
SELECT LOWER('WangTengFei') -- 转小写
SELECT UPPER('WangTengFei') -- 转大写
SELECT INSTR('WangTengFei','e') -- 返回第一次出现的字符串的索引
SELECT REPLACE('坚持就能成功','坚持','努力') -- 替换指定出现的字符串
SELECT SUBSTR('123456789',4,5) -- 返回指定的字符串;(a,b)从第a个开始,返回b个字符串
SELECT REVERSE('坚持就能成功') -- 反转字符串

-- 查询姓 大 的同学,名字皱
SELECT REPLACE(studentname,'小','二') FROM student 
WHERE studentName LIKE'小%'
 
-- 时间和日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前日期和时间
SELECT LOCALTIME() -- 本地时间
SELECT SYSDATE() -- 系统时间

SELECT YEAR(NOW())   -- 年
SELECT MONTH(NOW())  -- 月
SELECT DAY(NOW())    -- 日
SELECT HOUR(NOW())   -- 时
SELECT MINUTE(NOW()) -- 分
SELECT SECOND(NOW()) -- 秒

-- 系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()

5.2、聚合函数(常用)

函数名称描述
COUNT()计数
SUM()求和
AVG()平均值
MAX()最大值
min()最小值
-- =============聚合函数=======================
-- 下面三个都能够统计表中的数据(药查询一个表中有多少条记录 就使用这个 count())
SELECT COUNT(studentname) FROM student -- count(字段),会忽略所有的NULL值
SELECT COUNT(*) FROM result     -- 不会忽略null值
SELECT COUNT(1) FROM `subject`  --  


SELECT SUM(`StudentResult`) AS 总和 FROM `result`
SELECT AVG(`StudentResult`) AS 平均分 FROM `result`
SELECT MAX(`StudentResult`) AS 最高分 FROM `result`
SELECT MIN(`StudentResult`) AS 最低分 FROM `result`

5.3、数据库级别的MD5加密(扩展)

什么是MD5?

主要增强算法复杂度和不可逆性。

MD5 不可逆,具体的值的 MD5 是一样的

MD5 破解网站的原理,背后是一个字典,MD5加密后的值 加密前的值

-- ========= 测试 MD5加密 =======================

CREATE TABLE `testmd5`(
   `id` INT(4) NOT NULL,
   `name` VARCHAR(20) NOT NULL,
   `pwd` VARCHAR(50) NOT NULL,
   PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 明文密码
INSERT INTO `testmd5` VALUES (1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456')
-- 加密
UPDATE `testmd5` SET `pwd` = MD5(pwd) WHERE id = 1
UPDATE `testmd5` SET `pwd` = MD5(pwd) WHERE id != 1
UPDATE `testmd5` SET `pwd` = MD5(pwd) -- 加密全部的密码

-- 插入的时候加密
INSERT INTO `testmd5` VALUES (4,'小明',MD5('123456')) 

-- 如何校验:将用户传递进来的密码,进行md5加密,然后比对加密后的值
SELECT * FROM testmd5 WHERE `name`='小明' AND pwd=MD5('123456') 

相同的密码第一次加密后的密码是相同的

Select 小结

Select:完整语法

SELECT[ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
	[left | right | inner join table_name2] -- 联合查询
	[WHERE ...]		-- 指定结果需满足的条件
	[GROUP BY ...]  -- 指定结果按照哪几个字段来分组
	[HAVING]		-- 过滤分组的记录必须满足的次要条件
	[ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
	[LIMIT {[offset,]rom_count | row_countOFFSET offset}];
	-- 指定查询的记录从哪条至哪条

顺序很重要,要按照上面的顺序

select 去重 要查询的字段 from 表 (注意:表和字段可以取别名)

XXXX join 要连接的表 on 等值判断

where (具体的值,子查询语句)

Group By (通过哪个子段来分组)

Having (过滤分组后的信息,条件和where是一样的,位置不同)

Order By (通过哪个子段排序 升序/降序)

limit (查询起始值,页面大小 ); limit (起始值,pagesize)

6、事务

6.1、什么是事务

要么都成功,要么都失败


就像是银行转账,比如 A 给 B 转账,要满足两个条件才能转账成功,

  1. A的余额减少
  2. B的余额增加

将一组SQL放到一个批次去执行

事务原则:ACID 原则,原子性,一致性,隔离性,持久性 (脏读,幻读)

**参考博客链接:**https://blog.csdn.net/dengjili/article/details/82468576

原子性(Atomicity)

要么都成功,要么都失败

原子性(Atomicity)

事务前后的数据完整性要保证一致。

持久性(Durability)—事务提交

事务一旦提交后则不可逆,被持久化到数据库中

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

隔离所导致的一些问题

脏读:

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

不可重复度:

在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对

虚读(幻读):

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

执行事务

MySQL 是默认开启事务自动提交的

-- ===================== 事务 ==============================

-- MySQL 是默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启(默认的)

-- 手动处理事务
SET autocommit = 0 -- 1.关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的 sql 都在同一个事务内

INSERT xx
INSERT xx

-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK

-- 事务结束
SET autocommit = 1 -- 开启自动提交

-- 了解
SAVEPOINT -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT -- 回滚到保存点
RELEASE SAVEPOINT -- 撤销保存点	

模拟场景

-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci	
USE shop

CREATE TABLE `account`(
   `id` INT(3) NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(30) NOT NULL,
   `money` DECIMAL(9,2) NOT NULL,  -- 九位数,小数点后两位
   PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account(`name`,`money`)
VALUES('A',2000.00),('B',10000.00)

-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务(一组事务)

UPDATE account SET money=money-500 WHERE `name`='A'  -- A减500
UPDATE account SET money=money+500 WHERE `name`='B'  -- B加500

COMMIT;  -- 提交事务,就被持久化了 
ROLLBACK; -- 回滚

SET autocommit = 1; -- 恢复默认值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值