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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM