一:变量

(1)分类:

  1. 系统变量:
    1. 全局变量
    2. 会话变量
  2. 自定义变量:
    1. 用户变量
    2. 局部变量

      (2)系统变量

      1. #一:系统变量
      2. /*
      3. 说明:变量由系统提供,不是用户定义,属于服务器层面。
      4. 注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session。
      5. 全局变量的作用域:服务器每次启动将为所有的全局变量赋初始值,针对所有的会话(连接)有效,但不能跨重启。
      6. 会话变量的作用域:仅仅针对于当前会话(连接)有效。
      7. */
      8. #1.查看所有的系统变量
      9. #(1).查看所有的全局变量
      10. SHOW GLOBAL VARIABLES;
      11. #(2).查看所有的会话变量
      12. SHOW SESSION VARIABLES;
      13. #2.查看满足条件的部分系统变量
      14. SHOW GLOBAL VARIABLES LIKE '%char%';
      15. #3.查看指定的某个系统变量的值
      16. /*
      17. 语法:SELECT @@global|【session】.系统变量名;
      18. 例如:SELECT @@global.character_set_system;
      19. */
      20. #4.为某个系统变量赋值
      21. /*
      22. 语法一:set global|【session】系统变量名=值;
      23. 语法二:set @@global|【session】.系统变量名=值;
      24. */

      (3)自定义变量

      ```sql

      二:自定义变量

      / 说明:变量是用户自定义的,不是系统给的。 使用步骤: 声明 赋值 使用(查看、比较、运算等) /

1.用户变量

/ 作用域:针对于当前会话(连接)有效,同于会话变量的作用域 可以应用在任何地方,也就是begin end里面或外面。 / / (1)声明并初始化 set @用户变量名=值; set @用户变量名:=值; select @用户变量名:=值; (2)赋值(更新用户变量的值) 方式一:通过set或select SET @用户变量名=值; SET @用户变量名:=值; SELECT @用户变量名:=值; 方式二:通过SELECT into select 字段 into @变量名 from 表; (3)使用(查看用户变量的值) select @用户变量名; /

2.局部变量

/ 作用域:仅仅在定义它的begin end中有效。 应用在begin end中的第一句话!!! / / 1.声明 declare 变量名 类型; declare 变量名 类型 default 值; 2.赋值 方式一:通过set或select SET 局部变量名=值; SET 局部变量名:=值; SELECT @局部变量名:=值; 方式二:通过SELECT into select 字段 into 局部变量名 from 表; 3.使用 select 局部变量名; /

案例:声明两个变量并赋初始值,求和,打印

1.用户变量

SET @m=1; SET @n=2; SET @sum=@m+@n; SELECT @sum;

  1. <a name="4gO4O"></a>
  2. #### 用户变量和局部变量的比较:
  3. | | 作用域 | 定义和使用的位置 | 语法 |
  4. | --- | --- | --- | --- |
  5. | 用户变量 | 当前会话 | 会话中的任何地方 | 必须加@符号,不用限定类型 |
  6. | 局部变量 | begin end 中 | 只能在begin end中,且为第一句话 | 一般不用加@符号,需要限定类型 |
  7. <a name="J55c2"></a>
  8. ## 二:存储过程
  9. <a name="csC6M"></a>
  10. ### (1)梗概
  11. ```sql
  12. #存储过程和函数
  13. /*
  14. 存储过程和函数:类似于java中的方法
  15. 好处:
  16. 1.提高代码的重用性
  17. 2.简化操作
  18. */
  19. #存储过程
  20. /*
  21. 一组预先编译好的SQL语句的集合,理解成批处理语句
  22. 好处:
  23. 1.提高代码的重用性
  24. 2.简化操作
  25. 3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
  26. */
  27. #一:创建存储过程
  28. /*
  29. create procedure 存储过程名(参数列表)
  30. begin
  31. 存储过程体(一组合法的SQL语句)
  32. end
  33. 注意:
  34. 1.参数列表包含三部分
  35. 参数模式 参数名 参数类型
  36. 举例:
  37. in stuname varchar(20)
  38. 参数模式:
  39. in:该参数可以作为输入,也就是该参数需要调用方传入值。
  40. out:该参数可以作为输出,也就是该参数可以作为返回值。
  41. inout:该参数既可以作为输入又可以作为输出,也就是该参数既可以传入值又可以返回值。
  42. 2.如果存储过程体仅仅只有一句话,begin end可以省略。
  43. 存储过程体中的每条SQL语句的结尾要求必须加分号。
  44. 存储过程的结尾可以使用delimiter重新设置。
  45. 语法:delimiter 结束标记
  46. 例如:delimiter $
  47. */
  48. #二:调用存储过程
  49. /*
  50. 语法:
  51. call 存储过程名(实参列表);
  52. */

