mysql5.6创建存储过程_Mysql存储过程和简单的SQL编程

1.存储过程(procedure)

语法:

create procedure 存储过程名(参数,…)

begin

//代码

end//

注意:存储过程中有很多的SQL语句,SQL语句的后面为了保证语法结构必须要有分号(;),但是默认情况下分号表示客户端代码发送到服务器执行。必须更改结束符

通过delimiter指令来跟结束符

delimiter // #将结束字符定义为//(原来是;)

(1)创建存储过程

#简单的

create procedure pro_1()

select * from stuinfo;

//

#如果存储过程中就一条SQL语句,begin…end两个关键字可以省略。

#调用存储过程

call pro_1()//

#包涵多条sql语句的

#in代表输入参数,可以省略

create procedure pro_2(in param int)

begin

select * from stuinfo where sid=param;

select * from stumarks where sid=param;

end//

#调用

call pro_2(10)//

(2)参数的类别

在存储过程中,没有return,如果需要返回值,通过输出参数来实现

在MySQL中,参数分为3类,输入参数(in),输出参数(out),输入输出参数(inout),默认情况下是是输入参数(in)

(3)删除存储过程

语法:drop procedure [if exists] 存储过程名

drop procedure if exists pro_1//

(4)查看存储过程的信息

show create procedure pro_2\G

(5)局部变量

语法:declare 变量名 数据类型 [初始值]

通过:select ...into…或set命令给变量赋值

例题通过sid查询姓名和年龄

create procedure pro_3(in id int)

begin

declare name varchar(10);

declare sexx char(10);

select sname,sex into name,sexx from stuinfo where sid=id;

select name,sexx from dual;

end //

#调用pro_3

call pro_3(10)//

#注意:声明的变量名不能和列名(字段名)同名

例题:查找同桌

create procedure pro_4(in name varchar(32))

begin

declare stuseat tinyint;

select seat into stuseat from stuinfo where sname=name;

select * from stuinfo where seat=stuseat+1 or seat=stuseat-1;

end //

#调用

call pro_4('百强')//

#通过set给变量赋值

create procedure pro_5(in num1 year,in num2 year,in name varchar(32))

begin

declare num int;

set num=num2-num1; #得到年龄

update stuinfo set age=num where sname=name;

select * from stuinfo where sname = name;

end//

call pro_5(1991,2018,'小力')//

(6)全局变量(用户变量)

全局变量前面必须有一个@,全局变量的数据类型取决于变量的值。如果一个全局变量没有赋值,他的数据类型为null。

set @name='百强'//

select * from stuinfo where sname=@name//

(7)系统变量

通过两个@开头的都是系统变量

select @@version from dual//

系统命令

作用

@@version

版本号

current_date

当前日期

current_time

当前时间

current_timestamp

当前日期和时间

(8)带有输出参数的存储过程

#带有out关键字的参数,在存储过程运行结束以后,默认返回

create procedure pro_6(in num int,out result int)

begin

set result=num*num;

end//

#调用

#@result 接受返回值

call pro_6(6,@result)//

select @result from dual//

(9)带有输入输出参数的存储过程

create procedure pro_7(inout num int)

begin

set num=num*num;

end //

#调用

set @num=10//

call pro_7(@num)//

select @num from dual//

2.SQL编程(了解)

(1) if-elseif-else语句

#语法:

if 条件 then

//代码1

elseif 条件 then

//代码2

else

//代码3

end if;

create procedure pro_8(in grade int)

begin

if grade=1 then

select '金牌会员' as '等级';

elseif grade=2 then

select '普通会员' as '等级';

else

select '游客' as '等级';

end if;

end //

#调用

call pro_8(3)//

(2) case-when语句

create procedure pro_9(in num int)

begin

case num

when 1 then select '杀马特' as '气质';

when 2 then select '屌丝' as '气质';

when 3 then select '正常人' as '气质';

when 4 then select '贵族' as '气质';

else select '输入不正确' as '气质';

end case;

end //

call pro_9(0)//

#显示学员的学号、姓名、性别、语文成绩、等级

select sid,sname,sex,ch,case

when ch>=90 then '等级A'

when ch>=80 then '等级B'

when ch>=70 then '等级C'

when ch>=60 then '等级D'

