MySQL进阶二
补充触发器知识
# 删除触发器代码 drop trigger 触发器名; # 当一个学员发生转班,班级对应的总数进行同步变化 # 当一个学员发生转班,班级对应的总数进行同步变化 delimiter !! create trigger movestudent after update on stu1 for each ROW BEGIN #定义两个变量 declare numOld int; # 定义旧班级人数 declare numNew int; # 定义新班级人数 set numOld = (select stu_num from stu2 where class = old.class); select numOld into @a; set numNew = (select stu_num from stu2 where class = new.class); select numNew into @b; update stu2 set stu_num = numOld - 1 where class = old.class; update stu2 set stu_num = numNew + 1 where class = new.class; end !! delimiter; update stu1 set class = 2302 where name = "阿涛"; select @a; select @b; drop trigger movestudent;
1、视图
视图: 是一个虚拟表,内容就是由查询结果定义 视图不是真实的数据,只是一个数据映射 但是视图的结构和真正的表结构是一样 视图作用: 简化高频或者复杂的查询语句 高并发: 数据库也会有并发压力 商品展示查询就要用到视图表 而且还可以起到一个权限 视图表只能查询操作
# 创建视图表 create view 视图名称 as select 已查询语句; # 查询当前数据库所有的视图 create view stu_2301 as select * from stu1 where class = 2301; # 删除视图表 drop view 视图名称; # 查询当前数据库所有视图 # 格式 show full tables in 数据库名称 where table_type like "view"; show full tables in demo924 where table_type like "view";
2、索引
索引:index 就是目录 一般如果你的表查询很多,一般可以用索引进行查询 目的:优化我们的查询速度 1.主键索引 (primary key) 2.普通索引 3.唯一索引
# 在创建表到时候就要创建索引 # 格式 create table 表名( 字段名 数据类型, 字段名 数据类型, # 普通索引 index 索引名称(字段名), # 唯一索引 unique 索引名称(字段名) ); # 以后五次格式报错同学,罚抄10遍格式样式 # 能创建表后插入索引 create index 索引名称 on 表名(字段名); create unique 索引名称 on 表名(字段名); # --------------------------- create table t12( name char(5), index name_index(name) ); insert into t12 values ("守护"), ("秃头"), ("11166", ); # 查询索引 select * from t12 where name = "秃头";
3、存储引擎
其实储存引擎就是mysql如何储存这个数据的 InnoDB 流行储存引擎
SHOW ENGINES;
6、事务(重点)
it 必须学习 事务处理 : 是用来维护数据库的完整性,保证sql语句要么就全部执行,要么全部不执行 事务处理: select,insert, update, delete 语句 事务一旦提交,就不会发生丢失的现象 事务要满足四个条件:原子性, 一致性, 隔离性, 持久性 原子性:一组事务, 所有sql语句要么就全部进行成功,要全部不执行, 之前执行的全部执行回滚 一致性:事务b撤回的数据应该来自事务A,总共两者的总数是一致的 隔离性:各自的事务都是独立运行,一个事务处理后的结果如果影响到其他事务的时候, 其他事务需要先撤回 持久性:事务的持久性(也就永久性)是指一旦事务提交成功了,对数据修久性。 事务隔离级别: 1.读取未提交 事务A和事务B, 事务A没有提交数据,事务B读取到,但是不是持久性的,可以回滚的,这里事务b读取的数据叫"脏数据"。 2.读取已提交 事务A和事务B 事务A要提交后数据,事务B才能读取到 一句话就是我们读取的数据都是数据库真实数据 但是这个隔离导致不可重复读取 就是同一个事务,只能读取一次 这种不会用 3.可重复读取 事务A 和 事务B , 事务A提交的数据,事务b可以重复读取 这种隔离是sql默认隔离级别 4.串行化 事务A和事务B,事务A操作数据库的是,事务b只能排队等待 这种隔离级别很少使用,吞吐量太低,用户体验差
/* 事务还可以分两个大类: 隐性事务和显性事务 隐性事务很简单: 就是insert ,delete, update 都是隐性事务。都是默认提交 显性事务: 可以看出事务过程的,有明显的开始与结束标志, */ # 开始显性事务 begin; insert into t12 values("放屁蹦出诗"); commit; select * from t12; # 开始显性事务 begin; insert into t12 values("放屁蹦出诗"); select * from t12; rollback; commit;
7、pymysql(重点)
使用python 执行mysql的sql语句进行增删改查
pip install pymysql
import pymysql # 开始建立数据库对象 db = pymysql.connect( # host 地址,我们主机地址localhost,或者IP地址127.0.0.1 host="localhost", # 数据库用户名 user="root", # 密码 password="root", # 数据库字符编码 charset="utf8", # 你要用的数据库名称 database="demo924" ) # 创建游标对象(理解为指针),代表该链接的数据库 # cursor专门创建游标 cur = db.cursor() # 这里不需要分号,sql语句不区分大写 sql = "DeSc stu1" # 需要执行sql语句 cur.execute(sql) # 查询返回结果fetchall(), fetchone(), fetchany() # 返回一个嵌套元组 print(cur.fetchall()) # 如何设置显性事务 # 插入多个数据 sql = "insert into stu1(name,class,sex) values (%s, %s ,%s) " values = [ ("xxx6", '2301', "女"), ("xxx7", '2303', "女"), ("xxx8", '2302', "男") ] # 使用多条数据进行结合方法executemany(sql语句, 数据) cur.executemany(sql, values) db.commit()