重点,事务,索引:
--常见的安全问题:
sql注入:用户输入不合法
通过攻击服务器的安全漏洞窃取数据库 一种常见的方式
在黑市上可以买到数据库信息
装库,利用从别处叨叨的用户名和密码,尝试在另外一个站点上登录,从而得到更多
信息
安全建议:
1.对数据库设计的建议:在表中存储加密后的密码数据,常见加密方式 :md5,sha1
2.对网站程序员的建议:登录时添加验证码
3.对普通用户的建议:在多个站点间使用不同的密码
oauth:授权登录,微信,微博,新浪
函数:
? functions; 查看系统内置函数
函数自定义
自动义函数
--特点:必须有返回值
create function 函数名称(参数列表)returns 返回类型
create function f1() returns int
--函数体
return 10;
--查看函数存在什么位置---->mysql.proc
select db,name,type from mysql.proc;
--调用自定义函数
select f1();
--删除函数
drop function f1 # 删除的时候必须得在本数据库不然要加数据库名称
delete from mysql.proc where name =f1;
--定义一个函数实现加法运算
1.如果函数体中不止一行代码的时候需要使用begin。。。end
2.定义变量需要使用declare
3.每个语句都需要添加;表示结束
4.给变量赋值,需要set
5.delimiter 临时修改结束标示符号
(传入的参数可以跟一个类型)
delimiter //
create function f1(a int,b int) returns int
begin
--定义一个变量res
declare res int default 0;
--将a+b赋值给res
set res = a+b;
--返回res
return res;
end
//
delimiter ;
变量:
声明临时变量:只能在begain --end
设置 set
用户变量 用@变量名
赋值 :=
--系统变量
用@@标示系统变量
---分支结构,循环结构
---输出0-100之间的偶数;
delimiter //
create function f3() returns varchar(300)
begin
--定义一个递增的变量i,和一个用来拼接偶数的res
declare i int default 0,
declaer res varchar(300) default "",
--通过循环来递增i
while i <= 100 do
--判断i是否为偶数
if i %2 =0 then
--拼接偶数
set res=concat(res,‘‘,i);
end if;
set i = i+1;
end while;
--返回res
end
delimiter;
函数在使用过程中的缺陷。注意事项
1.在函数中调用其他的函数,不需要使用select
2.在函数中不能够调用select 语句,除了select...into
拿一个值赋值而函数是返回一个值
只要select 有返回值的话,就不能在函数中使用
函数的缺陷:但是可以用into传入
存储过程 和函数非常类似
创建
delimiter //
create procedure 存储过程名称(参数类表)
begin
sql(语句)
end
delimiter;
--存储过程的定义
delimiter //
creater procedure procel()
begin
select * from students;
select count(*) from students;
end
//
delimiter
--查看
select db,name ,type from mysql.proc;
--调用(如果没有参数,小括号可以省略),有参数一定不能够省略
call procel();
--没有返回值 可以通过参数来实现返回值
--sql中的参数有三种类型(一个函数数最多设置1024个参数)没必要
--in 默认的参数都是 in 类型,表示传入类型的参数
--out 传出类型的参数,通过out类型的参数给存储过程实现返回值功能
--inout 既可以传入,又可以传出,一般不用,a,参数的语义不好描述
导致函数的语义不够清晰,
--传入一个学生的id,删除该学生,返回学生的总人数
delimiter //
create procedure deletebysid_getcount(in sid int unsigned,out scount int)
begin
delete from students where id = sid;
select count(*) from students into scount;
end
//
delimiter ;
--
--定义一个用户变量
set @count =0;
call deletebyssid_getcount(15,@count)
存储过程和函数的区别
面试过程的时候经常会问道
相同点:
1存储过程和函数都是为了封装,可重复的执行操作数据库的sql语句的集合
2.都是一次编译,(节省sql执行的时间)
3.减少网络交互,减少网络访问流量
编译:客户端发送命令给sql,---mysql引擎,分析(sql语法)一个一个对比,
整个sql语句都是符合的dql语法的,会拿正确的sq语句,编译成可识别的命令
-----执行----执行结果----返回---客户端
客户端--sql命令---mysql引擎---分析---语法正确----编译---可识别的命令--
执行---执行结果---返回---客户端
不同点
标示符不同 function 过程 procedure
函数必须有返回值,过程没有返回值,但是可以通过设置参数类型(in,out)
来实现多个参数或者返回值
函数使用select调用,存储过程使用call调用
select(语句可以在存储过程中调用,但是除了select。。into之外的select
语句都不能再函数中调用
通过in out 参数,过程相关函数更加灵活,可以返回多个结果
视图 :不能更新,先删除,再创建
封装的比较好,构架的,越好维护===思考怎么让健壮性,可维护性
对复杂的查询语句的封装
解决:定义视图
视图 本质:就是对查询结果的封装
定义视图,建议以v_开头
--视图的使用
create view 视图名称 as select 语句;
create view v_stu as select * from students;
select * from v-stu
--删除
drop view v_stu;
事务四大特性(考试题)
事务广泛运用于订单系统,银行系统等多种场景
事务(transaction)是并发控制的基本单位,它是一个操作序列,要么执行,
要么都不执行,它是一个不可分割的工作单位,
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
begin:开启事务之后,后续的更新数据的操作(crud),不会立即影响到源数据库
所有的都执行完成后,
成功,可以完成修改的提交操作,commit
开启事务之后的更新操作,才会影响到源数据库
如果失败了,可以执行回滚的操作,rollback(回滚),将之前的更新撤销
操作指令
begin,commit ,rollback
用户名唯一
加锁(写锁)
事务四大特性(acid)
原子性,atomicity:不可被分割
一致性,consisitency:
隔离性,solation:相互不影响,在提交的时候就看谁先提交
持久性:对于已提交事务,系统必须保证该事务不被丢失,即使数据库出现故障
--开启事务
--面向连接的,数据的变化只会影响当前连接的用户
--begin;
inset into classes values(0,”python23“);
select * from classes;
--commit;存储到数据库中,提交了事务,之前开启的实物就结束了,接下来
的操作就不是在事务中完成
--rollback操作:
begin;
---更新的操作默认都是开启了事务,并且会自动提交
crud
--begin是手动开启手动,不会自动提交,需要手动执行commit 完成提交的操作
--大批量的数据更新的时候,手动开启事务效率高还是低呢?
1.能够提高更新的效率
2.能够保证更新的安全性 (脏数据,需要清楚)
如果出现故障,调用rollback,就不会出现脏数据
大批量数据更新的时候,需要手动更新事务,效率高,数据安全
索引
当数据库数据量 很大时,查找数据会变的很慢
优化方案:索引
主键和唯一索引,都是索引,可以提高查询速度
主键是数据物理存储的位置
索引会单独创建一个目录,对应数据的位置
索引分单列索引和组合索引
单列索引 :一个索引只包含单个列,一个表可以有多个单列索引
组合索引:一个索引包含多个列
索引:BTREE:自平衡排序二叉树(完全二叉树)balance
缺点:1影响更新表的速度、
2.建立索引会占用磁盘空间的索引空间
两个极端
整个表没有一个索引字段
每个字段都创建了索引
给合适的字段创建索引,提高查询的速度
语法:
--查看索引
show index from 表名(字段名称(长度));
1--造100万条假数据
2.通过索引字段来查询对应的数据(查询耗时)
3.通过非索引字段来查找对应的数据(查询耗时)
4.对非索引创建索引,然后在通过创建了索引的字段再查询一次(查询时间)
5.对比查询时间,分析效率的提升
1.通过定义存储过程,插入到数据表中,创建数据表
2create table demo(
id int unsigned primary key auto_inrement not null,
name varchar(10));
delimiter //
create procedure domo_proc()
begin
declare i int default 0;
while i <=1000000 do
insert into demo(name) values (concat(‘domo",i);
set i =i+1;
end while;
end
//
delimiter ;
3.select *from demo;
--通过id来查找
set profiling=1;
select * from demo where id = 1000001;
show profiles;
select * from demo where name= ”demo10000001“
4.create index name_index on demo(name(50));
--开启时间检测
set profiling=1;
--获取每个sql执行的耗时
show profiles
--删除索引
drop index name_index on demo;
mysql与python交互
环境搭建
包管理第三方包:sudo pip install 对应包名(pymysql)
会安装到默认路径:
在真是的情况下:相同的包不同版本不能够共存,会覆盖安装
可以创建一个虚拟环境,是一个拥有独立python解释器环境
,安装不同版本的包,
虚拟环境基本操作
步骤
1.安装虚拟环境的包
sudo pip install virtualenv
sudo pip install virtualenwrapper
2.创建一个虚拟环境(默认的是python2的解释器)
py2虚拟环境:mkvirtualenv 虚拟环境名称
py3的虚拟环境:mkvirtualenv -p /usr/bin/ (得手动配置路径)
3.运行虚拟环境
workon 虚拟环境名称
4.安装pip包(第三方的包)指令:sudo(不能使用sudo,用的话会安装默认)
指令:pip install 包名
需要联网(热点)nat模式下 拔网线
演示一下虚拟环境:
pycharm 配置虚拟环境
总结:
1安全问题:sql注入--‘ 单引号,发生错误,;分号,让错误语句结束,然后执行我们要操作的语句
---目前---可以用参数防止 sql注入
2.函数---创建,调用------变量 (临时变量declare,用户变量set @xx=xx,系统变量@@
创建,调用,删除
有返回值的sql语句中都不能够执行除了select 。。。into之外
3存储过程--创建,查看--调用--删除
参数的类型 in out inout类型的参数 通过out类型的参数可以给存储过程实现返回值
存储过程中 可以执行任意的sql语句,更到的灵活,在实际开发中使用更多
相同点:减少网络流量的消耗
4.视图:对一个复杂的sql语句的封装
5.事务:安全的更新数据库的一中方式
四大特征:原子性,一致性,隔离性,持久性
三个操作指令 begin commit rollbacl
1.手动开启事务,手动提交事务
2.成功之后,进行提交,一旦提交不能够车脚
3.失败之后,执行回滚操作,回滚去除脏数据
事务是面向当前连接的
事务更新大批量数据的时候,效率高,更新安全(脏数据)
6.索引:提高查询的效率
降低更新的效率
额外消耗磁盘的效率
7 虚拟环境:virtualenv 使用步骤,使用的时候把网线拔了
注意在创建函数的时候,声明变量的格式是:
declare 变量名 类型,default 默认值;
必须得有默认值