SQL-变量

#二、自定义变量
/*
说明:变量是用户自定义,不是系统的
步骤:
    申明
    赋值
    使用(查看、比较、运算符)
(1)用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域---申明时必须初始化
应用在任何地方,也就是begin end
*/

    #1.1、声明并初始化
    #赋值的操作符:=或者:=
        SET @name='qq';
        SET @name:=1; #可以执行,弱类型
        SELECT @name:='qq';

    #1.2、赋值(更新用户变量的值)
        #(1)方式1:同上
            SET @name='qq';
            SET @name:='qq';
            SELECT @name:='qq';
        #(2)方式二:
            SELECT 字段 INTO 变量名
            FROMSELECT COUNT(*) INTO @count
            FROM `employees`;
            
            SELECT @count;
            
    #1.3、查看
        SELECT @count;
        
#(2)、局部变量
    #作用域:仅仅在定义它的begin end 中有效,应用在begin end的第一句话
    
    #1.1声明
    DECLARE 变量名 类型;#局部变量可以不初始化
    DECLARE 变量名 类型 DEFAULT 值;
    
    #1.2 赋值
    #(1)方式1:
            SET NAME='qq';
            SET NAME:='qq';
            SELECT @name:='qq'; #注意select仍然要加@
    #(2)方式二:
            SELECT 字段 INTO 局部变量名
            FROM 表
            
    #1.3、查看
        SELECTcount’;#注意select不要加@
        
#(3)局部和用户变量的对比
        作用域        定义和使用的位置        语法
用户变量    当前会话    会话的任何地方            必须加@,不用限定类型

局部变量    BEGIN END 中    只能 BEGIN END 中,且为第一句话    一般不用加@,需要限定类型

#练习,申明2个变量并赋值,求和并打印

    #(1)用户变量
    SELECT @count_1:=2;
    SET @count_2:=2;
    SELECT (@count_1 + @count_2);
    
    #(2)局部变量
    BEGIN
    DECLARE count_3 INT DEFAULT 2;
    DECLARE count_4 INT DEFAULT 2;
    DECLARE SUM INT;
    SET SUM=count_3 + count_4;
    END


    
