学习目标

1.掌握MySQL中的常量和变量的使用

2.掌握分支结构if语句和case语句的语法

3.能用分支结构实现程序逻辑

问题导学:

1.MySQL中如何定义变量?
2.如何使用分支结构实现程序逻辑?

学习导航

画板

一、SQL语言基础

1.MySQL 变量

什么是变量?变量是指程序运行过程中会变化的量。
  1. - <font style="color:black;background-color:#FFFFFF;">用户变量</font>
  2. - <font style="color:black;background-color:#FFFFFF;">系统变量和服务器变量</font>
  3. - <font style="color:black;background-color:#FFFFFF;">局部变量</font>
  • 变量分类:
(1)用户变量 用户变量即用户定义的变量。用户变量可以被赋值。以@字符作为前缀。用户变量名不区分大小写,MySQL会话末端结束其定义。 用户变量使用SET命令和SELECT命令给其赋值。 实例1:
  1. #语句1
  2. SET @id=10 ;
  3. #语句2
  4. SELECT @x1:=1, @x2:=@x1+1, @x3:=@x2+1 ;
  5. #语句3
  6. SELECT cname FROM category WHERE cid=1 INTO @name ;
  7. SELECT @name ;
  8. #语句4
  9. 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。
  1. BEGIN
  2. #Routine body goes here...
  3. # 参数a,b是局部变量
  4. # 用declare 声明局部变量c
  5. DECLARE c,d INT DEFAULT 100;
  6. DECLARE e FLOAT ; # 不同类型的变量不能放在一起声明
  7. SET c= a+b; # 局部变量只能用set赋值
  8. select @a; # 用户变量可以用在过程体中
  9. SELECT c,d,@a; #
  10. END
  1. DELIMITER // # 修改默认提交符为“//”
  2. CREATE PROCEDURE proc_add(a int, b int)
  3. BEGIN
  4. DECLARE c int DEFAULT 0; #定义局部变量变c,初始值为0
  5. SET c = a + b;
  6. SELECT c AS 'Result';
  7. 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的用户是否购买过商品(判断其是否有订单)。

  1. DELIMITER //
  2. CREATE PROCEDURE proc_orders() #定义存储过程,用于包含IF语句
  3. BEGIN
  4. DECLARE num int; #定义局部变量
  5. #计算订单数并存储num中
  6. SELECT count(*)INTO num FROM orders WHERE uid = 3;
  7. IF num > 0 THEN #IF语句 判断num值
  8. SELECT '有订单';
  9. ELSE
  10. SELECT '无订单';
  11. END IF; #结束IF语句
  12. END //

(2)CASE语句

CASE简单结构。 CASE 表达式 WHEN 数值__1 THEN 语句块__1; [WHEN 数值__2 THEN 语句块__2;] …… [ELSE 语句块__n+1;]

END CASE;

实例6:判断参数grade,当值为A时返回“优秀”,值为B时返回“良好”,其他值返回“一般”。

  1. DELIMITER //
  2. CREATE PROCEDURE proc_grade1(grade char) #定义存储过程,用于包含CASE语句
  3. BEGIN
  4. DECLARE result char(2) ; #定义局部变量result
  5. CASE grade
  6. WHEN 'A' THEN SET result = '优秀';
  7. WHEN 'B' THEN SET result = '良好';
  8. ELSE SET result = '一般';
  9. END CASE;
  10. SELECT result ; #返回result
  11. END //
CASE搜索结构 CASE WHEN 条件表达式__1 THEN 语句块__1; [WHEN 条件表达式__2 THEN 语句块__2;] …… [ELSE 语句块__n+1;]

END CASE;

以上问题:

  1. DELIMITER //
  2. CREATE PROCEDURE proc_grade2(grade char(1)) #定义存储过程,用于包含CASE语句
  3. BEGIN
  4. DECLARE result char(2) ; #定义局部变量result
  5. CASE
  6. WHEN grade = 'A' THEN SET result = '优秀';
  7. WHEN grade = 'B' THEN SET result = '良好';
  8. ELSE SET result = '一般';
  9. END CASE;
  10. SELECT result ; #返回result
  11. END //

三、练习:

定义存储过程,判断参数:订购的商品件数,如果是10件以上商品,5折,8件以上6折,5件以上7折,3件以上8折,其他无折扣。

四、课堂小结:

1.算术运算符 + - * / %(mod)

2.赋值操作 set

3.比较运算

4.in between……and

5.逻辑运算 and(&&) or(||) not(!)

6.regexp