23.事务
1)事务:可以认为是做一件事情 需要多个SQL 要么同时成功 要么同时失败
需求:银行转账
update 你的账户 把你的钱减少
update 你朋友的账户 把他的钱增多
这两个SQL不能只成功一个 要么都成功 要么都失败
那么 我们就需要用到事务了 它可以把多个SQL放到一起执行
实现:显式事务 隐式事务
区别:边界
显式事务:
有明显的开始 边界从begin开始 以commit or rollback结束
后面再写要重新begin
隐式事务:
上一个事务的结束 就是上一个事务的开始
设置语句后 从你写update insert delete开始就是事务的开始
写commit or rollback结束后面再写insert等SQL命令又是新的事务开始了
显式事务
begin;
sql1;
sql2;
sql3;
commit;(成功) or rollback;(恢复到原来的状态)
隐式事务(没有明显的写begin)
set autocommit=0; 禁止自动提交 需要输入commit完成事务
update emp set sal=sal-1000 where empno=1003;
update emp set sal=sal+1000 where empno=1006;
commit;or rollback;
set autocommit=1; 允许自动提交
update emp set sal=sal-1000 where empno=1003;
这时自动commit了 rollback不起作用了
每条单独的语句都是一个事务
隐式事务 set autocommit=0 禁止自动提交
2)事务的特点:
原子性(automic)SQL命令要么成功都成功 要么都失败
一致性(consistency)事务开始前和结束后是平衡的 一致的
隔离性(isolation)两个事务之间互不干涉 各自做各自的 一个事务不能干涉另一个事务的进行
示例:
set autocommit=0;
for update 加锁
直到commit 或 rollback 以后 解除锁 另一个事务才可以运行成功
select * from emp for update; 等待更新
我们再打开一个SQL
对emp表作事务操作 发现不能操作
update emp set sal=sal+1000 where empno=1006;
持久性(duryblity)commit之后永远不会发生改变了 rollback后也永远不会发生改变了
3)for update 加锁
只有加锁的事务commit 或 rollback以后 释放锁 另一个事务才会执行成功
24.MySQL底层
客户端:SQL命令
线程:处理多任务 处理多个连接客户端的任务
存储引擎:将数据存到表中 如果有索引 将会存到树中
查询缓存:提高查询速度 将之前的查询结果存到SQL中了
SQL优化:硬件 内存 建立索引(重复少的)三范式建表
explain:衡量SQL语句的好坏的工具
B树和B+树的区别-CSDN博客
25.存储引擎
1)innodb
MySQL默认的存储引擎 我们以前创建的表都是这种存储引擎
特点:
a.用一个文件存储索引和数据
b.支持事务
c.支持普通索引
d.在默认情况下 不支持全文索引(但做了处理 可以支持全文索引)
2)myisam
特点:
a.用三个文件存储数据 说明增删改速度慢 查询快(限制不严格)
b.不支持事务
c.支持全文索引
d.数据和索引分开存储
3)memory
4)blackhole
查看mysql数据库的存储地方
show variables like '%datadir%';
26.开发当中不想使用root用户(目前为止我们一直在用root用户)
自己创建用户:
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
CREATE USER 'jiehaowen'@'localhost' IDENTIFIED BY '123456';
创建完成后授权:操作MySQL 增删改查.......
grant all privileges 所有权限
on *.* 哪个表哪个库
to
'用户名'@'localhost'
grant all privileges on *.* to 'jiehaowen'@'localhost';
那么我们怎么使用呢 用管理员身份运行cmd 进入到下面的目录下
cd C:\Program Files\MySQL\MySQL Server 5.7\bin
mysql -ujiehaowen -p123456
28.一些函数
1)date_format 把日期转换成符合格式的日期 '%Y-%m-%d %h:%i:%s'
创建log表
create table log(log_id bigint primary key,log_dt varchar(90),u_id bigint);
插入数据
insert into log values(1,'2024-03-04 12:12:12',1);
insert into log values(2,'2024-03-04 15:13:12',1);
insert into log values(3,'2024-03-05 16:13:12',2);
查询2023-03-04的记录 怎么查?
1.使用百分号%xxx%
2.如果必须用等号 应该怎么办呢 使用相应的函数
select * from log where dat_foemat(log_dt,'%Y-%m-%d')='2023-03-04';
显示年月日
select date_format(log_dt,'%Y-%m-%d') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
显示年月
select date_format(log_dt,'%Y-%m') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
显示年
select date_format(log_dt,'%Y') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
显示小时
select date_format(log_dt,'%Y-%m-%d %h') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
2)date_add()
查询2024-03-05的用户数/2024-03-04的用户数 (环比)
select a.user_cnt/b.user_cnt
from
4号用户数
(
select count(distinct(u_id)) user_cn from log where date_format(log_dt,'%Y-%m-%d')=date_add('2024-03-05',interval-1 day);
) a,
5号用户数
(
select count(distinct(u_id)) user_cn from log where date_format(log_dt,'%Y-%m-%d')='2024-03-05';
) b;
笛卡尔积 一般不用 结果都是一条记录时可用
那么我们设置的这个日期是死的 怎么让他变成活得呢 可以将两个日期写成一个 然后使用
date_add('2024-03-05',interval-1 day); (环比)
date_add('2024-03-05',interval-1 month); (同比)