即存储过程、触发器和函数中进行SQL编程,所以有些语法并不能应用于普通的SQL应用场景,如命令行直接SQL查询。
声明:set @变量名 = 值;
读取:select @变量名
赋值:
声明:declare 变量名 类型 [default 默认值];
读取、赋值:同上
[lable_name:] BEGIN
// 代码
END [lable_name]
MySQL支持两种判断,第一个是if判断,第二个 case判断
单分支
if 条件 then
//代码
end if;
双分支
if 条件 then
代码1
else
代码2
end if;
多分支
if 条件 then
代码1
elseif 条件 then
代码2
else
代码3
end if;
语法1:简单case函数
case sex
when '1' then '男'
when '2' then '女’
else '其他' end
语法2:case搜索函数
case when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
语法:
lable_name:loop
...
leave lable_name --退出循环
...
end loop;
语法:
[lable_name:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [lable_name]
实例:
delimiter //
CREATE PROCEDURE ps_repeat ( p1 INT ) BEGIN
SET @x = 0;
REPEAT
SET @x = @x + 1;
UNTIL @x > p1
END REPEAT;
END //
语法:
while 条件 do
//代码
end while;
实例:
delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
WHILE p1 > 0 DO
SET p1 = p1 - 1;
END WHILE;
END//
语法:
1.定义游标:declare 游标名 cursor for select语句;
2.打开游标:open 游标名;
3.获取结果:fetch 游标名 into 变量名[,变量名];
4.关闭游标:close 游标名;
实例:
delimiter //
create procedure p3()
begin
declare value1 int;
declare value2 int;
-- 声明游标
declare mc cursor for select id,name from old_tab;
-- 打开游标
open mc;
-- 获取结果
fetch mc into value1,value2;
-- 这里是为了显示获取结果
select value1,value2;
-- 关闭游标
close mc;
end//
call p3
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集。存储在数据库中,经过第一次编译后再次调用不需要再次编译。可设定只有某些用户才具有对指定存储过程的使用权,这展现了其安全性。
(1)查看现有的存储过程。
语法:
SHOW PROCEDURE STATUS [ LIKE ' pattern ' ] ;
实例:
show procedure status from mysql like '%p1%'
(2)创建存储过程
语法:
注意:delimiter是声明定界符,用以区分sql语句(;)和存储过程(//)结尾定界符
参数说明:参数分为 in 输入函数(默认) out输出函数 inout输入输出函数
delimiter //
CREATE PROCEDURE ps_name (参数1,参数2,参数3,...)
BEGIN
sql代码
END//
实例:
delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
WHILE p1 > 0 DO
SET p1 = p1 - 1;
END WHILE;
END//
存储过程的参数分为输入参数(in)、输出参数(out)、输入输出参数(inout),默认是输入参数。如果存储过程中就一条语句,begin和end是可以省略的。
说明:
存储过程中,可有各种编程元素:变量,流程控制,函数调用;
还可以有:增删改查等各种mysql语句;
其中select(或show,或desc)会作为存储过程执行后的"结果集"返回;
形参可以设定数据的"进出方向":
(3)调用存储过程
语法:call 存储过程()
(4)删除存储过程
语法:drop procedure [if exists] 存储过程名
(5)存储过程典型案例
1.各种类型输入输出参数
实例:
结过说明:除了in,传入的参数@a没有改变以外,out和inout都改变了传入的参数@b,@c
3.插入数据
实例:
delimiter //
drop procedure if exists insert1;
create procedure insert1()
begin
DECLARE i int;
set i = 0;
WHILE i<100 do
insert into tab1(id,username) values(i,CONCAT('username',i));
set i = i+1;
end while;
end//
4.游标遍历插入
实例:
tip: declare continue handler for not found set flag = 1;
delimiter //
create procedure p3()
begin
declare value1 int;
declare value2 int;
declare value3 varchar(32);
declare flag int default 0;
-- 声明游标
declare mc cursor for select * from old_tab;
declare continue handler for not found set flag = 1;
-- 打开游标
open mc;
l1:loop
fetch mc into value1,value2,value3;
if flag=1 then
leave l1;
end if;
insert into new_tab values(value2,value3,value1);
-- 这里是为了显示获取结果
-- 关闭游标
end loop;
close mc;
end//
call p3
5.综合实例:变量,select into 变量赋值,游标,循环
实例:
delimiter //
create procedure selecttab1()
begin
DECLARE i int;
declare username VARCHAR(255);
-- 定义游标
declare selecttab1_cursor CURSOR for select id, username from tab1 ;
-- 打开游标
open selecttab1_cursor;
-- 首次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
-- 循环游标
read_loop: LOOP
select i,username;
-- 再次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
END LOOP;
-- 关闭游标
close selecttab1_cursor;
end//
6.存储过程动态执行sql
delimiter //
create procedure dongtaisql()
begin
declare v_sql varchar(500); -- 需要执行的SQL语句
DECLARE i int;
set i = 0;
WHILE i<10 do
set v_sql= concat('insert into tab2(id,username) values(',i,', \'username',i,'\');');
set @v_sql=v_sql; -- 注意很重要,将连成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @v_sql; -- 预处理需要执行的动态SQL,其中stmt是一个变量
EXECUTE stmt; -- 执行SQL语句
deallocate prepare stmt; -- 释放掉预处理段
set i = i+1;
end while;
end//
(1)创建函数
语法:
create function 函数名(参数,参数的类型) returns 返回值类型
begin
//代码
end
实例:
create function fun1() returns int
begin
declare c int;
select id from old_tab into c;
return c;
end;
(2)mysql内置函数
参考:mysql函数参考手册
(1)简介
触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。
触发器必须定义在特定的表上。
自动执行,不能直接调用,
作用:监视某种情况并触发某种操作。
语法:
create trigger trigger_name
after/before insert /update/delete on 表名
for each row
begin
// 代码
end
实例:
delimiter //
CREATE TRIGGER tr_new_tab_insert
after insert on new_tab
for Each row
begin
insert into old(id,name,valid) values(new.id,new.name,new.valid);
end //
提示:new.字段名 可以访问新值,old.字段名可以访问旧值。
(5)查看触发器
语法: show triggers
(6)删除触发器
语法:drop trigger trigger_name