1、肖红肖红MySQLMySQL数据库基础与实例教程数据库基础与实例教程 之之MySQLMySQL编程基础编程基础 为了便于为了便于MySQL代码维护,以及提高代码维护,以及提高MySQL代码的重用性,代码的重用性,MySQL开发人员经常将频繁使用开发人员经常将频繁使用的业务逻辑封装成存储程序,的业务逻辑封装成存储程序,MySQL的存储程序的存储程序分为四类:函数、触发器、存储过程以及事件。分为四类:函数、触发器、存储过程以及事件。 内容一览内容一览 1 12 23 3 本章首先介绍了本章首先介绍了MySQL编程的基础知识,然后讲解编程的基础知识,然后讲解了自定义函数的实现方法,了自定义函数的实现
2、方法,接着介绍了接着介绍了MySQL常用的常用的系统函数,最后结合系统函数,最后结合“选课选课系统系统”,编写自定义函数模,编写自定义函数模拟实现了中文全文检索。拟实现了中文全文检索。 4 4自定义函数自定义函数MySQL编程基础知识编程基础知识系统函数系统函数中文全文检索的模拟实现中文全文检索的模拟实现内容一览内容一览 1 12 23 3 MySQL程序设计结程序设计结构是在构是在SQL标准的基标准的基础上增加了一些程序础上增加了一些程序设计语言的元素,其设计语言的元素,其中包括常量、变量、中包括常量、变量、运算符、表达式、流运算符、表达式、流程控制以及函数等内程控制以及函数等内容。容。 用
3、户自定义变量用户自定义变量常量常量运算符与表达式运算符与表达式45begin-end语句块语句块重置命令结束标记重置命令结束标记6.1 MySQL6.1 MySQL编程基础知识编程基础知识 按照按照MySQL的数据类型进行划分,可以将的数据类型进行划分,可以将常量划分为字符串常量、数值常量、十六进制常量划分为字符串常量、数值常量、十六进制常量、日期时间常量、二进制常量以及常量、日期时间常量、二进制常量以及NULL。6.1.1 6.1.1 常量常量1字符串常量字符串常量 字符串常量是指用单引号或双引号括起来的字符串常量是指用单引号或双引号括起来的字符序列。字符序列。select Im a tea
4、cher as col1, youre a student as col2; 由于大多编程语言(例如由于大多编程语言(例如Java、C等)使用等)使用双引号表示字符串,为了便于区分,在双引号表示字符串,为了便于区分,在MySQL数据库中推荐使用单引号表示字符串。数据库中推荐使用单引号表示字符串。6.1.1 6.1.1 常量常量2数值常量数值常量 数值常量可以分为整数常量(例如数值常量可以分为整数常量(例如2013)和小数常量(例如和小数常量(例如5.26、101.5E5),这里不),这里不再赘述。再赘述。6.1.1 6.1.1 常量常量3日期时间常量日期时间常量日期时间常量是一个符合特殊格式的
5、字符串。日期时间常量是一个符合特殊格式的字符串。例如例如14:30:24是一个时间常量,是一个时间常量,2008-05-12 14:28:24是一个日期时间常量。日期时间常是一个日期时间常量。日期时间常量的值必须符合日期、时间标准,例如量的值必须符合日期、时间标准,例如1996-02-31是错误的日期常量。是错误的日期常量。6.1.1 6.1.1 常量常量3日期时间常量日期时间常量日期时间常量是一个符合特殊格式的字符串。日期时间常量是一个符合特殊格式的字符串。例如例如14:30:24是一个时间常量,是一个时间常量,2008-05-12 14:28:24是一个日期时间常量。日期时间常是一个日期时
6、间常量。日期时间常量的值必须符合日期、时间标准,例如量的值必须符合日期、时间标准,例如1996-02-31是错误的日期常量。是错误的日期常量。6.1.1 6.1.1 常量常量4. 布尔值布尔值布尔值只包含两个可能的值:布尔值只包含两个可能的值:true和和false。说明:使用说明:使用select语句显示布尔值语句显示布尔值true或者或者false时,会将其转换为字符串时,会将其转换为字符串“0”或者字符或者字符串串“1”。6.1.1 6.1.1 常量常量5二进制常量二进制常量二进制常量由数字二进制常量由数字“0”和和“1”组成。二进制组成。二进制常量的表示方法:前缀为常量的表示方法:前缀
7、为“b”,后面紧跟一,后面紧跟一个个“二进制二进制”字符串。例如下面的字符串。例如下面的select语语句输出三个字符。其中句输出三个字符。其中b111101表示表示“等等号号”,b1表示表示“笑脸笑脸”,b11表示表示“心心”。 select b111101,b1, b11;6.1.1 6.1.1 常量常量6十六进制常量十六进制常量十六进制常量由数字十六进制常量由数字“0”到到“9”及字母及字母“a”到到“f”或或“A”到到“F”组成(字母不区分大小组成(字母不区分大小写)。十六进制常量有两种表示方法。写)。十六进制常量有两种表示方法。6.1.1 6.1.1 常量常量6十六进制常量十六进制常
8、量第一种表示方法:前缀为大写字母第一种表示方法:前缀为大写字母“X”或小或小写字母写字母“x”,后面紧跟一个,后面紧跟一个“十六进制十六进制”字字符串。符串。例如例如select X41, x4D7953514C;其中其中X41表示大写字母表示大写字母A。x4D7953514C表示字符串表示字符串MySQL。6.1.1 6.1.1 常量常量6十六进制常量十六进制常量第二种表示方法:前缀为第二种表示方法:前缀为“0 x”,后面紧跟一,后面紧跟一个个“十六进制数十六进制数”(不用引号)。(不用引号)。例如例如select 0 x41, 0 x4D7953514C ;其中其中0 x41表示大写字母表
9、示大写字母A。0 x4D7953514C表示字符串表示字符串MySQL。6.1.1 6.1.1 常量常量小结:可以看到,使用小结:可以看到,使用select语句显示十六语句显示十六进制数时,会将十六进制数自动转换为进制数时,会将十六进制数自动转换为“字字符串符串”再进行显示。再进行显示。如果需要将一个字符串或数字转换为十六进如果需要将一个字符串或数字转换为十六进制格式的字符串,可以用制格式的字符串,可以用hex()函数实现。函数实现。例如例如select hex(MySQL);hex()函数将函数将“MySQL”字符串转换为十六进字符串转换为十六进制数制数4D7953514C。6.1.1 6.
10、1.1 常量常量小结:十六进制数与字符之间存在一一对应小结:十六进制数与字符之间存在一一对应关系,利用这个特点,可以模拟实现中文全关系,利用这个特点,可以模拟实现中文全文检索。文检索。7. NULL值值NULL值可适用于各种字段类型,它通常用来值可适用于各种字段类型,它通常用来表示表示“值不确定值不确定”、“没有值没有值”等意义,等意义,NULL值参与算术运算、比较运算以及逻辑运值参与算术运算、比较运算以及逻辑运算时,结果依然为算时,结果依然为NULL。6.1.1 6.1.1 常量常量变量分为系统变量(以变量分为系统变量(以开头)以及用户开头)以及用户自定义变量。自定义变量。用户自定义变量分为
11、用户会话变量(以用户自定义变量分为用户会话变量(以开开头)以及局部变量(不以头)以及局部变量(不以开头)开头) 。 6.1.2 6.1.2 用户自定义变量用户自定义变量1用户会话变量用户会话变量MySQL客户机客户机1定义了会话变量,会话期间,定义了会话变量,会话期间,该会话变量一直有效;该会话变量一直有效;MySQL客户机客户机2不能不能访问访问MySQL客户机客户机1定义的会话变量;定义的会话变量;MySQL客户机客户机1关闭或者关闭或者MySQL客户机客户机1与与服务器断开连接后,服务器断开连接后,MySQL客户机客户机1定义的定义的所有会话变量将自动释放,以便节省所有会话变量将自动释放
12、,以便节省MySQL服务器的内存空间。服务器的内存空间。6.1.2 6.1.2 用户自定义变量用户自定义变量用用户户会会话话变变量量6.1.2 6.1.2 用户自定义变量用户自定义变量1用户会话变量用户会话变量系统会话变量与用户会话变量的共同之处在系统会话变量与用户会话变量的共同之处在于:变量名大小写不敏感。系统会话变量与于:变量名大小写不敏感。系统会话变量与用户会话变量的区别在于:用户会话变量的区别在于:1用户会话变量用户会话变量一般以一个一般以一个“”开头;系统会话变量以两个开头;系统会话变量以两个“”开头。开头。2系统会话变量无需定义可以系统会话变量无需定义可以直接使用。直接使用。6.1
13、.2 6.1.2 用户自定义变量用户自定义变量(1)用户会话变量的定义与赋值)用户会话变量的定义与赋值一般情况下,用户会话变量的定义与赋值会一般情况下,用户会话变量的定义与赋值会同时进行。用户会话变量的定义与赋值有两同时进行。用户会话变量的定义与赋值有两种方法:使用种方法:使用set命令或者使用命令或者使用select语句。语句。方法一:使用方法一:使用set命令定义用户会话变量,并命令定义用户会话变量,并为其赋值,语法格式如下:为其赋值,语法格式如下:set user_variable1expression1 ,user_variable2= expression2 , 6.1.2 6.1.
14、2 用户自定义变量用户自定义变量说明:用户会话变量的数据类型是根据赋值说明:用户会话变量的数据类型是根据赋值运算符运算符“=”右边表达式的计算结果自动分配右边表达式的计算结果自动分配的。也就是说,等号右边的值(包括字符集的。也就是说,等号右边的值(包括字符集和字符序)决定了用户会话变量的数据类型和字符序)决定了用户会话变量的数据类型(包括字符集和字符序)。(包括字符集和字符序)。6.1.2 6.1.2 用户自定义变量用户自定义变量方法二:使用方法二:使用select语句定义用户会话变量,语句定义用户会话变量,并为其赋值,语法格式有两种。并为其赋值,语法格式有两种。第一种语法格式:第一种语法格式
15、:select user_variable1:expression1 ,user_variable2:= expression2 , 第二种语法格式:第二种语法格式:select expression1 into user_variable1, expression2 into user_variable2,6.1.2 6.1.2 用户自定义变量用户自定义变量方法二:使用方法二:使用select语句定义用户会话变量,语句定义用户会话变量,说明:说明: 第一种语法格式中需要使用第一种语法格式中需要使用“:”赋值赋值语句,原因在于语句,原因在于“=”是为是为“比较比较”保留的。保留的。 第一种与第
16、二种语法格式的区别在于:第一种与第二种语法格式的区别在于:第一种语法格式中的第一种语法格式中的select语句会产生结果语句会产生结果集,第二种语法格式中的集,第二种语法格式中的select语句,仅仅语句,仅仅用于会话变量的定义及赋值(但不会产生结用于会话变量的定义及赋值(但不会产生结果集)。果集)。6.1.2 6.1.2 用户自定义变量用户自定义变量2用户会话变量与用户会话变量与SQL语句语句任务布置任务布置1:上机操作,完成本书场景描述:上机操作,完成本书场景描述1:用户会话变量与用户会话变量与SQL语句的任务要求。语句的任务要求。注意:哪些方法的注意:哪些方法的select语句产生结果集
17、语句产生结果集?哪哪些方法的些方法的select语句不产生结果集语句不产生结果集?6.1.2 6.1.2 用户自定义变量用户自定义变量3局部变量局部变量declare命令专门用于定义局部变量及对应的命令专门用于定义局部变量及对应的数据类型。局部变量必须定义在存储程序中数据类型。局部变量必须定义在存储程序中(例如函数、触发器、存储过程以及事件(例如函数、触发器、存储过程以及事件中),并且局部变量的作用范围仅仅局限于中),并且局部变量的作用范围仅仅局限于存储程序中,脱离存储程序,局部变量没有存储程序中,脱离存储程序,局部变量没有丝毫意义。局部变量主要用于下面三种场合。丝毫意义。局部变量主要用于下面
18、三种场合。6.1.2 6.1.2 用户自定义变量用户自定义变量3局部变量局部变量场合一:局部变量定义在存储程序的场合一:局部变量定义在存储程序的begin-end语句块(稍后介绍)之间。此时局部变量语句块(稍后介绍)之间。此时局部变量首先必须使用首先必须使用declare命令定义,并且必须指命令定义,并且必须指定局部变量的数据类型。只有定义局部变量定局部变量的数据类型。只有定义局部变量后,才可以使用后,才可以使用set命令或者命令或者select语句为其语句为其赋值。赋值。6.1.2 6.1.2 用户自定义变量用户自定义变量3局部变量局部变量场合二:局部变量作为存储过程或者函数的场合二:局部变
19、量作为存储过程或者函数的参数使用,此时虽然不需要使用参数使用,此时虽然不需要使用declare命令命令定义,但需要指定参数的数据类型。定义,但需要指定参数的数据类型。6.1.2 6.1.2 用户自定义变量用户自定义变量3局部变量局部变量场合三:局部变量也可以用在场合三:局部变量也可以用在SQL语句中。语句中。数据检索时,如果数据检索时,如果select语句的结果集是单语句的结果集是单个值,可以将个值,可以将select语句的返回结果赋予局语句的返回结果赋予局部变量,局部变量也可以直接嵌入到部变量,局部变量也可以直接嵌入到select、insert、update以及以及delete语句的条件表达
20、语句的条件表达式中。式中。6.1.2 6.1.2 用户自定义变量用户自定义变量4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(1)用户会话变量名以)用户会话变量名以“”开头,而局部开头,而局部变量名前面没有变量名前面没有“”符号。符号。6.1.2 6.1.2 用户自定义变量用户自定义变量(2)局部变量使用)局部变量使用declare命令定义(存储过程命令定义(存储过程参数、函数参数除外),定义时必须指定局部变参数、函数参数除外),定义时必须指定局部变量的数据类型;局部变量定义后,才可以使用量的数据类型;局部变量定义后,才可以使用set命令或者命令或者select语句为其赋值。语句为
21、其赋值。用户会话变量使用用户会话变量使用set命令或命令或select语句定义并进语句定义并进行赋值,定义用户会话变量时无需指定数据类型。行赋值,定义用户会话变量时无需指定数据类型。诸如诸如“declare student_no int;”的语句是错误的语句是错误语句,用户会话变量不能使用语句,用户会话变量不能使用declare命令定义。命令定义。6.1.2 6.1.2 用户自定义变量用户自定义变量4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(3)用户会话变量的作用范围与生存周期大)用户会话变量的作用范围与生存周期大于局部变量。局部变量如果作为存储过程或于局部变量。局部变量如果作
22、为存储过程或者函数的参数,此时在整个存储过程或函数者函数的参数,此时在整个存储过程或函数内中有效;如果定义在存储程序的内中有效;如果定义在存储程序的begin-end语句块中,此时仅在当前的语句块中,此时仅在当前的begin-end语句块语句块中有效。用户会话变量在本次会话期间一直中有效。用户会话变量在本次会话期间一直有效,直至关闭服务器连接。有效,直至关闭服务器连接。6.1.2 6.1.2 用户自定义变量用户自定义变量4局部变量与用户会话变量的区别局部变量与用户会话变量的区别(4)如果局部变量嵌入到)如果局部变量嵌入到SQL语句中,由于语句中,由于局部变量名前没有局部变量名前没有“”符号,这
23、就要求局部符号,这就要求局部变量名不能与表字段名同名,否则将出现无变量名不能与表字段名同名,否则将出现无法预期的结果。法预期的结果。6.1.2 6.1.2 用户自定义变量用户自定义变量关于局部变量的其他说明:关于局部变量的其他说明:在在MySQL数据库中,由于局部变量涉及数据库中,由于局部变量涉及begin-end语句块、函数、存储过程等知识,语句块、函数、存储过程等知识,局部变量的具体使用方法将结合这些知识稍局部变量的具体使用方法将结合这些知识稍后一块儿进行讲解。后一块儿进行讲解。declare命令尽量写在命令尽量写在begin-end语句块的开语句块的开头,尽量写在任何其他语句的前面。头,
24、尽量写在任何其他语句的前面。6.1.2 6.1.2 用户自定义变量用户自定义变量根据运算符功能的不同,可将根据运算符功能的不同,可将MySQL的运算的运算符分为算术运算符、比较运算符、逻辑运算符分为算术运算符、比较运算符、逻辑运算符以及位操作运算符。符以及位操作运算符。1算术运算符算术运算符算术运算符用于两个操作数之间执行算术运算术运算符用于两个操作数之间执行算术运算。常用的算术运算符有:算。常用的算术运算符有:+(加)、(加)、-(减)、(减)、*(乘)、(乘)、/(除)、(除)、%(求余)以及(求余)以及div(求商)等(求商)等6种运算符。种运算符。6.1.3 6.1.3 运算符与表达式
25、运算符与表达式2比较运算符比较运算符比较运算符(又称关比较运算符(又称关系运算符)用于比较系运算符)用于比较操作数之间的大小关操作数之间的大小关系,其运算结果要么系,其运算结果要么为为true、要么为、要么为false、要么为要么为NULL(不确(不确定)。定)。6.1.3 6.1.3 运算符与表达式运算符与表达式select ab =ab, ab=ab, ba,NULL=NULL,NULLNULL,NULL is NULL;结论:字符串进行比较时,会截掉字符串尾结论:字符串进行比较时,会截掉字符串尾部的空格字符,然后进行比较。部的空格字符,然后进行比较。6.1.3 6.1.3 运算符与表达式
26、运算符与表达式3 3逻辑运算符逻辑运算符逻辑运算符(又称布尔运算符)对布尔值进逻辑运算符(又称布尔运算符)对布尔值进行操作,其运算结果要么为行操作,其运算结果要么为truetrue、要么为、要么为falsefalse、要么为、要么为NULLNULL(不确定)。(不确定)。 6.1.3 6.1.3 运算符与表达式运算符与表达式4位运算符位运算符位运算符对二进制数据进行操作(如果不是位运算符对二进制数据进行操作(如果不是二进制类型的数,将进行类型自动转换),二进制类型的数,将进行类型自动转换),其运算结果为二进制数。使用其运算结果为二进制数。使用select语句显语句显示二进制数时,会将其自动转换
27、为十进制数示二进制数时,会将其自动转换为十进制数显示。显示。 6.1.3 6.1.3 运算符与表达式运算符与表达式4位运算符位运算符6.1.3 6.1.3 运算符与表达式运算符与表达式 开始标签开始标签: begin: begin 局部局部 变量的声明变量的声明; ;错误触发条件的声明错误触发条件的声明; ;游标的声明游标的声明; ; 错误处理程序的声明错误处理程序的声明; ;业务逻辑代码业务逻辑代码; ;endend结束标签结束标签 ; ;6.1.5 6.1.5 重置命令结束标记重置命令结束标记delimiter $delimiter $select select * * from stud
28、ent where from student where student_name like student_name like 张张_$_$delimiter ;delimiter ;select select * * from student where from student where student_name like student_name like 张张_;_;6.1.4 begin-end6.1.4 begin-end语句块语句块1 12 23 3函数可以看作是一个函数可以看作是一个“加工作坊加工作坊”,这个,这个“加工作坊加工作坊”接收接收“调调用者用者”传递过来的传递过
29、来的“原原料料”(实际上是函数的(实际上是函数的参数),然后将这些参数),然后将这些“原料原料”“”“加工处理加工处理”成成“产品产品”(实际上是(实际上是函数的返回值),再把函数的返回值),再把“产品产品”返回给返回给“调用调用者者”。 函数的创建与调用函数的创建与调用创建自定义函数的语法格式创建自定义函数的语法格式函数的维护函数的维护45条件控制语句条件控制语句循环语句循环语句6.2 6.2 定义函数定义函数create function 函数名(参数函数名(参数1,参数,参数2,)returns 返回值的数据类型返回值的数据类型函数选项函数选项begin函数体函数体;return 语句语
30、句;end;6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式函数选项由以下一种或几种选项组合而成。函数选项由以下一种或几种选项组合而成。language sql| not deterministic| contains sql | no sql | reads sql data | modifies sql data | sql security definer | invoker | comment 注释注释6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式函数选项说明:函数选项说明:language sql:默认选项,用于说明函数体:默认选项,
31、用于说明函数体使用使用SQL语言编写。语言编写。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式deterministic(确定性):当函数返回不确定值(确定性):当函数返回不确定值时,该选项是为了防止时,该选项是为了防止“复制复制”时的不一致性。时的不一致性。如果函数总是对同样的输入参数产生同样的结果,如果函数总是对同样的输入参数产生同样的结果,则被认为它是则被认为它是“确定的确定的”,否则就是,否则就是“不确定不确定”的。例如函数返回系统当前的时间,返回值是不的。例如函数返回系统当前的时间,返回值是不确定的。如果既没有给定确定的。如果既没有给定determinist
32、ic也没有给也没有给定定not deterministic,默认的就是,默认的就是not deterministic。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式contains sql:表示函数体中不包含读或写数:表示函数体中不包含读或写数据的语句(例如据的语句(例如set命令等)。命令等)。no sql:表示函数体中不包含:表示函数体中不包含SQL语句。语句。reads sql data:表示函数体中包含:表示函数体中包含select查查询语句,但不包含更新语句。询语句,但不包含更新语句。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式m
33、odifies sql data:表示函数体包含更新语:表示函数体包含更新语句。如果上述选项没有明确指定,默认是句。如果上述选项没有明确指定,默认是contains sql。sql security:用于指定函数的执行许可。:用于指定函数的执行许可。definer:表示该函数只能由创建者调用。:表示该函数只能由创建者调用。invoker:表示该函数可以被其他数据库用户:表示该函数可以被其他数据库用户调用。默认值是调用。默认值是definer。comment:为函数添加功能说明等注释信息。:为函数添加功能说明等注释信息。6.2.1 6.2.1 创建自定义函数的语法格式创建自定义函数的语法格式任务
34、布置任务布置2:上机操作,完成本书场景描述:上机操作,完成本书场景描述2:简单的自定义函数(空参数)的任务要求。简单的自定义函数(空参数)的任务要求。任务布置任务布置3:上机操作,完成场景描述:上机操作,完成场景描述3:自:自定义函数可以操作数据库中的数据的任务要定义函数可以操作数据库中的数据的任务要求。求。任务布置任务布置4:上机操作,完成场景描述:上机操作,完成场景描述4:将:将查询结果赋予变量的任务要求。查询结果赋予变量的任务要求。6.2.2 6.2.2 函数的创建与调用函数的创建与调用函数的维护包括查看函数的定义、修改函数函数的维护包括查看函数的定义、修改函数的定义以及删除函数的定义等
35、内容。的定义以及删除函数的定义等内容。6.2.3 6.2.3 函数的维护函数的维护1查看函数的定义查看函数的定义(1)查看当前数据库中所有的自定义函数信)查看当前数据库中所有的自定义函数信息,可以使用息,可以使用MySQL命令命令“show function status;”。如果自定义函数较多,使用。如果自定义函数较多,使用MySQL命令命令“show function status like 模模式式;”可以进行模糊查询。可以进行模糊查询。 6.2.3 6.2.3 函数的维护函数的维护1查看函数的定义查看函数的定义(2)查看指定数据库(例如)查看指定数据库(例如choose数据库)数据库)
36、中的所有自定义函数名,可以使用下面的中的所有自定义函数名,可以使用下面的SQL语句,如图语句,如图6-28所示。所示。select name from mysql.proc where db = choose and type = function ;6.2.3 6.2.3 函数的维护函数的维护1 1查看函数的定义查看函数的定义(3 3)使用)使用MySQLMySQL命令命令“show create show create function function 函数名函数名;”;”可以查看指定函数名的可以查看指定函数名的详细信息。例如查看详细信息。例如查看get_name_fn()get_nam
37、e_fn()函数的详函数的详细信息,可以使用细信息,可以使用“show create function show create function get_name_fnG”get_name_fnG” 6.2.3 6.2.3 函数的维护函数的维护1 1查看函数的定义查看函数的定义(4 4)函数的信息都保存在)函数的信息都保存在information_schemainformation_schema数据库中的数据库中的routinesroutines表表中,可以使用中,可以使用selectselect语句检索语句检索routinesroutines表,表,查询函数的相关信息。查询函数的相关信息。s
38、elect select * * from from information_schema.routines where information_schema.routines where routine_name=get_name_fnGroutine_name=get_name_fnG6.2.3 6.2.3 函数的维护函数的维护2 2函数定义的修改函数定义的修改由于函数保存的仅仅是函数体,而函数体实际由于函数保存的仅仅是函数体,而函数体实际上是一些上是一些MySQLMySQL表达式,因此函数自身不保存任表达式,因此函数自身不保存任何用户数据。当函数的函数体需要更改时,可何用户数据。当函数的
39、函数体需要更改时,可以使用以使用drop functiondrop function语句暂时将函数的定义删语句暂时将函数的定义删除,然后使用除,然后使用create functioncreate function语句重新创建相语句重新创建相同名字的函数即可。这种方法对于存储过程、同名字的函数即可。这种方法对于存储过程、视图、触发器的修改同样适用。视图、触发器的修改同样适用。6.2.3 6.2.3 函数的维护函数的维护3 3函数定义的删除函数定义的删除使用使用MySQLMySQL命令命令“drop functiondrop function函数名函数名”删删除自定义函数。例如删除除自定义函数。例
40、如删除get_name_fn()get_name_fn()函数函数可以使用可以使用“drop function get_name_fn;”drop function get_name_fn;” 。6.2.3 6.2.3 函数的维护函数的维护条件控制语句分为两种,一种是条件控制语句分为两种,一种是ifif语句,另语句,另一种是一种是casecase语句。语句。6.2.4 6.2.4 条件控制语句条件控制语句1 1ifif语句语句ifif语句根据条件表达式的值确定执行不同的语句根据条件表达式的值确定执行不同的语句块,语句块,ifif语句的用法格式如下。语句的用法格式如下。if if 条件表达式条件
41、表达式1 then 1 then 语句块语句块1;1;elseif elseif 条件表达式条件表达式2 then2 then语句块语句块2 .2 .elseelse语句块语句块nnend if;end if;说明:说明:end ifend if后必须以后必须以“;”;”结束。结束。6.2.4 6.2.4 条件控制语句条件控制语句6.2.4 6.2.4 条件控制语句条件控制语句2 2casecase语句语句casecase语句用于实现比语句用于实现比ifif语句分支更为复杂的语句分支更为复杂的条件判断,条件判断,casecase语句的语法格式如下。语句的语法格式如下。说明:说明:MySQLMy
42、SQL中的中的casecase语句与语句与C C语言、语言、JavaJava语语言等高级程序设计语言不同,在高级程序设言等高级程序设计语言不同,在高级程序设计语言中,每个计语言中,每个casecase的分支需使用的分支需使用“break”break”跳出,而跳出,而MySQLMySQL无需使用无需使用“break”break”语句。语句。6.2.4 6.2.4 条件控制语句条件控制语句2 2casecase语句语句case case 表达式表达式when value1 then when value1 then 语句块语句块1;1;when value2 then when value2 th
43、en 语句块语句块2;2;else else 语句块语句块n;n;end case;end case;6.2.4 6.2.4 条件控制语句条件控制语句6.2.4 6.2.4 条件控制语句条件控制语句MySQLMySQL提供了三种循环语句,分别是提供了三种循环语句,分别是whilewhile、repeatrepeat以及以及looploop。除此以外,。除此以外,MySQLMySQL还提供了还提供了iterateiterate语句以及语句以及leaveleave语句用于循环的内部语句用于循环的内部控制。控制。6.2.5 6.2.5 循环语句循环语句1 1whilewhile语句语句当条件表达式的
44、值为当条件表达式的值为truetrue时,反复执行循环时,反复执行循环体,直到条件表达式的值为体,直到条件表达式的值为falsefalse,whilewhile语语句的语法格式如下。句的语法格式如下。 循环标签循环标签:while :while 条件表达式条件表达式 dodo循环体循环体; ;end while end while 循环标签循环标签;说明:说明:end whileend while后必须以后必须以“;”;”结束。结束。6.2.5 6.2.5 循环语句循环语句6.2.5 6.2.5 循环语句循环语句2 2leaveleave语句语句leaveleave语句用于跳出当前的循环语句(
45、例如语句用于跳出当前的循环语句(例如whilewhile语句),语法格式如下。语句),语法格式如下。leave leave 循环标签循环标签; ;说明:说明:leave leave 循环标签后必须以循环标签后必须以“;”;”结束。结束。6.2.5 6.2.5 循环语句循环语句3 3iterateiterate语句语句iterateiterate语句用于跳出本次循环,继而进行下语句用于跳出本次循环,继而进行下次循环。次循环。iterateiterate语句的语法格式如下。语句的语法格式如下。iterate iterate 循环标签循环标签; ;说明:说明:iterateiterate循环标签后必
46、须以循环标签后必须以“;”;”结束。结束。6.2.5 6.2.5 循环语句循环语句4 4repeatrepeat语句语句当条件表达式的值为当条件表达式的值为falsefalse时,反复执行循环,时,反复执行循环,直到条件表达式的值为直到条件表达式的值为truetrue,repeatrepeat语句的语句的语法格式如下。语法格式如下。6.2.5 6.2.5 循环语句循环语句4 4repeatrepeat语句语句 循环标签循环标签:repeat :repeat 循环体循环体; ;until until 条件表达式条件表达式end repeat end repeat 循环标签循环标签;说明:说明:e
47、nd repeatend repeat后必须以后必须以“;”;”结束。结束。6.2.5 6.2.5 循环语句循环语句5 5looploop语句的语法格式语句的语法格式由于由于looploop循环语句本身没有停止循环的语句,循环语句本身没有停止循环的语句,因此因此looploop通常使用通常使用leaveleave语句跳出语句跳出looploop循环,循环,looploop的语法格式如下。的语法格式如下。6.2.5 6.2.5 循环语句循环语句5 5looploop语句的语法格式语句的语法格式 循环标签循环标签: loop: loop循环体循环体; ;if if 条件表达式条件表达式 then
48、then leave leave 循环标签循环标签; ; end if;end if;end loop;end loop;说明:说明:end loopend loop后必须以后必须以“;”;”结束。结束。6.2.5 6.2.5 循环语句循环语句1 12 23 3 MySQL MySQL功能强大的一功能强大的一个重要原因是个重要原因是MySQLMySQL内内置了许多功能丰富的置了许多功能丰富的函数。函数。字符串函数字符串函数数学函数数学函数数据类型转换函数数据类型转换函数45条件控制函数条件控制函数系统信息函数系统信息函数6.3 6.3 系统函数系统函数6 67 7 本章讲解的所有本章讲解的所有
49、函数函数f(x)f(x)对数据对数据x x进行进行操作时,都会产生返操作时,都会产生返回结果,并且数据回结果,并且数据x x的的值以及值以及x x的数据类型都的数据类型都不会发生丝毫变化。不会发生丝毫变化。 日期和时间函数日期和时间函数其他常用的其他常用的MySQLMySQL函数函数6.3 6.3 系统函数系统函数为了便于读者学习,本书将数学函数归纳为为了便于读者学习,本书将数学函数归纳为三角函数,指数函数及对数函数,求近似值三角函数,指数函数及对数函数,求近似值函数,随机函数,二进制、十六进制函数等。函数,随机函数,二进制、十六进制函数等。6.3.1 6.3.1 数学函数数学函数1 1三角函
50、数三角函数MySQLMySQL提供了提供了pi()pi()函数计算圆周率;函数计算圆周率;radians(x)radians(x)函数负责将角度函数负责将角度x x转换为弧度;转换为弧度;degrees(x)degrees(x)函数负责将弧度函数负责将弧度x x转换为角度。转换为角度。 MySQLMySQL还提供了三角函数,正弦函数还提供了三角函数,正弦函数sin(x)sin(x)、余弦函数余弦函数cos(x)cos(x)、tan(x)tan(x)正切函数、余切函正切函数、余切函数数cot(x)cot(x)、反正弦函数、反正弦函数asin(x)asin(x)、反余弦函数、反余弦函数acos(x