MySQL_05_自定义功能块

  • 自定义功能块
  • 概念
  • 常量
  • 变量
  • 系统变量
  • 用户自定义变量
  • BEGIN—END
  • IF
  • CASE
  • 循环


自定义功能块

概念

标识符:作为标识用的名称(每个对象都有一个)

//如:数据库名称、表名称、字段名等



标识符中的字符规定:

1)不加反引号(`)只能使用系统字符集中的字母、数字字符或“_”和“$”;

2)不加反引号(`)不能完全由数字字符构成;

3)字符用反引号(`)括起来,就允许使用任意字符



注释格式:

(1)注释单行:-- //两个减号,且减号后必须跟一个空格

(2)注释多行:#

(3)注释多行:/* */

常量

常量:程序运行中不会发生改变的量

常量类型

含义

字符串常量

指用单引号或双引号括起来的字符序列

数值常量

整数常量

小数常量

日期时间常量

特殊格式的字符串,需要单引号或者双引号括起来,分为时间常量和日期时间常量

布尔型

只包含两个值:TRUE和FALSE

二进制常量

由数字0和1组成 表示方法:前缀为“B”,后紧跟’二进制数’ (字符串必须用单引号括起来)

十六进制常量

由数字0到9和字母“A”到“F”组成(不区分大小写) 表示方法:前缀为“X”,后紧跟’十六进制数’ 前缀为“0X”,后紧跟一个十六进制数

NULL

可适用于各种字段类型 表示“值不确定”、“没有值”等含义

1)日期时间常量必须符合实际(如:不能设置‘1996-02-31’(2月不存在31),错误日期常量)

2)在SELECT语句中遇到TRUE或FALSE时会自动转换为字符串“0”或“1”

//二进制表达如:SELECT b’111101’,b’1’,b’11’; //显示“=”“笑脸”“心”

//十六进制中使用“0X”前缀时,后紧跟的数字不需要使用单引号括起来

//若将一个字符串或数字转换为十六进制格式的字符串,可以用HEX()函数



变量

变量:程序运行中因其他因素导致改变而不能确定的量

变量

定义

包含

系统变量

由系统定义和维护 变量名前加“@@”

全局系统变量

会话系统变量

用户自定义变量

由用户定义和使用

用户会话变量(@开头)

局部变量(不以@开头)

1)全局系统变量:作用范围是所有服务

2)会话系统变量:作用范围是整个连接期间(默认是全局系统变量的拷贝)

//MySQL服务启动后没有客户机连接,则系统变量就是全局系统变量



标记全局系统变量:@@GLOBAL 变量名

标记会话系统变量:@@SESSION 变量名



列出所有的全局系统变量信息:

SHOW GLOBAL VARIABLES;



列出与当前会话相关的会话系统变量和全局系统变量信息:

SHOW [SESSION] VARIABLES;



查看系统变量的值:

1)SHOW命令:

SHOW GLOBAL VARIABLES LIKE ‘全局变量名’;

SHOW SESSION VARIABLES LIKE ‘会话变量名’;

SHOW VARIABLES LIKE ‘变量名’;

//可使用LIKE进行模糊查询(通配符(%或_)一起使用)

//查询全局系统变量时,三种方法都可查看

//查询会话系统变量,只能采用后两种方法查看



2)SELECT命令:

SELECT @@变量名;

//@@一般首先查询会话系统变量,若不存在,则查询全局系统变量



系统变量

设置系统变量的值:

1)修改MySQL源代码,对源代码重新编译(仅适用于MySQL高级用户);

2)修改MySQL配置文件(需要重启MySQL服务)

3)使用“SET”命令重新设置系统变量的值;



设置全局系统变量:

1)格式1:SET @@ GLOBAL.变量名 = 变量值;

2)格式2:SET GLOBAL 变量名 = 变量值;

//部分系统全局变量名前的两个@@不能省略

//变量值可以是默认值(DEFAULT、ON、OFF)或具体取值

//只有root管理员才可设置全局系统变量的值



设置会话系统变量:

1)格式1:SET @@ SESSION.变量名 = 变量值;

2)格式2:SET SESSION 变量名 = 变量值;

3)格式3:SET @@ 变量名 = 变量值;

4)格式4:SET 变量名 = 变量值;

//部分会话系统变量名前的两个@@不能省略



静态变量:MySQL运行期间存在一些不能进行动态修改的特殊全局系统变量

1)只能通过修改源代码和配置文件对静态变量的值重新设置(不能使用“SET”语句进行设置)

比较

系统会话变量

用户会话变量

区别

以两个@@开头

以一个@开头

无需定义直接使用

需要用户进行定义

相同

变量名大小写不敏感


用户自定义变量

用户会话变量定义(一般情况下,用户会话变量的定义与赋值同时进行):

1)SET语句

SET @变量名1 = 表达式[,@变量名N = 表达式]

//SET语句一次可以定义多个变量,不会产生结果集



2)SELECT语句

格式1:SELECT @变量名1:=表达式[,N]

格式2:SELECT 表达式1,表达式N INTO @变量1,@变量N

// 格式1在定义和赋值的同时会产生结果集,第二种则不会




局部变量: 用于语句块中,语句块执行完毕后就消失了

局部变量作用范围:运行程序中

局部变量变量必须定义在运行程序中(函数、触发器、存储过程以及事件)



DECLARE:用于定义局部变量的语句

1)定义格式:DECLARE 变量名 数据类型

2)定义时需同时指出变量名和数据类型

3)DECLARE写在BEGIN—END语句的开头(或调用局部变量语句前)

//其他类型变量不能使用DECLARE命令定义




局部变量使用场合:

(1)局部定义在存储程序的BEGIN—END语句之间;

1)此时局部变量必须使用DECLARE命令定义,且必须指定局部变量的数据类型

2)定义局部变量后,才可以使用SET或SELECT语句为其赋值



(2)局部变量作为存储过程或函数的参数使用;

1)此时不需要使用DECLARE命令定义,但需要指定参数的数据类型



(3)局部变量用于存储过程的SQL语句中



局部变量

用户会话变量

变量名没有@开头

变量名以@开头

使用DECLARE命令定义 定义时必须指定局部变量的数据类型 局部变量定义后,才可以使用SET 或SELECT语句为其赋值

定义变量时无需指定数据类型 直接使用SET或SELECT语句定义并进行赋值

若作为存储过程或函数的参数 在整个存储过程或函数内中有效 若定义在存储程序的BEGIN—END语句块中 只在定义的BEGIN—END语句块有效

在本次会话期间一直有效,直至关闭服务器连接

//若局部变量嵌入到SQL语句中,局部变量名不能与表字段名同名(因为局部变量名前没有“@“符号)



BEGIN—END

BEGIN—END语句块:多条MySQL表达式封包在一起以完成指定功能

[开始标签:]BEGIN
	[局部]变量的声明;
	错误触发条件的声明;
	游标的声明;
	错误处理程序的声明;
	业务逻辑代码;
END[结束标签];



DELIMITER:用于定义命令结束标记的语句(默认为“”)

1)定义格式:DELIMITER 结束标记符

2)使用DELIMITER时不需加“;”作为结束标记

//DELIMITER ; //设置“;”为结束标记



位运算符:对二进制数据进行操作

1)若不是二进制,会自动进行类型转换,运算结果为二进制数

2)使用SELECT语句显示二进制数时,会将其自动转换为十进制数显示

运算符

运算规则

&

按位与

|

按位或

^

按位异或

~

按位取反

>>

位右移

<<

位左移


IF

IF语句格式:

IF  条件表达式1  THEN  语句块1;
[ELSEIF  条件表达式2  THEN  语句块2]
[ELSEIF  条件表达式3  THEN  语句块3]
······
[ELSE  语句块N]
END IF;

1)END IF后必须以“;”结束

2)前面的ELSEIF中的ELSE和IF中不能空格



CASE

CASE语句格式:

CASE  表达式
WHEN  value1  THEN  语句块1;
WHEN  value2  THEN  语句块2;
······
ELSE  语句块N;
END CASE;

1)CASE语句用于实现比IF语句分支更为复杂的条件判断

2)CASE语句不同于高级程序语言(C、Java等),无需“break”语句跳出



查询中的CASE

程序中的CASE

CASE [字段名]

CASE 表达式

END

END CASE;

进行更为复杂的数据转换

只做表达式运算后的数据匹配


循环

跳出当前的循环语句:

LEAVE 循环标签;



跳出本次循环,继续下次循环

ITERATE 循环标签;



MySQL中常用的循环语句如下:

循环语句

语句格式

注意

WHILE语句

[循环标签:]WHILE 条件表达式 DO 循环体; END WHILE[循环标签];

条件表达式为TRUE时,反复执行循环体,直到为FALSE

REPEAT语句

[循环标签:]REPEAT 循环体; UNTIL 条件表达式 END REPEAT[循环标签];

条件表达式为FALES时,反复执行循环体,直到条件表达式为TRUE

LOOP语句

[循环标签:]LOOP 循环体; IF 条件表达式 THEN LEAVE [循环标签]; END IF; END LOOP;

LOOP循环本身没有停止循环的语句,所以通常使用LEAVE语句跳出LOOP循环