首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 編程核心技術:分隔符、變量、流程控制、自定義函數與存儲過程實戰

     編輯:MySQL 綜合教學

MySQL 編程核心技術:分隔符、變量、流程控制、自定義函數與存儲過程實戰

MySQL 提供過程化編程能力,支持變量、流程控制、自定義函數 (UDF)、存儲過程、觸發器。本文系統梳理語法規則、作用域陷阱、最佳實踐模式。

一、語句分隔符

-- 默認 ; 和 \g (僅命令行)
DELIMITER $$  -- 臨時修改為 $$
-- 函數/過程體內部用 ; 結尾
END$$
DELIMITER ;   -- 恢復默認

二、註釋風格

  • 單行:# comment、-- comment (雙減號後需空格)
  • 多行:/* comment */

三、變量體系

類型語法作用域生命周期
系統變量SHOW VARIABLES LIKE 'pat%'; SET GLOBAL sort_buffer_size=...全局/會話服務運行期
用戶會話變量SET @var=val; SELECT @var;會話級連接斷開失效
局部變量DECLARE var TYPE DEFAULT val; (僅 BEGIN...END 內)塊級塊結束失效

⚠️ 陷阱:函數/過程內使用 @var 會污染會話變量,必須用 DECLARE 定義局部變量。

四、流程控制

條件分支

IF cond1 THEN ... ELSEIF cond2 THEN ... ELSE ... END IF;
CASE var WHEN v1 THEN ... WHEN v2 THEN ... ELSE ... END CASE;

循環結構

  • WHILE cond DO ... END WHILE; (先判斷)
  • REPEAT ... UNTIL cond END REPEAT; (後判斷,至少一次)
  • LOOP ... END LOOP; (無條件,配合 LEAVE label、ITERATE label)
-- 帶標籤循環
my_loop: LOOP
    SET i = i + 1;
    IF i = 5 THEN ITERATE my_loop; END IF;  -- 跳過本輪
    IF i > 10 THEN LEAVE my_loop; END IF;   -- 跳出循環
END LOOP my_loop;

五、自定義函數 (UDF)

DROP FUNCTION IF EXISTS my_sum;
DELIMITER $$
CREATE FUNCTION my_sum() RETURNS INT
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE sum INT DEFAULT 0;
    WHILE i <= 100 DO
        SET sum = sum + i;
        SET i = i + 1;
    END WHILE;
    RETURN sum;
END$$
DELIMITER ;

SELECT my_sum();  -- 5050
  • 綁定數據庫,隨庫刪除而刪除。
  • 參數默認 IN,支持 OUT/INOUT (過程專用,函數僅支持 IN)。
  • 決定性聲明:DETERMINISTIC (相同輸入必得相同輸出),利於優化器緩存。

六、內置函數速查

分類常用函數
數值ABS()、CEIL()、FLOOR()、ROUND(x,d)、RAND()、MOD()
字符串CONCAT()、SUBSTRING()、TRIM()、REPLACE()、LPAD/RPAD()、LOWER/UPPER()
日期NOW()、CURDATE()、DATE_FORMAT()、UNIX_TIMESTAMP()、FROM_UNIXTIME()
流程控制IF()、IFNULL()、CASE WHEN
信息DATABASE()、VERSION()、USER()、INET_ATON/NTOA()

七、應用場景

  • 存儲過程:複雜業務邏輯封裝、批量數據處理、報表生成。
  • 存儲函數:可在 SQL 中調用的可復用計算邏輯 (如計算年齡、格式化金額)。
  • 觸發器:審計日志、衍生列維護、跨表同步。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved