MySQL储存过程

存储过程:指定特定功能的一条/多条sql语句/批处理语句。

函数:执行特定功能的一段代码进行封装。

储存过程 PHP里面的函数 方法 类似

局部变量:declare 变量名 数据类型 default 默认值;

变量的作用范围:begin end;之间

设置变量:set 变量名=变量值

传参方式:

in 传入参数

out 传出参数

select :相当于echo 输出 打印

out: 返回调用结果 相当于return

inout 传入传出参数

条件判断:if case

if 判断条件
then
//执行sql
elseif 判断条件
then
//执行sql
else
//执行sql
end if;
case 变量
when 比较的值 then
//执行sql
else
//执行sql
end case;

常见的3中循环

while循环栗子

#在新版本navicat要写第一行语句,老版则省略不写
create definer='root'@'localhost' procedure sp_24_while()
#开始创建过程
begin
    #定义一个变量
    declare i int default 0;
    #条件为真 则执行代码
    while i<10 do
    insert into user(age) values(i);
    set i=i+1;
    end while;
end

执行新建的过程 call sp_24_while();

repeat循环栗子

repeat
#循环语句
until i=10 end repeat; #判断条件为真实停止循环

loop无限循环

loop
#循环语句
#要使用leave或iterate跳出
end loop

游标

游标相似于数组

1.创建游标
declare 游标名称 cursor for sql语句
2.打开游标
open 游标名称
3.取出游标值
fetch 游标名称 into 变量名//取出单个游标值
//结果集字段的顺序
fetch 游标名称 into 变量名1,变量名2,变量名3//取多个值
4.循环
停止条件
5.关闭游标
close 游标名称

栗子

BEGIN
    DECLARE uman VARCHAR(20);
    DECLARE i INT DEFAULT 0;
    DECLARE sale_man_cur CURSOR FOR SELECT DISTINCT sale_man FROM xk_order WHERE sale_man <> '';
    #检测异常 当游标中数据都取出来时i=1
    DECLARE CONTINUE HANDLER FOR NOT found SET i=1;
    #开启游标
    OPEN sale_man_cur;
    #取出游标
    FETCH sale_man_cur into uman;
    #循环
    WHILE i = 0 DO
        INSERT INTO user(name) VALUES(uman);
        FETCH sale_man_cur INTO uman;
    END WHILE;
    #关闭游标
    CLOSE sale_man_cur;
END

函数

create definer=current_user funcion 'func_25_getName'()
returns integer
begin
    #定义变量
    return 0;
end

高级特性:

1.contains sql 表明子程序包含sql语句(默认)

2.no sql 表明子程序不包含sql语句

3.reads sql data:说明子程序包含读数据的语句

4.modiffes sql data:表明子程序包含写数据的语句

执行命令保存在binlog中(只要用于复制和回复)

【栗子】获取字符串中随机字符

查询:SELECT fun_18_string255(展示随机字符串的长度);

事件

查看当前事件是否开启

查询:show variables like '%event_scheduler%';

开启:set GLOBAL event_scheduler = ON;

事件的创建简单方法:

事件的创建语句

create event 事件名称
on schedule at(单次)/every(多次)
    at        单次执行事件
    every    多次执行事件
on completion preserve/not preserve(-选填)
    preserve        事件到期后保留事件
    not preserve    事件到期后删除事件
disable/enable 关闭/开启(-选填)
commit '注释'
do 执行内容

视图

视图是一个虚拟存在的逻辑表

视图的优点:简单,安全,数据独立

事务

事务的特性:acid
原子性,持久性,隔离性,一致性

事务的隔离级别
read uncommitted(读未提交RU)会产生脏读现象
read committed(数据库的读以提交RC)产生不可重复读,幻读现象
repeatable read(可重复读RR-默认级别)避免脏读,不可重复读和幻读现象
serializable(串行化)类似队列一个一个执行,效率低最安全

#查看事务隔离级别
select @@session.tx_isolation;
#设置当前mysql隔离级别
set session transaction isolation level read uncommitted;
#设置数据库系统的全局隔离级别
set global transaction isolation level read committed;

显式

1.开启事务start transaction;

2.提交事务commit;

3.回滚事务rollback;

隐式

事务自动提交 show variables like 'autocommit';

事务自动提交关闭set autocommit=0;

mysql语句

mysql -u root -p
#输入密码
--使用数据库
use 库名
--展示所有表
show tables;
--设置编码
set names gbk;
--查看表数据
select * from 表名;

ps:什么时候使用索引

1.百万级数据

2.经常查询的字段

6个索引,

  • 普通索引
  • 唯一索引
  • 全文索引
  • 单列/多列索引
  • 组合索引

注意索引失效,失效的情况

补充:
使用过程来添加测试数据

begin
    #定义一个变量

    declare i int default 0;
    #条件为真 则执行代码
    while i<500 do
    insert into test(uname,age,r_number) values(md5(rand()*900),floor(rand()*90+10),floor(rand()*90000+10000));
    set i=i+1;
    end while;
end

测试数据

MySQL

我来吐槽

*

*