学习目标:
1.掌握MySQL中的常量和变量的使用
2.掌握分支结构if语句和case语句的语法
3.能用分支结构实现程序逻辑
问题导学:
1.MySQL中如何定义变量? |
---|
2.如何使用分支结构实现程序逻辑? |
学习导航:
一、SQL语言基础
1.MySQL 变量
什么是变量?变量是指程序运行过程中会变化的量。
- <font style="color:black;background-color:#FFFFFF;">用户变量</font>
- <font style="color:black;background-color:#FFFFFF;">系统变量和服务器变量</font>
- <font style="color:black;background-color:#FFFFFF;">局部变量</font>
- 变量分类:
#语句1
SET @id=10 ;
#语句2
SELECT @x1:=1, @x2:=@x1+1, @x3:=@x2+1 ;
#语句3
SELECT cname FROM category WHERE cid=1 INTO @name ;
SELECT @name ;
#语句4
SELECT @id:=@id+1,cname FROM category ;
(2)系统变量
系统变量是MySQL的一些特定的参数。当MySQL服务启动时,这些参数将被读取并配置MySQL的运行环境。系统变量使用“@@”作为前缀标识符。MySQL提供了专门查看系统变量的语句:
SHOW [GLOBAL | SESSION] VARIABLES [LIKE ‘匹配模式’ | WHERE 条件表达式 ];
GLOBAL用于显示全局系统变量,当变量没有全局值时,则不会显示。SESSION为表示会话变量,是默认值,可以省略,用于显示当前连接中有效的系统可变值。
实例2:使用SHOW VARIABLES查看所有系统变量sql
SHOW VARIABLES ;
实例3:设置和查看系统变量。
sql
SET @@profiling = 0; #设置系统变量,关闭profiles功能
SET @@event_scheduler = 0; 00; #设置系统变量,开启事件调度器
SELECT @@global.version; #查看全局变量version,获知当前mysql的版本号
SHOW VARIABLES LIKE 'ver%' #查看以ver开头的系统变量
(3)局部变量
局部变量一般用在SQL语句块(如存储过程的BEGIN和END)中。其作用域仅限于语句块,当语句块执行完毕后,局部变量就消失了。局部变量用DECLARE来声明,可以使用DEFAULT来设置初始值。
实例4:定义名称为proc_add的存储过程,该存储过程有两个int类型的参数,分别为a和b。
BEGIN
#Routine body goes here...
# 参数a,b是局部变量
# 用declare 声明局部变量c
DECLARE c,d INT DEFAULT 100;
DECLARE e FLOAT ; # 不同类型的变量不能放在一起声明
SET c= a+b; # 局部变量只能用set赋值
select @a; # 用户变量可以用在过程体中
SELECT c,d,@a; #
END
DELIMITER // # 修改默认提交符为“//”
CREATE PROCEDURE proc_add(a int, b int)
BEGIN
DECLARE c int DEFAULT 0; #定义局部变量变c,初始值为0
SET c = a + b;
SELECT c AS 'Result';
END // #提交
学习提示:MySQL默认代码提交符为分号“;”,由于程序体中有多个语句,这时需要通过DELIMITER语句修改默认的代码提交符号。笔者这里修改为“//”符号,读者可以根据个人习惯设置。
变量作用域由大到小:系统变量—》用户变量—》局部变量
2.常量
(1)字符串常量 (2).数值常量 (3)日期时间常量 (4)布尔值常量 (5)NULL值常量 3.运算符二、SQL的流程控制语句
1.条件分支语句
条件分支语句是通过对特定条件的判断,选择一个分支的语句执行。 (1)IF…ELSE语句 IF 条件表达式__1 THEN 语句块__1; [ELSEIF条件表达式__2 THEN语句块__2;]
…… [ELSE 语句块n+1;]END IF;
实例5:查询uid为3的用户是否购买过商品(判断其是否有订单)。
DELIMITER //
CREATE PROCEDURE proc_orders() #定义存储过程,用于包含IF语句
BEGIN
DECLARE num int; #定义局部变量
#计算订单数并存储num中
SELECT count(*)INTO num FROM orders WHERE uid = 3;
IF num > 0 THEN #IF语句 判断num值
SELECT '有订单';
ELSE
SELECT '无订单';
END IF; #结束IF语句
END //
(2)CASE语句
①CASE简单结构。 CASE 表达式 WHEN 数值__1 THEN 语句块__1; [WHEN 数值__2 THEN 语句块__2;] …… [ELSE 语句块__n+1;]END CASE;
实例6:判断参数grade,当值为A时返回“优秀”,值为B时返回“良好”,其他值返回“一般”。
②CASE搜索结构 CASE WHEN 条件表达式__1 THEN 语句块__1; [WHEN 条件表达式__2 THEN 语句块__2;] …… [ELSE 语句块__n+1;]
DELIMITER //
CREATE PROCEDURE proc_grade1(grade char) #定义存储过程,用于包含CASE语句
BEGIN
DECLARE result char(2) ; #定义局部变量result
CASE grade
WHEN 'A' THEN SET result = '优秀';
WHEN 'B' THEN SET result = '良好';
ELSE SET result = '一般';
END CASE;
SELECT result ; #返回result
END //
END CASE;
以上问题:
DELIMITER //
CREATE PROCEDURE proc_grade2(grade char(1)) #定义存储过程,用于包含CASE语句
BEGIN
DECLARE result char(2) ; #定义局部变量result
CASE
WHEN grade = 'A' THEN SET result = '优秀';
WHEN grade = 'B' THEN SET result = '良好';
ELSE SET result = '一般';
END CASE;
SELECT result ; #返回result
END //
三、练习:
定义存储过程,判断参数:订购的商品件数,如果是10件以上商品,5折,8件以上6折,5件以上7折,3件以上8折,其他无折扣。
四、课堂小结:
1.算术运算符 + - * / %(mod)
2.赋值操作 set
3.比较运算
4.in between……and
5.逻辑运算 and(&&) or(||) not(!)
6.regexp