else '等级E'

end as '等级' from stuinfo left join stumarks using(sid)//

select sid,sname,sex,ch from stuinfo left join stumarks using(sid)//

(3)loop循环

loop遇到leave退出

create procedure proc(in num int)

begin

declare total int default 0;

declare i int default 0;

sign:loop

set total=total+i;

set i=i+1;

if i>=num then

leave sign;# leave=break

end if;

end loop;

select total from dual;

end //

call proc(100)//

#如果没有设置标签名,leave loop

#sign是循环名,用于结束循环,可以自己随意取名字

(4)while循环

#语法:

while 条件 do

//代码

end while

create procedure pro_11(in num int)

begin

declare total int default 0;

declare i int default 0;

while num>=i do

set total=total+i;

set i=i+1;

end while;

select total from dual;

end //

call pro_11(100)//

(5)repeat循环

#语法

repeat

代码

until 条件 -- 直重复到条件为true才结束

end repeat

create procedure pro_12(in num int)

begin

declare total int default 0;

declare i int default 0;

repeat

set total=total+i;

set i=i+1;

until i>num

end repeat;

select total from dual;

end //

call pro_12(100)//

(6)leave和iterate

leave类似于break,iterate类似于continue

create procedure pro_13()

begin

declare i int default 0;

sign:while i<5 do

set i=i+1;

if(i=3) then

leave sign; -- 类似于break

#iterate sign; -- 类似于continue

end if;

select i from dual;

end while;

end //

call pro_13()//

3.MySql函数

内置函数

(1).数字类

语句

含义

select rand() from dual;

随机数

select * from stuinfo order by rand();

随机排序

select round(5.6);

四舍五入

select ceil(5.3);

向上取整

select floor(5.6);

向下取整

(2).大小写转换

语句

含义

select ucase('i am lyb');

大写

select lcase('I AM LYB');

小写

(3).截取字符串

语句

含义

select left('abcdefg',3);

截取左边的3位

select right('abcdefg',3);

截取右边3位

select substring('abcdefg',2,3);

从第2位开始取3个字符,起始位置从1开始

(4).字符串拼接

select concat(sid,sname,age,sex,city) from stuinfo;

mysql> select concat(sid,sname,age,sex,city) from stuinfo;

+--------------------------------+

| concat(sid,sname,age,sex,city) |

+--------------------------------+

| 7小明18male上海 |

| 8小刚20male北京 |

| 9小强22male重庆 |

| 10小力23male天津 |

| 11小丽21female北京 |

| 12小月20female天津 |

| 13小yb18male重庆 |

| 17百强18male黑龙江 |

| 18百强118male黑龙江 |

| 19百强218male黑龙江 |

+--------------------------------+

(5).coalesce(str1,str2):如果str1不为null则显示str1,否则显示str2

select sid,sname,coalesce(ch,'缺考'),coalesce(math,'缺考') from stuinfo left join stumarks using(sid);

mysql> select sid,sname,coalesce(ch,'缺考'),coalesce(math,'缺考') from stuinfo l

eft join stumarks using(sid);

+-----+-------+---------------------+-----------------------+

| sid | sname | coalesce(ch,'缺考') | coalesce(math,'缺考') |

+-----+-------+---------------------+-----------------------+

| 11 | 小丽 | 100 | 80 |

| 8 | 小刚 | 60 | 98 |

| 10 | 小力 | 50 | 51 |

| 9 | 小强 | 67 | 88 |

| 7 | 小明 | 88 | 10 |

| 12 | 小月 | 96 | 97 |

| 17 | 百强 | 缺考 | 缺考 |

| 18 | 百强1 | 缺考 | 缺考 |

| 19 | 百强2 | 缺考 | 缺考 |

+-----+-------+---------------------+-----------------------+

(6).length(字节长度)、char_length(字符长度)、trim(去两边空格)、repace(替换)

select length('千锋');

select char_length('千锋');

select length(trim(' 千锋 '));

select replace('pgone','one','two');

(7).时间戳

select unix_timestamp();

(8).将时间戳转成当前时间

select from_unixtime(unix_timestamp());

(9).获取当前时间

select now(),year(now()),month(now()),day(now()),hour(now()), minute(now()),second(now())\G

