一、语句块、注释和重置命令结束标记
1. 语句块
BEGIN
SQL语句 | SQL语句块
END
说明:
① BEGIN…END语句块包含了该程序块的所有处理操作,允许语句块嵌套。
② 在MySQL中单独使用BEGIN…END语句块没有任何意义,只有将其封装在存储过程、存储函数、触发器等存储程序内部才有意义。
2. 注释
1)单行注释
使用“##”符号作为单行语句的注释符,写在需要注释的行或语句单方。
【例3-24】示例。
##取两个数的最大值
SET @x=5,@y=6; ##定义两个变量并赋值
SELECT IF(@x>@y,@x,@y) 最大值;
2)多行注释
使用/*和*/括起来可以连续书写多行的注释语句。
3. 重置命令结束标记
DELIMITER 符号
【说明】
(1)符号可以是一些特殊符号,如两个“#”、两个“@”、两个“$”、两个“%”等。但避免使用反斜杠“/”字符,因为它是MySQL的转义字符。
(2) 恢复使用分号作为结束标记,执行 DELIMITER ; 命令即可。
二、存储函数
1. 存储函数的创建:
CREATE FUNCTION 函数名([参数名 参数数据类型[,…]])
RETURNS 函数返回值的数据类型
BEGIN
函数体;
RETURN 语句;
END
注意:搭配delimiter表征开始和结束
2. 调用存储函数
SELECT 函数名([参数值[,…]])
DELIMITER @@
CREATE FUNCTION name_f1(dno DECIMAL(2))
RETURNS VARCHAR(14)
BEGIN
RETURN(SELECT dname FROM dept
WHERE deptno=dno);
END@@
DELIMITER;
SELECT name_f1(20);
3. 删除存储函数
DROP FUNCTION 函数名;
注:函数名后面不要加括号。
三、条件判断语句
1. 程序中变量的使用
1)声明变量
DECLARE 局部变量名[,局部变量名,……] 数据类型 [DEFAULT 默认值];
2)为变量赋值
SET 局部变量名=表达式1
[,局部变量名=表达式2,……];
2.IF语句
1)形式一
IF <条件> THEN
SQL语句块1;
[ELSE
SQL语句块2; ]
END IF;
补充:在这里出现问题:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法
在MySQL中创建函数时出现这种错误的解决方法:set global log_bin_trust_function_creators=TRUE;
例题:判断是否为闰年
DELIMITER @@
DROP FUNCTION IF EXISTS leap_year@@
CREATE FUNCTION leap_year(a int)
RETURNS VARCHAR(255)
BEGIN
IF((a%4=0 AND a%100<>0)OR a%400=0) THEN
RETURN '是闰年';
ELSE
RETURN '不是闰年';
END IF;
END@@
DELIMITER;
SELECT leap_year(2001);
2)形式二
IF <条件1> THEN
SQL语句块1;
ELSEIF <条件2> THEN
SQL语句块2;
……
ELSE
SQL语句块n;
END IF;
3.CASE语句
1)形式一
CASE <表达式>
WHEN <表达式值1> THEN SQL语句块1;
WHEN <表达式值2> THEN SQL语句块2;
……
WHEN <表达式值n> THEN SQL语句块n;
[ ELSE SQL语句块n+1; ]
END;
【例3-32】判断显示emp表中前3条记录的姓名和职务。
SELECT ename 姓名,CASE Job
WHEN '测试' THEN '工程师'
WHEN '设计' THEN '设计总监'
ELSE '经理'
END AS 职务
FROM emp LIMIT 3;
2)形式二
CASE
WHEN <条件1> THEN SQL语句块1;
WHEN <条件2> THEN SQL语句块2;
……
WHEN <条件n> THEN SQL语句块n;
ELSE SQL语句块n+1;
END;
【例3-33】 判断显示emp表前3条记录的姓名ename、基本工资sal和工资等级。
SELECT ename,sal,CASE
WHEN sal BETWEEN 700 AND 1200 THEN '一级'
WHEN sal BETWEEN 1201 AND 1400 THEN '二级'
WHEN sal BETWEEN 1401 AND 2000 THEN '三级'
WHEN sal BETWEEN 2001 AND 3000 THEN '四级'
ELSE '五级'
END 工资等级
FROM emp LIMIT 3;
四、循环语句
1.LOOP循环
标签:LOOP
SQL语句块;
IF <条件表达式> THEN
LEAVE 标签;
END IF;
END LOOP;
【例3-34】LOOP循环语句示例。创建sum_fn()存储函数,返回1~n的和。
DELIMITER @@
DROP FUNCTION IF EXISTS sum_fn@@
CREATE FUNCTION sum_fn(n int)
RETURNS INT
BEGIN
DECLARE s,i INT;
SET s=0,i=1;
loop_label: LOOP
SET s=s+i;
SET i=i+1;
IF i>n THEN
LEAVE loop_label;
END IF;
END LOOP;
RETURN s;
END@@
DELIMITER ;
SELECT sum_fn(5);
2.WHILE循环
WHILE <条件表达式> DO
SQL语句块;
END WHILE;
【例3-35】WHILE循环语句示例。创建sum_fn()存储函数,返回1~n的和。
DELIMITER @@
DROP FUNCTION IF EXISTS sum_fn@@
CREATE FUNCTION sum_fn(n int)
RETURNS INT
BEGIN
DECLARE s,i INT;
SET s=0,i=1;
WHILE i<=n DO
SET s=s+i;
SET i=i+1;
END WHILE;
RETURN s;
END@@
DELIMITER ;
SELECT sum_fn(5);
3.REPEAT循环
REPEAT
SQL语句块;
UNTILE <条件表达式>
END REPEAT;
【例3-36】REPEAT循环语句示例。创建sum_fn()存储函数,返回1~n的和。
DELIMITER @@
DROP FUNCTION IF EXISTS sum_fn@@
CREATE FUNCTION sum_fn(n int)
RETURNS INT
BEGIN
DECLARE s,i INT;
SET s=0,i=1;
REPEAT
SET s=s+i;
SET i=i+1;
UNTIL i>n
END REPEAT;
RETURN s;
END@@
DELIMITER ;
SELECT sum_fn(5);