mysql之视图,事务,存储过程

一,视图

什么是视图,本质就是一张虚拟的表,它的数据来自select语句

有什么用?

原表的安全性

功能1,隐藏部分数据,开放指定数据

         2,视图可以将查询的结果保存,可以减少书写sql的次数

如何使用?

创建视图

create view 视图名 as select * from 表名;
create view test_view as select * from t1;

强调:1,在硬盘中,视图只是表的结构文件,没有表的数据文件

         2,视图通常是用于插叙,尽量不要修改视图中的数据

特点;1,每次对视图进行查询,都是执行了as后面的sql语句

扫描二维码关注公众号,回复: 3288249 查看本文章

         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()

猜你喜欢

转载自blog.csdn.net/qq_42737056/article/details/82757404