zoukankan      html  css  js  c++  java
  • 数据库第六天

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

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

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

  • 相关阅读:
    常用正则
    存储过程里循环读取Array
    倒倒系列1
    利用HttpHandler生成静态页面
    古代人用拼音吗?
    确认Email无法复制粘贴
    C#调用OpenCV(一) 配置VS+OpenCV+Emgu cv
    ArcGIS Desktop9.3 (需要双击注册文件的破解包)在64位操作系统上的安装方法
    WebLogic console页面,localhost能登陆,IP不能登录
    javascript prototype学习(一)prototype的用处
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11721899.html
Copyright © 2011-2022 走看看