多表插叙的两种方法
#方式1:连表操作
inner join 内连接
left join 左连接
rught join 右连接
union 全连接
#方式2:子查询
将一个sql语句用括号括起来当成一条sql语句的查询条件
python操作mysql
pymysqlm模块(外部模块)
下载执行命名>>>pip3 install pymysql
基本步骤
#1.导入模块
#2.连接mysql服务端
#3.产生游标对象
#4.编写sql语句
#5.发送sql语句
#6.获取sql语句执行之后的结果
pymysql补充说明
1.获取数据
fetchall() 获取所有的结果
fetchone() 和获取结果集的第一个数据
fetchmany() 获取指定数量的结果集
ps:注意三者有类似与文件光标移动的特性
2.增删改查
autocommit = True # 针对对数据的操作(除了查之外)需要确认
conn.commit() # 针对二次确认需要代码确认(加入配置即可)
sql注入问题
#针对sql语句的语法输入
如果直接使用格式化输出来操作sql语句的话可以利用sql语句中的特殊语法来进行恶意操作 例如利用注释符号来讲后面的东西注了
视图
视图就是通过查询得到一张虚拟表 然后保存下来 下次可以直接使用
'''
1.视图的表只能用来查询不能做其他增删改的操作
2.视图尽量少用 会造成混淆
'''
触发器
达到某个条件之后自动触发执行
在Mysql中更加详细的说明是触发器:针对表继续增、删、改操作能够自动触发
'''针对: 增前 增后 删前 删后 改前 改后'''
事务
# 事务的四大特性(ACID)
A:原子性
事务中的各项操作时不可分割的整体 要么同时成功要么同时失败
C:一致性
使数据库从一个一致性状态变到另一个一致性状态
I:隔离性
多个事务之间彼此不干扰
D:持久性(永久性)
指一个事务一旦提交 它对数据库中数据的改变就应该是永久性的
'''事务相关的关键字'''
1.start transaction; #开启事务
2.rollback #回滚
3.commit #提交
4.savepoint #设置节点
# 在sql标准中定义了四种隔离级别
1.read uncommitted(未提交读)
事务中的修改其实没有提交 对其他事务也都是可见的 事务可以读取未提交的数据 这一现象称之为'脏读'
2.read committed(提交读)
大多数数据库系统默认的隔离级别
一个事务从开始直到提交之前所作之前所作的任何修改对其他都是不可见的 这个级别也叫'不可重复读'
3.repeatable read(可重复读) #mysql默认隔离级别
可以有效的解决'脏读' 但是无法解决'幻读';
幻读:指的是当某个事务在读取某个范围内的记录时另一个事务又在该范围内插入性的记录,当之前的事务再次读取该范围的记录会产生幻行,innodb和xteadb通过多版本并发控制(mvcc)之前隙锁策略解决该问题
4.serilizable(可串行读)
强制事务串行执行 很少使用该级别
macc只能在read committed(提交读)、repeatable read(可重复读)两种隔离级别下工作 其他两个级别都不兼容
InnoDB的MVCC通过在每行记录后面保存两个隐藏的列来实现MVCC
一个列保存了行的创建时间
一个列保存了行的过期时间(或删除时间) # 本质是系统版本号
没开始一个新的事务版本号都会自动递增 事务开始时刻的系统版本号会作为事务的版本号用来和查询到每行记录版本号进行比较
'''
由此当我们查询一条记录的时候,只有满足以下两个条件的记录才会被显示出来:
1.当前事务id要大于或者等于当前行的create_version值 这表示在事务开始前这行数据已经存在了
2.当前事务id要小于delete_vresion值 这表示在事务开始之后这行记录才被删除
'''
存储过程
可以看成是python中的自定义函数
# 无参函数
delimiter $$ # 改变结束符
create procedure p1() # 创建p1
begin
select * from cmd; # 写入sql语句
end $$ # 结束
delimiter ; # 将结束符号修改回去
# 调用
call p1()
# 有参函数
delimiter $$
create procedure p2(
in m int, # in表示这个参数必须只能是传入不能被返回出去
out res int # out表示这个参数可以被返回出去 还有一个input表示既可以传入也可以被返回出去
)
begin
select * from cmd where id > m;
set res=0; # 用来标志存储过程是否执行
end $$
delimiter ;
# res需要提前被定义
set @res=10; #定义
select @res; #查看
call p1(1,5,@res) #调用
select @res #查看
>>>>不能直接传入 需要传入的是一个变量名 不让改值我们也无法知道
'''
查看存储过程具体信息
show crete procedure pro1;
查看所有的存储过程
show procedure status;
删除存储过程
drop procedure pro1;
'''
# 大前提:存储过程只能在产生的库下使用
# 1.直接在mysql中调用
set @res=10 # 一定需要先定义
call p1(2,4,10); # 报错 修改了10的数据没有意义 无法查询
call p1(2,4,@res);
# 查看结果
select @res;
# 2.在python程序中调用
pymysql链接mysql
产生的游标cursor.callproc('p1',(2,4,10))
# 内部原理 @_p1_0=2,@_p1_1=4,@_p1_2=10;
cursor.excute('select @_p1_2;')
函数
可以看成是python中的内置函数
'ps:可以通过help 函数名 查看帮助信息'
# 1.溢出指定字符
Trim、LTrim、RTrim
# 2.大小写转换
Lower、Upper
# 3.获取左右起始指定个数字符
Left、Right
# 4.返回读音接近的(只针对英文)
Soundex
# 5.日期格式
data_format
流程控制
# 分支控制
declare i int default 0;
IF i = 1 THEN
select 1;
ELSEIF i = 2 THEN
select 2;
ELSE
select 3;
END IF;
# 循环结构
DECLARE num INT;
set num=0;
WHILE num < 10 DO
select num;
set num = num + 1;
END WHILE;
标签:语句,事务,12,res,p1,sql,select,周报
From: https://www.cnblogs.com/clever-cat/p/16950811.html