五、MySQL函数
5.1 常用函数
-- ==================== 常用函数 ========================
-- 数学运算
select abs(-8); -- 绝对值
select ceiling(9.4); -- 向上取整
select floor(9.4); -- 向下取整
select rand(); -- 返回0-1随机数
select sign(-10); -- 判断符号 (0 - 0 - -1 + 1)
-- 字符串函数
select char_length('你猜我有几位');
select concat('我','爱','你们'); -- 拼接字符串
select insert('我爱MySQL',2,2,'你好'); -- 替换
select lower('ABCdef'); -- 小写字母
select upper('ABCdef'); -- 大写字母
select instr('abcdefg','a'); -- 返回索引(第一次出现)
select replace('你好啊,你好','你好','Hello'); -- 替换指定字符串
select substr('abcdefg',4,2); -- (字符串,截取的位置,截取的长度)
select reverse('abc'); -- 反转字符串
-- 时间和日期函数
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();
5.2 聚合函数
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
.... | .... |
-- ============================== 聚合函数 ================================
-- 都能够统计 表中的数据
select count(name) from student; -- count(字段),会忽略所有的null值
select COUNT(1) from student; -- 不会忽略null值
select COUNT(*) from student;
select sum(id) as 总和 from student;
select avg(id) as 平均 from student;
select max(id) as 最大 from student;
select min(id) as 最小 from student;
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'),
(4,'刘大','123456');
-- 加密
update testmd5 set pwd=md5(pwd) where id = 1;
-- 全部加密
update testmd5 set pwd=md5(pwd);
-- 插入的时候加密
insert into testmd5 (id, name, pwd)
values (5,'匿名','123456');
insert into testmd5 (id, name, pwd)
values (6,'匿名2',md5('123456'));
-- 如何校验:将用户传递进来的密码,进行MD5加密,然后比对加密后的值
六、事务
6.1 什么是事务
要么都成功,要么都失败
1、SQL执行 A给B转账 A 1000 ----> 200 B 200
2、SQL执行 B收到A的钱 A 800 -----> B 400
将一组SQL放在一个批次中去执行~
事务原则:ACID原则 原子性,一致性,隔离性,持久性
原子性 (Atomicity)
要么都成功,要么都失败
一致性 (Consistency)
事务前后的数据完整性要保证一致,1000
持久性 (Durability) --- 事务提交
事务一旦提交则不可逆,被持久化到数据库中!
隔离性 (Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,
不能被其他事务的操作数据所干扰事务之间要相互隔离
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。
虚读:
指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
执行事务
-- ========================= 事务 ==========================
-- mysql事务默认开启 自动提交
set autocommit = 0; -- 关闭
set autocommit = 1; -- 开启(默认)
-- 手动处理事务
set autocommit = 0; -- 关闭自动提交
-- 事务开启
start TRANSACTION; -- 开启事务 从这个之后的事务都在同一事务中
-- 提交: 持久化
commit;
-- 回滚: 失败
rollback;
-- 事务结束
set autocommit = 1; -- 开启事务
-- 了解
savepoint 保存点名; -- 设置一个事务的保存点
rollback to savepoint 保存点名; -- 回滚到保存点
release savepoint 保存点名; -- 撤销保存点
模拟场景
-- 模拟转账:事务
set autocommit = 0; -- 关闭自动提交
start transaction; -- 开启一个事务(一组事务)
update account set money = money - 500 where name = '纪烁'; -- 纪烁减500
update account set money = money + 500 where name = '张磊'; -- 张磊加500
commit; -- 提交事务 (事务持久化!)
rollback; -- 回滚事务
set autocommit = 1; -- 恢复默认值