数据库第六天
Posted liugangjiayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库第六天相关的知识,希望对你有一定的参考价值。
变量
系统变量
全局变量
会话变量
自定义变量
用户变量
局部变量
注意:如果是全局级别 则需要加global 如果是会话级别 则需要加session 如果是会话级别 则需要加session 如果不写 则默认session
一、系统变量
说明:变量由系统提供 不是用户定义 属于服务器层面
使用的语法:
1、查看所有的系统变量
show global|[session] variables
2.查看满足条件的部分系统变量
show global|[session] variables like ‘%char%‘;
3.查看指定的某个系统变量的值
select @@global.系统变量名;
4.为某个具体系统变量赋值
方式一:
set global|[session] 系统变量名=值;
方式二:
set @@global|[session].系统变量名=值;
1.全局变量
作用域:服务器每次启动将为所有的全局变量赋初值 针对于所有的会话连接有效 但不能跨重启
查看所有的全局变量
show global variables;
查看部分的全局变量
show global variables like ‘%char%‘;
查看指定的全局变量的值
select @@global.autocommit;
select @@tx_isolation;
为某个指定的全局变量赋值
set @@global.autocommit=0;
2.会话变量
作用域:仅仅针对当前会话(连接)有效
查看所有的会话变量
show session variables;
show variables;
查看部分的会话变量
show variables like ‘%char%‘;
show session variables like ‘%char%‘;
查看指定的某个会话变量
select @@tx_isolation;
select @@session.tx_isolation;
为某个会话变量赋值
方式一:
set @@session.tx_isolation=‘read-uncommited‘;
方式二:
set session tx_isolation=‘read-uncommited‘;
二、自定义变量
说明:变量用户自定义、不是由系统的
使用步骤
声明
赋值
使用(查看 比较 运算)
1.用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域
应用在任何地方 也就是begin and 里面或外面
声明并初始化
set @用户变量名=值;或
set @用户变量名:=值;或
select @用户变量名:=值;
赋值(更新用户变量的值)
方式一:通过set或select
set @用户变量名=值;或
set @用户变量名:=值;或
select @用户变量名:=值;
方式二:通过select into
select 字段 into 变量名
from 表;
使用(查看用户变量的值)
select @用户变量名;
案例
声明并初始化
set @name=‘john‘;
set @name=100;
set @count=1;
赋值
select count(*) into @count
from employees;
查看
select @count;
2.局部变量
作用域:仅仅在定义它的begin end中有效
应用在 begin end中第一句话
声明
declare 变量 类型;
declare 变量 类型 default 值;
赋值
方式一:通过set或select
set @局部变量名=值;或
set @局部变量名:=值;或
select @局部变量名:=值;
方式二:通过select into
select 字段 into 局部变量名
from 表;
使用
select 局部变量名;
对比用户变量和局部变量
作用域 定义和使用的位置 语法
用户变量 当前会话 会话中的任何地方 必须加上@符号 不用限定类型
局部变量 begin end中 只能在begin end中且为第一句 一般不用加@ 需要限定类型
案例:声明两个变量并赋初值 求和并打印
1.用户变量
set @m=1;
set @n=2;
set @sum=@n+@m;
select @sum;
2.局部变量
declare m int default 1;
declare n int default 2;
declare sum int;
set sum=m+n;
select sum;
存储过程和函数
好处:
1.提高代码的重用性
2.简化操作
存储过程
含义:一组预先编译好的sql语句的集合,理解成批处理语句
1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数 提高了效率
一、创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end
注意:
1.参数列表包含三个部分
参数模式 参数名 参数类型
举例
in stuname varchar(20);
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值 可省略 call sp1(‘值‘);
out:该参数可以作为输出,也就是该参数可以作为返回值 set @name;call sp1(@name); select @name;
inout:该参数既可以作为输入又可以作为输出 也就是该参数需要调用方传入值 又需要返回值 set @name=值;call sp1(@name);select @name;
2.如果存储过程体只有一句话,begin end可以省略
存储过程体重的每条sql语句的结尾要求必须加分号;
存储过程的结尾可以使用delimiter重新设置
语法:
delimiter 结束标记
案例:
delimiter $
二、调用语法
call 存储过程名(实参列表)
1.空参列表
案例:插入到admin表中五条记录
delimiter $
create procedure myp1()
begin
insert into admin (username,password) values(‘john1‘,‘0000‘),(‘john2‘,‘0000‘),(‘john3‘,‘0000‘),(‘john4‘,‘0000‘),(‘john5‘,‘0000‘);
end $
1.调用
call myp1() $
2.创建带in模式参数的存储过程
案例1:创建存储过程 根据女神名查询对应的男神信息
create procedure myp2(in beautyName varchar(20))
begin
select bo.*
from boys bo
right join beauty b on bo.id = b.boyfriend_id
where b.name = beautyName;
end $
调用
call myp2(‘柳岩‘)$
案例2:创建存储过程实现 用户是否登陆成功
create procedure myp3(in username varchar(2),in password varchar(20))
begin
declare result varchar(20) default 0;#声明并初始化
select count(*) into result #赋值
from admin
where admin.username=username
and admin.password=password
select if(result>0,‘成功‘,‘失败‘);
end $
调用
call myp3(‘张飞‘,‘8888‘)$;
3。创建带out模式的存储过程
案例1:根据女神名返回对应的男神信息
create procedure myp5(in beautyName varchar(20),out boyName varchar(20))
begin
select bo.boyName into boyName
from boys bo
inner join beauty b on bo.id = b.boyfriend_id
where b.name=beautyName;
end $
调用
call myp5(‘小昭‘,@bName) $
select @bName$
案例2:根据女神名 返回对应的男神名和男神魅力值
create procedure myp6(in beautyName varchar(20),out boyName varchar(20),out userCP int)
begin
select bo.boyName bo.userCP into boyName,userCP
from boys bo
inner join beauty b on bo.id=b.boyfriend_id
where b.name=beautyName;
end $
调用
call myp6(‘小昭‘,@bName,@userCP)$
4.创建带inout模式参数的存储过程
案例1:传入a和b两个值 最终a和b都翻倍并返回
create procedure myp8(inout a int ,inout b int)
begin
set a=a*2;
set b=b*2;
end $
调用
set @m=10$
set @n=20$
call myp8(@m,@n)$
select m,n
删除存储过程
语法:drop procedure 存储过程名
drop procedure p1;
drop procedure p2,p3; x
三、查看存储过程的信息
show create procedure myp2;
函数
含义:一组预先编译好的sql语句的集合,理解成批处理语句
1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数 提高了效率
区别
存储过程:可以有0个返回,也可以有多个返回
函数 有且只有一个返回 适合做处理数据后返回一个结果
一、创建语法
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
注意:
1.参数列表 包含两个部分
参数名 参数类型
2.函数体: 肯定会有return语句 如果没有会报错
如果return语句没有放函数体最后也不报错 但不建议
return 值;
3.函数体中仅有一句话 则可以省略begin end
4.使用 delimiter语句设置结束标记
delimiter $;
二、调用语法
select 函数名(参数列表)
案例演示
1.无参有返回
案例:返回公司的员工个数
create function myf1() returns int
begin
declare c int default 0;定义变量
select count(*) into c
from employees
return c;
end $
select myf1()$
2.有参有返回
案例1:根据员工名 返回他工资
create function myf2(empName varchar(20)) returns double
begin
set @sal=0; 定义用户变量
select salary
from employees
where last_name=empName;
return @sal;
end $
select myf2(‘k_ing‘) $
案例2:根据部门名返回该部门的平均工资
create function myf3(deptName varchar(20)) returns double
begin
declare sal double;
select avg(salary) into sal
from employees e
join departments d on e.department_id=d.department_id
where d.department_name=deptName;
return sal;
end $
select myf3(‘IT‘)$
三、查看函数
show create function myf3;
四、删除函数
drop function myf3;
案例
一、创建函数 实现传入两个float 返回两者之和
create function test_fun1(num1 float,num2 float) returns float
begin
declare sum float default
set sum=num1+num2
return sum;
end $
select test_fun1(1,2) $
流程控制结构
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上 重复执行一段代码
一、分支结构
1.if函数
功能:实现简单的双分支
语法:
select if(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立 则if函数返回表达式2的值 否则返回表达式3的值
应用:任何地方
2.case结构
情况1:类似于java的switch语句 一般用于实现的等值判断
语法
case 变量|表达式|字段
when 要判断的值 then 返回值1或语句1;
when 要判断的值 then 返回值2或语句2;
....
else 要返回的值n或语句n;
end
情况2:类似java中的多重if语句 一般用于实现区间判断
case
when 要判断的条件1 then 返回值1或语句1;
when 要判断的条件2 then 返回值2或语句2;
....
else 要返回的值n或语句n;
end case;
特点:
可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end
可以作为独立的语句去使用 只能放在begin end中
如果when中的值或条件成立 则执行对应的then后面的语句 并且结束case
如果都不满足 则执行else中的语句或值
else介意省略 如果else省略 并且所有 的when条件都不满足 则返回null
案例
创建存储过程,根据传入成绩,来显示等级,比如传入成绩:90-100 显示A 80-90 显示B 60-80 显示 C 否则显示D
create procedure test_case(in score int)
begin
case
when score>=90 and score<=100 then select ‘A‘;
when score>=80 then select ‘B‘;
when score>=60 then select ‘C‘;
else select ‘D‘;
end case;
end $
call test_case(95)$
3.if结构
功能:实现多重分支
语法:
if条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;
应用在begin end中
案例1:根据传入成绩,来显示等级,比如传入成绩:90-100 返回A 80-90 返回B 60-80 返回 C 否则返回D
create function test_if(score int) returns char
begin
if score>=90 and score<=100 then return ‘A‘;
elseif score>=80 then return ‘B‘;
elseif score>=60 then return ‘C‘;
else return ‘D‘;
end if
end $
二、循环结构
分类
while loop repeat
循环控制
iterate类似于 continue 继续 结束本次循环 继续下次
leave 类似于break 跳出 结束当前所在循环
1.while
语法:
while 循环条件 do
循环体;
and while[标签];
联想:
while(循环条件)(
循环体;
)
2.loop
语法:
【标签:】loop
循环体
end loop 【标签】;
可以用来模拟简单的死循环
3.repeat
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat【标签】;
对比
没有添加循环控制语句时都可以省略名称 添加了循环控制语句(leave或iterate)则必须添加名称
loop 一般用于实现简单的死循环
while 先判断后执行
repeat 先执行后判断 无条件执行一次
案例:批量插入,根据次数插入到admin表中多条记录
drop procedure pro_while1;
create procedure pro_while1(in insertCount int)
begin
declare i int default 1;
while i<=insertCount do
insert into admin(username,password) values(concat(‘Rose‘+i),‘666‘);
set i=i+1;
end while a;
end $
call pro_while1(100) $
2.添加leave语句
案例:批量插入 根据次数差啊如到admin表中多条记录 如果次数>20则停止
truncate table admin$
drop procedure test_while1$
create procedure test_while1(in insertCount int)
begin
declare i int default 0;
a:while i<=insertCount do
set i=i+1;
if mod(i,2)!=0 then iterate a;
end if;
insert into admin(username,password) values(concat(‘xiaohua‘,i),‘0000‘);
end while a;
end $
call test_while1(100)$
以上是关于数据库第六天的主要内容,如果未能解决你的问题,请参考以下文章