#现在时间,年,月,日,时,分,秒

(10).dayname(),monthname(),dayofyear()

select dayname(now()) as `星期`,monthname(now()) as `月份`,dayofyear(now()) as `本年第几天`;

(11).datediff(结束日期,开始日期)

例题计算自己活了多少天

select datediff(now(),'1970-1-1');

(12).md5():md5加密

select md5('@123456.');

3.自定义函数

#语法:

Create function 函数名(形参) returns 返回的数据类型

begin

//函数体

end

#第一步

delimiter //

#不带参数的函数

create function myfun() returns varchar(32)

begin

return '千锋python';

end //

#调用函数

select myfun()//

#带参数

create function myfun_1(num1 int,num2 int) returns int

begin

declare num int default 0;

set num=num1+num2;

return num;

end //

select myfun_1(100,200)//

#删除函数

drop function myfun_1//

4.触发器

1、触发器是一个特殊的存储过程

2、不需要直接调用,在MySQL自动调用的

3、是一个事务,可以回滚

(1)触发器的类型(触发事件)

1、insert触发器

2、update触发器

3、delete触发器

(2)创建触发器

#语法:

Create trigger 触发器名 触发时间[before|after] 触发事件 on 表名 for each row

Begin

//代码

end

(3)new表和old表

1、这两个表是个临时表

2、当触发器触发的时候在内存中自己创建,触发器执行完毕后自动销毁

3、他们的表结构和触发器触发的表的结构一样

4、只读,不能修改

stuinfo curd

打开文件,内存中需要加载,会随即分配一个空间用来保存文件的所有数据,->old 6

在新的一轮操作后,内存会生成新的空间,这个空间里面保存了新的数据变化->new 7

(5)insert触发器

#在stuinfo中插入一个值,就会自动在stumarks中插入一条数据

#after insert 表示的是在insert动作执行完毕以后触发

#on stuinfo for each row 针对的stuinfo表,并且可以读取到每一行的变化

#触发器中定义的局部变量不能与表中的字段名一致,否则会发生字段识别问题(识别不出到底是字段,还是变量)

create trigger trig1

after insert on stuinfo for each row

begin

declare sidno int default 0;

declare nch int default 0;

declare nmath int default 0;

declare nseat int default 0;

set sidno=new.sid;

set nseat=new.seat;

insert into stumarks set sid=sidno,ch=nch,math=nmath,seat=nseat;

end //

insert into stuinfo values(null,'随便','male',20,'合肥',12)//

(6)update触发器

create trigger trig2

after update on stuinfo for each row

begin

declare sidno int default 0;

declare seatno int default 0;

set seatno=new.seat;

set sidno =new.sid;

update stumarks set seat=seatno where sid =sidno;

end //

select ((select max(seat) from stuinfo)+1)//

update stuinfo set seat=12 where sid=12//

(7)delete触发器

create trigger trig3

after delete on stuinfo for each row

begin

declare sidno int default 0;

set sidno =old.sid; #删除了新表里面就没有了,只能从老表里面拿

delete from stumarks where sid=sidno;

end //

delete from stuinfo where sid =13//

#触发器能做钩子函数

(8)查看 和 删除 触发器

show triggers\G

drop trigger if exists trig1//

##5.用户管理

mysqld --skip--grant--tables

#(5.5最好用)

#--skip--grant--tables 跳过登陆验证(MYSQL服务器开起中)

(1)创建用户

语法:create user ‘用户名’@’允许登录的主机地址’ identified by 密码

#%代表数据库的库名

create user 'ruidong'@'%' identified by '123456';

(2)删除用户

语法:drop user 用户

drop user ruidong;

(3)增加用户权限

#将python的所有表的select权限付给ruidong用户

grant select on python.* to 'ruidong'@'%';

#将所有数据库中所有表的所有权限付给ruidong用户

grant all privileges on *.* to 'ruidong'@'%';

#创建用户并授权

grant all privileges on *.* to 'hal'@'%' identified by '123456' with grant option;

#创建好用户以后,刷新mysql用户权限表

flush privileges ;(linux ,mac)

revoke select on python.* from 'ruidong'@'%'; #删除select权限

revoke all privileges on *.* from 'ruidong'@'%'; #删除所有权限

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值