(2)空参的存储过程

#1.空参的存储过程
#案例:插入到admin表中五条记录
    #(1)创建
    DELIMITER $
    CREATE PROCEDURE myp1()
    BEGIN
        INSERT INTO `admin`(username,`password`)
        VALUES('join','00000'),
            ('zjl','11111'),
            ('fws','22222'),
            ('zzf','33333'),
            ('lh','44444');
    END $
    #(2)调用
    CALL myp1() $

(3)带in模式的存储过程

#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 $
    #(2)调用
    CALL myp2('周芷若') $

(4)带out模式的存储过程

#3.带out模式参数的存储过程
#案例:创建存储过程实现,根据女神名,返回对应的男神名
    #(1)创建
    CREATE PROCEDURE myp3(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 $
    #(2)调用
    CALL myp3('周芷若',@bName) $
    SELECT @bName $ #查看返回结果

  #案例二:创建存储过程实现,根据女神名,返回对应的男神名和男神魅力值
    #(1)创建
    CREATE PROCEDURE myp4(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 $
    #(2)调用
    CALL myp4('小昭',@bName,@usercp) $
    SELECT @bName,@usercp $ #查看返回结果

(5)带inout模式的存储过程

#4.带inout模式的存储过程
#案例:传入a和b两个值,最终a和b都翻倍并返回。
    #(1)创建
    CREATE PROCEDURE myp5(INOUT a INT,INOUT b INT)
    BEGIN
        SET a=a*2;
        SET b=b*2;
    END $
    #(2)调用
    SET @m=10 $
    SET @n=20 $
    CALL myp5(@m,@n) $
    SELECT @m,@n; # 20,40

(6)存储过程的删除和查看

#存储过程的删除
/*
语法:
    drop procedure 存储过程名;    #存储过程名无括号
注意:存储过程名一次只能删除一个。
*/

#查看存储过程的信息
/*
语法:
    show create procedure 存储过程名; #存储过程名无括号
*/
SHOW CREATE PROCEDURE myp1;

三:函数

(1)梗概

#函数
/*
一组预先编译好的SQL语句的集合,理解成批处理语句
好处:
    1.提高代码的重用性
    2.简化操作
    3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
与存储过程的区别:
    存储过程:可以有0个返回,也可以有多个返回。适合做批量插入、批量更新。
    函数:有且仅有1个返回。适合做处理数据后返回一个结果。
*/

/*
一:创建语法:
    create function 函数名(参数列表) returns 返回类型
    begin
        函数体
    end
注意:
    1.参数列表包含两部分:参数名 参数类型
    2.函数体:肯定会有return语句,如果没有会报错。如果return语句没有放在函数体的最后也不会报错,但不建议。
    3.和存储过程一样,如果函数体只有一句话的话,则可以省略begin end.
    4.使用delimiter语句设置结束标记。
二:调用语法:
    select 函数名(参数列表)
*/

(2)无参有返回函数

#1.无参有返回
#案例:返回公司的员工个数
    #(1)创建
    CREATE FUNCTION myf1() RETURNS INT
    BEGIN
        DECLARE c INT DEFAULT 0; #定义局部变量
        SELECT COUNT(*) INTO c #为变量赋值
        FROM employees;
        RETURN c; 
    END $
    #(2)调用
    SELECT myf1() $

(3)有参有返回函数

#2.有参有返回
#案例:根据员工名,返回他的工资
    #(1)创建
    CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
        SET @sal=0; #定义用户变量
        SELECT salary INTO @sal #赋值
        FROM employees
        WHERE last_name = empName;
        RETURN @sal; 
    END $
    #(2)调用
    SELECT myf2('K_ing') $

(4)函数的查看和删除

#查看函数
/*
语法:
    show create function 函数名; #此时的函数名无括号
*/
SHOW CREATE FUNCTION myf1;

#删除函数
/*
语法:
    drop function 函数名; #此时的函数名无括号
*/
DROP FUNCTION myf1;