• MySQL数据库中使用判断条件


    在MySQL数据库中使用PHP语句可以直接得到想要的结果

      存储过程中定义局部变量:  declare语句

      declare 变量名 类型(长度) default 默认值;

      #num1 num2值互换#

    delimiter //
    CREATE PROCEDURE exchange (
        INOUT num1 INT (5),
        INOUT num2 INT (5)
    )
    BEGIN
    
    DECLARE tmp INT (5) DEFAULT 0 ;
    SET tmp = num1 ;
    SET num1 = num2 ;
    SET num2 = tmp ;
    END ;//
    
    
    SET @a = 100 ,@b = 200 ;//
    
    SELECT
        @a ,@b ;//
    
    CALL exchange (@a ,@b) ;//
    
    SELECT
        @a ,@b ;//

      【if】  #根据学生编号和学生成绩判断学生成绩等级90分-A 80分-B 70分-C 60分-D 60分以下-E#

      select 字段列表 into 变量列表 from 表 where 条件  将某条记录中的字段列表中的值存入到变量列表中,变量列表中的变量一定是提前定义的。

        格式:

          If 条件 then

            执行代码

          Else if 条件 then

            执行代码

            .....

          Else

            执行代码

          End if; 

    delimiter //
    CREATE PROCEDURE marks_level_if (
        IN stu_no INT (4),
        IN cla_no INT (4),
        OUT _level CHAR (4)
    )
    BEGIN
    
    DECLARE _mark INT (4) DEFAULT 0 ; SELECT
        mark INTO _mark
    FROM
        marks
    WHERE
        sid = stu_no
    AND cid = cla_no ;
    IF _mark >= 90 THEN SET _level = "A" ;
    ELSEIF _mark
    >= 80 THEN SET _level = "B" ;
    ELSEIF _mark
    >= 70 THEN SET _level = "C" ;
    ELSEIF _mark
    >= 60 THEN SET _level = "D" ;
    ELSE SET _level = "E" ;
    ENDIF ; END ;// SET @result = "" ;// CALL marks_level_if (1, 1 ,@result) ;// SELECT @result ;//

      【case】  #根据学生编号和学生成绩判断学生成绩等级90分-A 80分-B 70分-C 60分-D 60分以下-E#

        CASE 变量

          WHEN 值1 THEN 代码1

          WHEN 值2  THEN 代码2 ...

          ELSE 代码n

        END CASE

      Or:

        CASE

          WHEN  条件1 THEN 代码1

          WHEN  条件2  THEN 代码2 ...

        ELSE 代码n

        END CASE;

    delimiter //
    CREATE PROCEDURE marks_level_case (
        IN stu_no INT (4),
        IN cla_no INT (4),
        OUT _level CHAR (4)
    )
    BEGIN
    
    DECLARE _mark INT (4) DEFAULT 0 ; SELECT
        mark INTO _mark
    FROM
        marks
    WHERE
        sid = stu_no
    AND cid = cla_no ; 
    CASE
    WHEN _mark >= 90 THEN SET _level = "A" ; WHEN _mark >= 80 THEN SET _level = "B" ; WHEN _mark >= 70 THEN SET _level = "C" ; WHEN _mark >= 60 THEN SET _level = "D" ; ELSE SET _level = "E" ; END CASE ; END ;// SET @result = "" ;// CALL marks_level_case (1, 2 ,@result) ;// SELECT @result ;//

      【while】  #1-10累加的和#

        while循环结构

          格式:

        while 条件 do

          代码

        end while;

    delimiter //
    CREATE PROCEDURE marks_level_while (IN num INT(5), INOUT sum INT(5))
    BEGIN
    
    WHILE num > 0 DO
    
    SET sum = sum + num ;
    SET num = num - 1 ;
    ENDWHILE ;
    END ;//
    
    
    SET @result = 0 ;//
    
    CALL marks_level_while (10 ,@result) ;//
    
    SELECT
        @result ;//

      【repeat】  #1-10累加的和#

        repeat

          循环体

        until 条件

        end repeat;

    delimiter //
    CREATE PROCEDURE marks_level_repeat (IN num INT(5), INOUT sum INT(5))
    BEGIN
    
    REPEAT
    SET sum = sum + num ; SET num = num - 1 ; UNTIL num = 0 END REPEAT; END ;// SET @result = 0 ;// CALL marks_level_repeat (10 ,@result) ;// SELECT @result ;//

      【loop】  #1-10累加的和#

        ITERATE 循环体名字: 继续循环

        Leave  循环体名字: 退出循环

        循环名字:Loop

          if 条件 then

            leave   循环体名字

          else

            iterate 循环体名字

          end if;

          if 条件 then

            leave   循环体名字

          else

            iterate 循环体名字

          end if;

        end loop;

    delimiter //
    CREATE PROCEDURE marks_level_loop (IN num INT(5), INOUT sum INT(5))
    BEGIN
        lp :
    LOOP
    
    IF num > 0 THEN
    
    SET sum = sum + num ;
    END IF ;
    SET num = num - 1 ;
    IF num <= 0 THEN
        LEAVE lp ;
    ELSE
        ITERATE lp ;
    END IF ;
    END LOOP;
    END ;//
    
    
    SET @result = 0 ;//
    
    CALL marks_level_loop (10 ,@result) ;//
    
    SELECT
        @result ;//

      【cursor】  #根据学生编号和学生成绩判断学生成绩等级 90分发500 80分发400 70分发300#

        游标: mysql中用来存放查询结果记录的一种数据集合。

        设置了错误句柄: 

          declare continue/exit  handler for sqlsate '错误'   set 语句

                监视错误句柄的操作      设置监视句柄监视的错误码  执行了错误操作后,执行的语句

        游标的定义:将查询结果存入游标中

          declare 游标名 cursor for select语句。

        打开游标

          open 游标名

        从游标中取出数据:变量列表要和游标中的查询字段数据和类型一一对应。

          fetch 游标名 into 变量列表

          获取数据时,如果游标中没有了数据,报出02000的错误,然后执行错误句柄。

        关闭游标:

          close 游标名

    /* 存储过程游标控制结构 */
    delimiter //
    CREATE PROCEDURE marks_level_cursor ()
    BEGIN
    
    DECLARE stu_no INT (4) DEFAULT 0 ;
    DECLARE cla_mark INT (4) DEFAULT 0 ;
    DECLARE tag INT (4) DEFAULT 0 ;
    DECLARE moneys INT (4) DEFAULT 0 ;
    DECLARE cur CURSOR FOR SELECT
        s.sid,
        m.mark
    FROM
        students s
    LEFT JOIN marks m ON s.sid = m.sid ;
    DECLARE EXIT HANDLER FOR SQLSTATE "02000"
    SET tag = 1 ; OPEN cur ;
    WHILE ! tag DO
        FETCH cur INTO stu_no,
        cla_mark ;
    IF cla_mark >= 90 THEN
    SET moneys = 500 ;
    ELSEIF cla_mark
    >= 80 THEN SET moneys = 400 ;
    ELSEIF cla_mark
    >= 70 THEN SET moneys = 300 ;
    ELSE SET moneys = 100 ; ENDIF ;

    UPDATE students SET moneys = moneys WHERE sid = stu_no ; ENDWHILE ;

    CLOSE cur ; END ;// CALL marks_level_cursor () ;// SELECT * FROM students ;//

        触发器:可以自动执行的mysql程序逻辑,用户对表执行了某个操作后,系统自动调用的程序逻辑。

          插入,删除,修改操作后,系统自动调用.
          mysql中只支持单触发器:一个表的一个操作上只能有一个函数。
          触发器和其他视图,存储过程不同,他只能依附在表机构中,没有独立的文件。
          格式:
            create trigger 触发器名()
            before|after
            insert|update|delete
            on 表名
            for each row 每一条记录都要调用触发器
            begin
              触发器代码。
            end;
          触发触发器时间:
            before:操作之前
            after:操作之后
          触发行为: 就是在什么操作上创建触发器
            insert
            update
            delete
          insert table student("sex") value("men")
          关键字:
            old: 老数据
            news: 新数据
            插入: 只有新数据,没有老数据。 news.sex
            修改:被修改的记录时老数据,即将替换的数据,是new数据
            删除:只有老数据,没有新数据(老数据:即将删测那条记录)

      【trigger】  #插入内容前修改插入内容 插入"南京"时 自动插入"NJ_南京"#

    delimiter //
    CREATE TRIGGER insert_students_trigger BEFORE INSERT ON students FOR EACH ROW
    BEGIN
    
    IF new.addr = "山东" THEN
    SET new.addr = "SD_山东" ;
    
    ELSEIF new.addr = "上海" THEN
    SET new.addr = "SH_上海" ;
    
    ELSEIF new.addr = "南京" THEN
    SET new.addr = "NJ_南京" ;
    
    END IF ;
    END ;//

      【trigger】  #删除学生信息时,把相关成绩删除#

    delimiter //
    CREATE TRIGGER delect_students_trigger BEFORE DELETE ON marks FOR EACH ROW
    BEGIN
    
    DECLARE stu_no INT (4) DEFAULT 0 ; 
    SELECT sid INTO stu_no FROM students WHERE sid = old.sid;
    IF stu_no THEN
        DELETE
    FROM
        marks
    WHERE
        sid = stu_no ;
    ENDIF;
    END ;//
  • 相关阅读:
    判断页面访问端是电脑还是手机?
    Vue使用总结
    JS面向对象,创建,继承
    你不得不知的逻辑或(||)与(&&)非(!)
    前端必备PS技巧
    你真的熟悉background吗?
    JS运动从入门到兴奋1
    过目不忘JS正则表达式
    W3C、MDN及html常用标签介绍
    js数据处理-----数据拷贝
  • 原文地址:https://www.cnblogs.com/shuo-128/p/6892146.html
Copyright © 2020-2023  润新知