一、python操作MySQL
导入第三方模块:pymysql
操作步骤(文字描述):
1. 先链接MySQL
host,port,username,password,charset,库,autocommit等
2. 在python中书写SQL语句
3. 开始执行SQL语句,拿到结果
4. 在python中做处理(对数据做进一步处理)
代码实现:
# 1. 链接mysql con=mysql.connect( host='127.0.0.1', port='3306', user='root', password='1234', charset='utf8', db='db5', autocommit=True ) # 2. 获取光标 cursor=con.cursor() # 3. 写SQL语句 sql = 'select*from class' # 4. 执行SQL语句 e = sursor.execute(sql) # 5. 打印SQL语句结果 res = cursor.fetchone() # fetchone拿到第一条数据 print(res) res1 = cursor.fetchall() # fetchall拿到全部数据 print(res1) res2 = cursor.fetchmany(2) # fetchmany(2)拿到前两条数据 print(res2)
二、SQL注入问题
1. SQL注入原因:
是由于特殊符号的组合会产生特殊的效果
2. 结论:设计到敏感数据部分,不要自己拼接,交给线程的方法(execute)拼接即可
3. 注意事项:
在使用代码进行数据操作时,不同操作的级别是不一样的,查无所谓,针对增,改,删都需要二次确认 ------conn.commit(),还可以在连接mysql时autocommit=True,加了这句后,以后就不用再写conn.commit()了
三、视图
1 、什么是视图
视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用
2、为什么要用视图
如果要频繁的使用一张虚拟表,可以不用重复写SQL语句查询
3、如何用视图
用法:create view 视图名 as 查询的SQL语句
create view info as select*from teacher inner join course on teacher.tid=course.teacher_id;
创建好了之后,验证它的存在Navicat验证,cmd终端验证,最后文件验证,
结论:视图只有表结构数据还是来源于之前的表
删除视图:drop view 视图名;
视图只有表结构文件,没有表数据文件
视图一般用于查询,不要轻易修改视图中的数据
四、触发器
1、什么是触发器
在满足对某张表数据的增,删,该的情况下,自动触发的功能称之为触发器
2、为何要使用触发器
触发器专门针对我们对某一张表数据增insert、删delete、改update的行为,这类语法一旦执行就会触发触发器的执行,即自动运行另外一段SQL代码
3、创建触发器语法
语法结构:
create trigger 触发器的名字 before/after/ insert/update/delete on 表名 for each row
begin
sql语句
end
代码演示:
# 针对插入
create tigger tri_after_insert_t1 after insert on 表名 for each row
begin
sql代码
end
# 针对删除
create trigger tri_after_delete_t1 delete on 表名 for each row
begin
sql代码
end
# 针对修改
create trigger tri_after_update_t1 after update on 表名 for each row
begin
sql代码
end
注意事项:
在书写SQL代码的是否结束符是;而整个触发器的结束也需要分号,这就会出现语法冲突,我们需要临时修改结束符号 delimiter 修改的符号(delimiter $$) 该语法只在当前窗口有效
五、事务
1、什么是事务
开启一个事务可以包含一些SQL语句,这些SQL语句要么同时成功要么同时失败
2、事务的作用
保证了对数据操作的数据安全性
3、事务的四个属性
1. 原子性:一个事务是一个不可分割的工作单位,事务中包括的诸多操作要么都做要么都不做
2. 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态,一致性和原子性是密切相关的
3. 隔离性:一个事务的执行不能被其他事物干扰。即一个事务内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事物之间不能有干扰
4. 持久性:持久性也称永久性,指一个失误事物一旦提交,它对数据库中的数据的改变就是永久性的,接下来的其他操作或故障就不应该对其有任何影响
4、如何使用
'''
事物的3个关键字:
starttransaction;
commit
rollback
'''
create table t1(
id int primary key auto_increment,
name char(32),
balance int
);
insert into t1(name,balance) values('jason',1000),('engo',1000),('jack',1000);
# 修改数据之前先开启事物
start transaction;
# 修改操作
update t1 set balance=900 where name='jason';
update t1 set balance=900 where name='engo';
update t1 set balance=900 where name='jack';
rollback; # 回滚到上一个状态
# 开启事物之后,只要还没有执行commit操作,数据其实都还没有刷新到硬盘,也就是锁说上线的修改还没成功
commit;
'''开启事物检测完整就执行commit不完整就执行rollback回滚到上一个状态,执行完commit操作之后,就不能在修改了'''
六、存储过程
1、什么是存储过程
存储过程包含了一系列可执行的SQL语句,存储过程存放于MySQL中,通过调用他的名字可以执行它内部的一堆sql,类似python中的自定义函数
2、基本使用
# 前提:存储过程在哪个库下创建的就只能在对应的库下操作
create procedure p1()
begin
select*from user;
end
# 调用
call p1()
# 在python程序中调用
pymysql链接mysql
产生的游表cursor,callproc()
cursor.execute()
# MySQL中提前定义变量:set @变量名=变量值
# 查看变量名:select @变量名
# 调用:call 表名(参数)
七、函数
前提:mysql内置函数只能在sql语句中使用
create table blog(
id int primary key auto_increment,
name varchar(32),
sub_time datatime
);
insert into blog(name,sub_time) values('第1篇','2012-12-11 11:11:11'),('第1篇','2013-10-11 11:11:11'),('第1篇','2014-09-11 11:11:11');
# 将年月日时分秒格式变成年月格式
select data_format(sub_time,"%Y-%m"),count(id) from group by data_format(sub_time,"%Y-%m");
八、索引(重点)
1、什么是索引
索引是一种数据结构,也叫做"键",是存储引擎用于快速找到记录的一种数据结构
索引有:
primary key----------可以加快查询速度,还有约束作用
unique key-----------可以加快查询速度,还有约束作用
index key-------------可以加快查询速度,没有约束作用
2、索引的本质
就通过不断的缩小搜索的范围,来筛选出最终想要的结果,同时把随机事件变成顺序事件,也就是说有了这种索引机制,我们可以总使用同一种查找方式来锁定数据
3、索引的影响
1. 在表中有大量数据的前提下,创建索引的速度会很慢(建表的时候,如果明显需要索引就提前加上)
2. 在索引创建完毕后,对表的查询性能会大幅度提升,但是写的性能会降低
b + 树
叶子节点存放真实数据,树干和树枝节点存放的是虚拟数据
4、聚集索引(primay key)
聚集索引其实指的就是表的主键
特点:叶子结点放的一条条完整的记录
5、辅助索引(unique key index key)
辅助索引:查询数据的时候不可能都是用id作为筛选条件,也可能会用name,password等字段信息,那么这个时候就无法利用聚集索引的加速查询效果。就需要给其它字段建立索引,这些索引就是辅助索引
特点:叶子结点存放的是辅助索引字段对应的那条记录的主键的值
select name from user where name='jack';
上述语句叫覆盖索引:只在辅助索引的叶子结点中就已经找到了所有我们想要的数据
select age from user where name='jack';
上述语句叫非覆盖索引,虽然查询的时候命中了索引字段name,但是要查的是age字段,所以还需要利用主键查找