数据库中的视图的使用与存储过程
视图是什么?
本质是一张虚拟表,他的数据来自select语句。
作用:
功能1:隐藏部分数据,开放指定的数据
功能2:因为视图可以将查询的结果保存特性,我可以用视图来达到减少书写sql的次数
例如:select *from emp where dept_id=(select id from dept where name=”市场”);
要查询市场的人,将查询的结果作为一个试图,以后使用到这个需求就可以直接查看试图。
如何使用:
创建试图:
create view test_view as select *from t1;
特点:
- 每次对视图进行的查询,其实都是在次执行了as后面的小哈寻语句
- 可以对视图进行修改,修改会同步到原表
- 视图是永久保存的,存储的不是数据,而是一条as sql语句
基本不使用视图,因为你的程序开放的数据不是开放sql 语句,而开放的是查询结果
sql注入问题
import pymysql conn = pymysql.connect( user="root", password="admin", host="localhost", database="day43", charset="utf8" ) cursor = conn.cursor(pymysql.cursors.dictcursor) #sql = "select *from user where user = '%s' and pwd = '%s';" % (input("input username"),input("input password")) # 当用户输入的用户名为字符串 为 yy' -- 时 # 最终产生的sql select *from user where user = 'yy' -- ' and pwd = '987657890'; # -- 用于mysql注释 意思是 后面的内容忽略掉 # 从而导致 密码是否正确都能登录成功 # "select *from user where user = 'axxax' or 1=1; #print(sql) count = cursor.execute("select *from user where user = %s and pwd = %s;",args=(input("user"),input("pwd"))) print(count) if count: print("login success") else: print("login error") cursor.close() conn.close()
sql注入攻击,是什么意思?
一些了解授权sql语法的用户可以输入一些关键字或合法的sql语句,来导致原始sql逻辑发生变化,从而跳过登陆验证或者删除数据库。
如何避免:在接受用户输入的数据时,可以加上限制,比如不能输入 --’;where等等
上面这种方式只能避免黑客从你的客户端和服务器中间加一个中转服务器),这样就绕过了客户端的输入限制,此时只能将生气了sql合法性验证放在服务器端
总结:
python如何避免sql注入?把你的sql(用户输入的)参数放在execute函数中,让pymysql自动帮你屏蔽注入攻击
存储过程:
你可以理解为mysql的编程语言。
作用:
可以将你的程序业务逻辑放到mysql中来处理,这样可以降低网络的访问次数,从而提高你的程序效率。
我们可以将所有与数据存储相关的业务逻辑全都放在mysql中,但这样意味着公司需要再请一个mysql开发者,对你个人而言,提高了沟通成本。
三种开发模型:
对于同样的一个业务,你可以放到python有人可以放到mysql有什么区别?
- 应用程序处理逻辑,需要动手编写sql语句
优点:执行效率高;缺点:开发效率低
- mysql处理逻辑
特点:应用程序开发者不需要手动编写sql语句,mysql开发者来编写。
优点:应用程序开发效率高;缺点:执行效率低,沟通成本高
- 使用omb(object relation map)对象关系映射,自动帮你生成对应的sql语句,比如你要注册用户,本来要写insert语句,现在使用orm 调用save(用户对象)
优点:开发效率高;缺点:执行效率低
存储过程相当于python中的一个函数,简单的说,学习存储过程就是学习如何使用mysql编写一个函数。
语法;
create procedure 过程名称({in ,out,inout}数据类型 参数名称) begin 具体的代码 end 参数前面需要指定参数的作用 in 表示该函数用于传入数据 out 用于返回数据 inout 即可传入也可返回 参数类型是mysql中的数据类型
案例:创建一个存储过程 作用是将两个整数相加
create procedure add_p (in a int,in b int)
begin
select a + b;
end
//
调用 call add_p(1,2)
案例:创建一个存储过程作用是将两个整数相加,将结果保存在变量中,先定义一个变量:set @su=100;
create procedure add_p(int a int,in b int,out su int)
begin
set su=a+b;
end
//
定义变量:set @su=100;
调用过程: call add_p2(10,20,@su);
注意:在存储过程中,需要使用分号来结束一行,但是分号有特殊意义,因此将原始的结束符修改为其他符号。
delimiter // 结束符更换为//
delimiter;
mysql中的if语句
if 条件 then
代码
elseif 条件 then
代码
else then
代码
end if;
案例:
使用存储过程 完成 输入 一个 数字 1或2 显示 壹 或 贰
create procedure show_p (in a int)
begin
if a = 1 then
select "壹";
elseif a = 2 then
select "贰";
else
select "other";
end if;
end //
调用存储过程 使用 call 过程名称
call add_p(10,20);
其他的流程控制
switch
case
while
repeat == do while
总结: 实际上一个mysql中的类似函数的东西 我们可以用它实现一些逻辑处理
特点:里面可以包含流程控制语句 和 普通的sql语句
使用存储过程的优势
提高应用程序开发效率
降低网络访问次数
上一篇: 中国农业信息网_爬取新闻详情(源码)_一蓑烟雨任平生
下一篇: MySQL中的索引