# 存储过程和函数
/*
类似Java中的方法
好处:提高代码的重用行、简化操作


#1.存储过程
1.1含义:一组预先编译好的SQL语句,理解成批处理语句(减少了编译过程和数据库服务器的连接次数,节省时间)
1.2语法:
    1.2.1 创建过程
        create procedure 存储过程名(参数列表)
        begin
            存储过程体(这一组合法的SQL语句)
        end
        
        注意
        1、参数列表包含三部分
        参数模式 参数名 参数类型
        举例:
        in stuname varchar(20)    
        
        ---参数模式:
            IN 该参数可以作为输入,也就是该参数需要调用方 传入值
            OUT 该参数可以作为输出,也就是该参数可以作为返回值   
            INOUT 该参数可以作为输出,也可以作为输入,也就是该参数急需要传入,又可以返回值
        2、如果存储过程体只有一句话,begin end 可以省略
            存储过程体的每条SQL语句的结尾要求必须要加分号
            存储过程的结尾 可以使用 delimiter 重新设置
        语法:
            delimiter 结束标记
    1.2.2 调用
        call 存储过程名(实参列表);
    
    #案例:插入到girls.admin 表五条记录
    
*/
    #案例1:插入到girls.admin 表五条记录(无参数列表)
        #定义存储过程:
        DELIMITER $
        CREATE PROCEDURE myp1()
        BEGIN
            INSERT INTO `admin`(`username`,`password`) 
            VALUES('aa',11),('aa',11),('aa',11);
        END $
        
        #调用存储过程
        CALL myp1();
        
    #案例2:创建存储过程实现,用户是否登录成功(IN)
        #(1)定义存储过程
        DELIMITER $
        CREATE PROCEDURE login2(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
        BEGIN
            #初始化
            DECLARE result INT DEFAULT 0;
            
            #赋值
            SELECT COUNT(*) INTO result
            FROM `admin`
            WHERE `admin`.`username` = `username`
            AND `admin`.`password` = PASSWORD;
            
            #查询
            SELECT IF(result >0,'成功','失败');
                        
        END $
        
        #(2)调用存储过程
        CALL login2('aa','11') #这里不加分号,在cmd窗口加$
    
    # 案例3:根据女生名,返回对应的男神名(in,out)
    DELIMITER $
    CREATE PROCEDURE searchBoy(IN beautyname VARCHAR(20),OUT boyname VARCHAR)
    BEGIN
        SELECT bo.`boyName` INTO boyname
        FROM `beauty` b
        INNER JOIN `boys` bo
        ON b.`boyfriend_id` = bo.`id`
        WHERE b.name = beautyname;
    
    END $
    
    CALL searchBoy("李姐",@bName)
    SELECT @bName; #用户变量(@bName),需要赋值才能使用,这里的call也相当于赋值    
    
    # 案例4:传入a和b两个值,最终a\b都返回(inout)
    DELIMITER $
    CREATE PROCEDURE myp2(INOUT number1 INT,INOUT number2 INT)
    BEGIN
        SET number1 = number1*2;
        SET number2 = number2*2;
    END $
    
    SET @n1=10;
    SET @n2=20;
    CALL myp2(@n1,@n2)
    SELECT @n1,@n2;
    

 

#二、自定义变量/*说明:变量是用户自定义,不是系统的步骤:申明赋值使用(查看、比较、运算符)(1)用户变量作用域:针对于当前会话(连接)有效,同于会话变量的作用域---申明时必须初始化应用在任何地方,也就是begin end*/
#1.1、声明并初始化#赋值的操作符:=或者:=SET @name='qq';SET @name:=1; #可以执行,弱类型SELECT @name:='qq';
#1.2、赋值(更新用户变量的值)#(1)方式1:同上SET @name='qq';SET @name:='qq';SELECT @name:='qq';#(2)方式二:SELECT 字段 INTO 变量名FROM 表SELECT COUNT(*) INTO @countFROM `employees`;SELECT @count;#1.3、查看SELECT @count;#(2)、局部变量#作用域:仅仅在定义它的begin end 中有效,应用在begin end的第一句话#1.1声明DECLARE 变量名 类型;#局部变量可以不初始化DECLARE 变量名 类型 DEFAULT 值;#1.2 赋值#(1)方式1:SET NAME='qq';SET NAME:='qq';SELECT @name:='qq'; #注意select仍然要加@#(2)方式二:SELECT 字段 INTO 局部变量名FROM 表#1.3、查看SELECT ‘count’;#注意select不要加@#(3)局部和用户变量的对比作用域定义和使用的位置语法用户变量当前会话会话的任何地方必须加@,不用限定类型
局部变量BEGIN END 中只能 BEGIN END 中,且为第一句话一般不用加@,需要限定类型
#练习,申明2个变量并赋值,求和并打印
#(1)用户变量SELECT @count_1:=2;SET @count_2:=2;SELECT (@count_1 + @count_2);#(2)局部变量BEGINDECLARE count_3 INT DEFAULT 2;DECLARE count_4 INT DEFAULT 2;DECLARE SUM INT;SET SUM=count_3 + count_4;END

# 存储过程和函数/*类似Java中的方法好处:提高代码的重用行、简化操作

#1.存储过程1.1含义:一组预先编译好的SQL语句,理解成批处理语句(减少了编译过程和数据库服务器的连接次数,节省时间)1.2语法:1.2.1 创建过程create procedure 存储过程名(参数列表)begin存储过程体(这一组合法的SQL语句)end注意1、参数列表包含三部分参数模式 参数名 参数类型举例:in stuname varchar(20)---参数模式:IN 该参数可以作为输入,也就是该参数需要调用方 传入值OUT 该参数可以作为输出,也就是该参数可以作为返回值   INOUT 该参数可以作为输出,也可以作为输入,也就是该参数急需要传入,又可以返回值2、如果存储过程体只有一句话,begin end 可以省略存储过程体的每条SQL语句的结尾要求必须要加分号存储过程的结尾 可以使用 delimiter 重新设置语法:delimiter 结束标记1.2.2 调用call 存储过程名(实参列表);#案例:插入到girls.admin 表五条记录*/#案例1:插入到girls.admin 表五条记录(无参数列表)#定义存储过程:DELIMITER $CREATE PROCEDURE myp1()BEGININSERT INTO `admin`(`username`,`password`) VALUES('aa',11),('aa',11),('aa',11);END $#调用存储过程CALL myp1();#案例2:创建存储过程实现,用户是否登录成功(IN)#(1)定义存储过程DELIMITER $CREATE PROCEDURE login2(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))BEGIN#初始化DECLARE result INT DEFAULT 0;#赋值SELECT COUNT(*) INTO resultFROM `admin`WHERE `admin`.`username` = `username`AND `admin`.`password` = PASSWORD;#查询SELECT IF(result >0,'成功','失败');END $#(2)调用存储过程CALL login2('aa','11') #这里不加分号,在cmd窗口加$# 案例3:根据女生名,返回对应的男神名(in,out)DELIMITER $CREATE PROCEDURE searchBoy(IN beautyname VARCHAR(20),OUT boyname VARCHAR)BEGINSELECT bo.`boyName` INTO boynameFROM `beauty` bINNER JOIN `boys` boON b.`boyfriend_id` = bo.`id`WHERE b.name = beautyname;END $CALL searchBoy("李姐",@bName)SELECT @bName; #用户变量(@bName),需要赋值才能使用,这里的call也相当于赋值# 案例4:传入a和b两个值,最终a\b都返回(inout)DELIMITER $CREATE PROCEDURE myp2(INOUT number1 INT,INOUT number2 INT)BEGINSET number1 = number1*2;SET number2 = number2*2;END $SET @n1=10;SET @n2=20;CALL myp2(@n1,@n2)SELECT @n1,@n2;

posted @ 2021-08-29 22:15  低手寂寞  阅读(915)  评论(0编辑  收藏  举报