函数,事务,索引,存储过程

重点,事务,索引:

--常见的安全问题:

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 默认值;

必须得有默认值

时间: 2024-10-11 12:44:31

函数,事务,索引,存储过程的相关文章

视图,触发器,事务,存储过程,函数与流程控制,索引

一.视图 1.什么是视图 虚拟表:在硬盘中没有的,通过查询在内存中拼接的表 视图:通过查询得到一张虚拟表,保存下来,下次可直接使用 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 4.删除视图 drop view teacher2course; 5.强调

mysql的 视图、触发器、事务、存储过程、函数、索引与慢查询优化

视图 假设有两张表学生和老师,学生表(sid,name,tid)关联老师表(tid,tname) 创建视图的语法: create view 视图名 as SQL语句 实例: create view student2teacher as select * from student inner join teacher on student.tid=teacher.tid; 创建视图后会产生一个名为 student2teacher 的表,可以直接调用. 思考:开发过程中会不会去使用视图? 不会!视图

MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as #把下面查询的结果放在视图teacher2course中 select * from teacher inner join course on teacher.tid = course.teacher_id; 注意: 1.视图只有表结构,视图中的数据还是来源于原来的表

MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引

视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 1 2 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 思考:开发过程中会不会去使用视图? 不会!视图是mysql

数据库---视图,触发器,事务,存储过程 ,函数,流程控制, 索引与慢查询优化,测试索引,数据库三范式(简介)

视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调 1.在硬盘中,视图只有表结构文件,没有表数据文件 2.视图通常是用于查询,尽量不要修改视图中的数据 drop

视图、触发器、事务、存储过程、函数、流程控制、索引与慢查询优化

一.视图 1.什么是视图 视图就是将SQL语句的查询结果得到的一张虚拟表,保存下来仅保留表结构,这张虚拟表就是视图 2.为什么要用视图 为了便于后期直接查询,节省拼接表的时间消耗 3.怎么用视图 语法:create view 视图名 as sql语句 create view class_student as select * from class inner join student on class.cid = student.class_id; 注意:1.创建出来的视图只有表结构,没有表数据

sqlserver中的存储过程 函数 事物 索引及视图

                                       存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以嵌入在SQL中使用的,可以在SELECT等SQL语句中调用,而存储过程不行.执行的本质都一样. 函数限制比较多,如不能用临时表,只能用表变量等,而存储过程的限制相对就比较少. 1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强. 2. 对于存储过程来说可以返回参数,而函数只

视图、触发器、事务、存储过程、函数

阅读目录 视图  view 触发器  trigger 事务  transaction 存储过程   procedure 函数 流程控制 一: 视图  view 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数

MySQL之视图、触发器、事务、存储过程、函数 流程控制

阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部都做了,也就是说它想要完成一件事,以后想开发的人,例如想写python程序的人,你就专门的写你自己的python程序,以后凡是关于数据的增删改查,全部都在MySQL里面完成,也就是说它想实现一个数据处理与应用程序的一个完全的解耦和状态,比如说,如果我是个应用程序员,我想要查询数据,我不需要自己写sql语句,只需要调用mysql封装好的一些功能,直

变量,存储过程,触发器,事务-索引等

--SELECT TOP 3 Name,Age,Gender FROM View_Student WHERE GROUP having ORDER BY id DESC ----在最终生成用户想要的数据之后,才进行排序,如果不得不排序,那么就尽可能吧消耗减到最小 --ALTER VIEW View_Student --AS --SELECT * FROM dbo.Student DECLARE @num INT --赋值,取值 --赋值两种方式:set select SET @num=100 S