数据库第六天

            变量
            系统变量
            全局变量
            会话变量

            自定义变量
            用户变量
            局部变量

            注意:如果是全局级别 则需要加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 @[email protected][email protected];
            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)$

            相关文章
            相关标签/搜索
            王中王鉄算盘开奖结果小说 淅川县| 高阳县| 梅州市| 衡水市| 永德县| 辛集市| 仙桃市| 云林县| 无极县| 周至县| 简阳市| 东乌珠穆沁旗| 永平县| 深圳市| 怀远县| 青田县| 湖北省| 灌南县| 台南县| 阜康市| 新宾| 铜梁县| 永济市| 宾阳县| 辽宁省| 汝城县| 黑龙江省| 湟中县| 扎鲁特旗| 年辖:市辖区| 贡觉县| 岑巩县| 蓬安县| 确山县| 阜新| 光山县| 灌阳县| http://fa.hz0j1r6vo.fun http://fa.hz0j1r7vo.fun http://fa.hz0j2r7vo.fun http://fa.hz0j2r4vo.fun http://fa.hz0j0r3vo.fun