一,视图
什么是视图,本质就是一张虚拟的表,它的数据来自select语句
有什么用?
原表的安全性
功能1,隐藏部分数据,开放指定数据
2,视图可以将查询的结果保存,可以减少书写sql的次数
如何使用?
创建视图
create view 视图名 as select * from 表名; create view test_view as select * from t1;
强调:1,在硬盘中,视图只是表的结构文件,没有表的数据文件
2,视图通常是用于插叙,尽量不要修改视图中的数据
特点;1,每次对视图进行查询,都是执行了as后面的sql语句
2,可以对视图进行修改,修改会同步到原表中
3,视图是永久存储的,存储的不是数据,而是一条as sql语句
二,sql注入问题:
import pymysql # 1,与数据库服务器建立链接 conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) # 2 获取游标对象(用于发送和接收数据) cursor = conn.cursor(pymysql.cursors.DictCursor) # 3,用游标执行sql语句 # 这样输入or 或者'就会使程序只匹配用户名 inp_name = input('用户名>>>:').strip() #inp_user='egon"--hjkhdkhdk' --表示后面的内容全部为注释的 inp_psd = input('密码>>:').strip() #inp_psd = '' sql = 'select * frm user where userword="%s" and password="%s"' %(inp_name,inp_psd) rows = cursor.execute(sql) if rows: print('登录成功') else: print('登录失败') # 5,关闭链接(先关游标,再关链接) cursor.close() conn.close()
# 在服务端防止sql注入问题,不要自己拼接字符串 import pymysql conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) cursor = conn.cursor(pymysql.cursors.DictCursor) inp_name = input('用户名>>>:').strip() #inp_user='egon"--hjkhdkhdk' --表示后面的内容全部为注释的 inp_psd = input('密码>>:').strip() #inp_psd = '' sql = 'select * frm user where userword=%s and password=%s' rows = cursor.execute(sql,(inp_name,inp_psd)) #做字符串的拼接,在拼接的时候自动过滤特殊字符串 # rows = cursor.execute(sql,args=(inp_name,inp_psd)) # 另一种赋值的语句 if rows: print('登录成功') else: print('登录失败') cursor.close() conn.close()
三,事务
什么是事务?
一件事情的完成通常不可能一步到位,需要拆分多个小步骤
那么在Mysql中一组sql语句的集合就是事务
事务的特性:
1,原子性
事务就是一个整体,不可分割
2,隔离性
事务之间要相互隔离,为了维护数据完整性
早并发访问的时候,导致一些问题
1,脏读,一个事务读到了另一个事务未提交的的数据(避免:查询之前要确保所有所有的数据都已经更新完毕了)
2,幻读,一个查询事务没有结束时,数据被另一个事务执行了insert delete
3,不可重复读,一个查询事务没有结束时,数据被另一个事务执行了update
隔离级别:
1,读未提交
2,读已提交
3,可重复读 默认
4,串行化
3,一致性
当事务执行后,所有的数据都是完整的(外键约束 非空约束)
4,持久性
一旦事务提交,数据就永远保存
总结:mysql客户端默认开启就自动提交,一条sql语句就是一个单独的事务
pymysql客户端是默认不提交的,需要手动commit ,意思就是默认开启了事务
四,存储过程
包含一系列可执行的sql语句,存储过程存放于mysql中,通过调用它的名字可以执行其内部的sql语句
三种开发模型:
1,应用程序:只主要开发应用程序的逻辑
mysql:编写好存储过程,以供应用程序调用
优点:开发效率,执行效率都高
缺点:考虑到认为因素,跨部门沟通等问题,会导致扩展性差:
2,应用程序:除了开发应用程序的逻辑,还需要编写原生的sql
优点:比方式一扩展性高(非技术性的)
缺点:1,开发效率,执行效率都不如方式一
2,编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题
3,应用程序:开发应用程序的逻辑,不需要编写原生的sql,基于别人编写好的框架来处理数据
优点:不用编写纯生的sql,这以为着开发效率比方式2高,同时兼容方式二扩展性高的好处
缺点:执行效率低于方式二
创建存储过程
在mysql中调用存储过程
delimiter $$ create procedure p1( in m int, in n int, out res int ) begin select tname from teacher where tid > m and tid < n; set res=0; end $$ delimiter ;
在python中调用存储过程
import pymysql conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc('p3',(3,100)) print(cursor.fetchall()) #查询返回结果 cursor.close() conn.close()