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 ;//

 

posted @ 2017-05-23 00:02  Shuo_128  阅读(10096)  评论(0编辑  收藏  举报