资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
MySQLMySQL课件:课件:- -数据库编数据库编程程项目知识要点与目标任务一 MySQL语言结构1 1字符串常量字符串常量 字符串是指用单引号或双引号括起来的字符序列,分为字符串是指用单引号或双引号括起来的字符序列,分为ASCIIASCII字字符串常量和符串常量和Unicode Unicode 字符串常量。字符串常量。 ASCII ASCII字符串常量是用单引号括起来的,由字符串常量是用单引号括起来的,由ASCIIASCII字符构成的符字符构成的符号串。举例:号串。举例:hellohello,How are you!How are you! Unicode Unicode 字符串常量与字符串常量与ASCIIASCII字符串常量相似,但它前面有一个字符串常量相似,但它前面有一个N N标志符(标志符(N N代表代表 SQL-92SQL-92标准中的国际语言(标准中的国际语言(National LanguageNational Language)。)。N N前缀必须为大写。只能用单引号括起字符串。前缀必须为大写。只能用单引号括起字符串。举例:举例:NhelloNhello,NHow are you!NHow are you! Unicode Unicode 数据中的每个字符用两个字节存储,而每个数据中的每个字符用两个字节存储,而每个ASCIIASCII字符字符用一个字节存储。用一个字节存储。 在字符串中不仅可以使用普通的字符,也可使用几个转义序列,在字符串中不仅可以使用普通的字符,也可使用几个转义序列,它们用来表示特殊的字符它们用来表示特殊的字符。【例【例8.18.1】 执行如下语句:执行如下语句: SELECT ThisnIsnFournLines;SELECT ThisnIsnFournLines; 其中,其中,“n”“n”表示回车。表示回车。常量2 2数值常量数值常量 数值常量可以分为整数常量和浮点数常量。数值常量可以分为整数常量和浮点数常量。3 3十六进制常量十六进制常量 一个十六进制值通常指定为一个字符串常量,每对十六进制数字一个十六进制值通常指定为一个字符串常量,每对十六进制数字被转换为一个字符,其最前面有一个大写字母被转换为一个字符,其最前面有一个大写字母“X”“X”或小写字或小写字“x”“x”。4 4日期时间常量日期时间常量 日期时间常量:用单引号将表示日期时间的字符串括起来构成。日日期时间常量:用单引号将表示日期时间的字符串括起来构成。日期型常量包括年、月、日,数据类型为期型常量包括年、月、日,数据类型为DATEDATE,表示为,表示为“1999-06-17”“1999-06-17”这这样的值。样的值。 时间型常量包括小时数、分钟数、秒数及微秒数,数据类型为时间型常量包括小时数、分钟数、秒数及微秒数,数据类型为TIMETIME,如,如“12:30:43.00013”“12:30:43.00013”。 日期日期/ /时间的组合,数据类型为时间的组合,数据类型为DATETIMEDATETIME或或TIMESTAMPTIMESTAMP,如,如“1999-“1999-06-17 12:30:43”06-17 12:30:43”。常量5 5位字段值位字段值 可以使用可以使用bvaluebvalue符号写位字段值。符号写位字段值。valuevalue是一个用是一个用0 0和和1 1写成的写成的二进制值。直接显示二进制值。直接显示bvaluebvalue的值可能是一系列特殊的符号。例如,的值可能是一系列特殊的符号。例如,b0b0显示为空白,显示为空白,b1b1显示为一个笑脸图标。显示为一个笑脸图标。 使用使用BINBIN函数可以将位字段常量显示为二进制格式。函数可以将位字段常量显示为二进制格式。6 6布尔值布尔值 布尔值只包含两个可能的值:布尔值只包含两个可能的值:TRUETRUE和和FALSEFALSE。 FALSE FALSE的数字值为的数字值为“0”“0”,TRUETRUE的数字值为的数字值为“1”“1”。7 7NULLNULL值值 NULL NULL值可适用于各种列类型,它通常用来表示值可适用于各种列类型,它通常用来表示“没有值没有值”、“无无数据数据”等意义,并且不同于数字类型的等意义,并且不同于数字类型的“0”“0”或字符串类型的空字符或字符串类型的空字符串。串。用户变量 变量用于临时存放数据,变量有名字及其数据类型两个属变量用于临时存放数据,变量有名字及其数据类型两个属性,变量名用于标识该变量,变量的数据类型确定了该变量存性,变量名用于标识该变量,变量的数据类型确定了该变量存放值的格式及允许的运算。放值的格式及允许的运算。MySQLMySQL中根据变量的定义方式,变量中根据变量的定义方式,变量可分为用户变量和系统变量。可分为用户变量和系统变量。 1 1用户变量用户变量 用户可以在表达式中使用自己定义的变量,这样的变量叫用户可以在表达式中使用自己定义的变量,这样的变量叫做用户变量。在使用用户变量前必须定义和初始化。如果使用做用户变量。在使用用户变量前必须定义和初始化。如果使用没有初始化的变量,它的值为没有初始化的变量,它的值为NULLNULL。 定义和初始化一个变量可以使用定义和初始化一个变量可以使用SETSET语句语句 语法格式为:语法格式为: SET SET user_variable1user_variable1expression1 expression1 ,user_variable2= expression2 , ,user_variable2= expression2 , 其中,其中,user_variable1user_variable1、user_variable2user_variable2为用户变量名,为用户变量名,变量名可以由当前字符集的文字数字字符、变量名可以由当前字符集的文字数字字符、“.”“.”、“_”“_”和和“$”“$”组成。组成。变量举例【例【例8.28.2】 创建用户变量创建用户变量namename并赋值为并赋值为“王林王林”。 SET name=SET name=王林王林; 还可以同时定义多个变量,中间用逗号隔开。还可以同时定义多个变量,中间用逗号隔开。【例【例8.38.3】 创建用户变量创建用户变量user1user1并赋值为并赋值为1 1,user2user2赋值为赋值为2 2,user3user3赋赋值为值为3 3。 SET user1=1, user2=2, user3=3;SET user1=1, user2=2, user3=3; 定义用户变量时变量值可以是一个表达式。定义用户变量时变量值可以是一个表达式。【例【例8.48.4】 创建用户变量创建用户变量user4user4,它的值为,它的值为user3user3的值加的值加1 1。 SET user4=user3+1;SET user4=user3+1;在一个用户变量被创建后,它可以以一种特殊形式的表达式用于其他在一个用户变量被创建后,它可以以一种特殊形式的表达式用于其他SQLSQL语句中。变量名前面也必须加上符号语句中。变量名前面也必须加上符号 。【例【例8.58.5】 创建并查询用户变量创建并查询用户变量namename的值。的值。 SET name=SET name=王林王林; SELECT name; SELECT name;变量举例【例【例8.68.6】 使用查询给变量赋值。使用查询给变量赋值。 SET student=(SELECT SET student=(SELECT 姓名姓名 FROM XS WHERE FROM XS WHERE 学号学号=081101);=081101);【例【例8.78.7】 查询表查询表XSXS中名字等于例中名字等于例6.116.11中中studentstudent值的学生信息。值的学生信息。 SELECT SELECT 学号学号, , 姓名姓名, , 专业名专业名, , 出生日期出生日期 FROM XSFROM XSWHERE WHERE 姓名姓名=student;=student;说明:在说明:在SELECTSELECT语句中,表达式发送到客户端后才进行计算。这说明语句中,表达式发送到客户端后才进行计算。这说明在在HAVINGHAVING、GROUP BYGROUP BY或或ORDER BYORDER BY子句中,不能使用包含子句中,不能使用包含SELECTSELECT列表中列表中所设的变量的表达式。所设的变量的表达式。 对于对于SETSET语句,可以使用语句,可以使用“=”“=”或或“:=”“:=”作为分配符。分配给每个作为分配符。分配给每个变量的值可以为整数、实数、字符串或变量的值可以为整数、实数、字符串或NULLNULL值。值。也可以用其他也可以用其他SQLSQL语句代替语句代替SETSET语句来为用户变量分配一个值。在这种语句来为用户变量分配一个值。在这种情况下,分配符必须为情况下,分配符必须为“:=”“:=”,而不能用,而不能用“=”“=”,因为在非,因为在非SETSET语句中语句中“=”“=”被视为比较操作符。被视为比较操作符。【例【例8.88.8】 执行如下语句:执行如下语句: SELECT t2:=(t2:=2)+5 AS t2;SELECT t2:=(t2:=2)+5 AS t2; 结果结果t2t2的值为的值为7 7。 系统变量 MySQL MySQL有一些特定的设置,当有一些特定的设置,当MySQLMySQL数据库服务器启动的时候,数据库服务器启动的时候,这些设置被读取来决定下一步骤。例如,有些设置定义了数据如这些设置被读取来决定下一步骤。例如,有些设置定义了数据如何被存储,有些设置则影响到处理速度,还有些与日期有关,这何被存储,有些设置则影响到处理速度,还有些与日期有关,这些设置就是系统变量。和用户变量一样,系统变量也是一个值和些设置就是系统变量。和用户变量一样,系统变量也是一个值和一个数据类型,但不同的是,系统变量在一个数据类型,但不同的是,系统变量在MySQLMySQL服务器启动时就服务器启动时就被引入并初始化为默认值。被引入并初始化为默认值。【例【例8.98.9】 获得现在使用的获得现在使用的MySQLMySQL版本。版本。 SELECT VERSION ;SELECT VERSION ;说明:在说明:在MySQLMySQL中,系统变量中,系统变量VERSIONVERSION的值设置为版本号。在变量的值设置为版本号。在变量名前必须加两个名前必须加两个 符号才能正确返回该变量的值。符号才能正确返回该变量的值。 大多数的系统变量应用于其他大多数的系统变量应用于其他SQLSQL语句中时,必须在名称前加语句中时,必须在名称前加两个两个 符号,而为了与其他符号,而为了与其他SQLSQL产品保持一致,某些特定的系统变产品保持一致,某些特定的系统变量是要省略这两个量是要省略这两个 符号的。如符号的。如CURRENT_DATECURRENT_DATE(系统日期)(系统日期)【例【例8.108.10】 获得系统当前时间。获得系统当前时间。 SELECT CURRENT_TIME;SELECT CURRENT_TIME;运算符1 1算术运算符算术运算符 算术运算符在两个表达式上执行数学运算,这两个表达式可以是任何数字算术运算符在两个表达式上执行数学运算,这两个表达式可以是任何数字数据类型。算术运算符有:数据类型。算术运算符有:+ +(加)、(加)、 (减)、(减)、* *(乘)、(乘)、/ /(除)和(除)和% %(求模)(求模)5 5种运算。种运算。2 2比较运算符比较运算符 比较运算符(又称关系运算符),用于比较两个表达式的值,其运算结果比较运算符(又称关系运算符),用于比较两个表达式的值,其运算结果为逻辑值,可以为三种之一:为逻辑值,可以为三种之一:1 1(真)、(真)、0 0(假)及(假)及 NULL NULL(不能确定)。(不能确定)。3 3、逻辑运算符、逻辑运算符 逻辑运算符用于对某个条件进行测试,运算结果为逻辑运算符用于对某个条件进行测试,运算结果为TRUETRUE(1 1)或)或FALSEFALSE(0 0)。)。4 4、运算符优先级、运算符优先级 当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的顺序会影响所得到的运算结果。运算符优先级如下表所示。次序。执行的顺序会影响所得到的运算结果。运算符优先级如下表所示。表达式 表达式就是常量、变量、列名、复杂计算、运算符和函数的组表达式就是常量、变量、列名、复杂计算、运算符和函数的组合。一个表达式通常可以得到一个值。与常量和变量一样,表达式合。一个表达式通常可以得到一个值。与常量和变量一样,表达式的值也具有某种数据类型,可能的数据类型有字符类型、数值类型、的值也具有某种数据类型,可能的数据类型有字符类型、数值类型、日期时间类型。这样,根据表达式的值的类型,表达式可分为字符日期时间类型。这样,根据表达式的值的类型,表达式可分为字符型表达式、数值型表达式和日期表达式。型表达式、数值型表达式和日期表达式。 表达式按照形式还可分为单一表达式和复合表达式。表达式按照形式还可分为单一表达式和复合表达式。 单一表达式就是一个单一的值,如一个常量或列名。单一表达式就是一个单一的值,如一个常量或列名。 复合表达式是由运算符将多个单一表达式连接而成的表达式复合表达式是由运算符将多个单一表达式连接而成的表达式例如:例如:1+2+31+2+3,a=b+3a=b+3,2008-01-20+ INTERVAL 2 MONTH2008-01-20+ INTERVAL 2 MONTH。表达式一般用在表达式一般用在SELECTSELECT及及SELECTSELECT语句的语句的WHEREWHERE子句中。子句中。系统内置函数1 1、有一组数、有一组数(12,34,-5.5,103.2,0),(12,34,-5.5,103.2,0),求这组数中的最大值和最小值求这组数中的最大值和最小值 2 2、变量、变量x=12.54,y=-10.63456,x=12.54,y=-10.63456,请用请用MySQLMySQL函数完成以下计算:函数完成以下计算: (1 1)求)求x x和和y y的最大整数值和最小整数值的最大整数值和最小整数值 (2 2)求)求x x和和y y四舍五入的整数值四舍五入的整数值 (3 3)求)求y y分别保留小数位数为分别保留小数位数为2 2位和保留小数位数位和保留小数位数4 4位的值位的值 (4 4)求)求x x的平方根和的平方根和y y的绝对值的绝对值3 3、求字符、求字符RR的的ASCIIASCII值值 4 4、求、求ASCIIASCII码值为码值为9191、9292、9393组成的一个字符串组成的一个字符串 5 5、设有字符串、设有字符串s1=ABCDEFG,s2= yxz ,s1=ABCDEFG,s2= yxz ,请用请用MySQLMySQL函数完成以函数完成以下运算:下运算: (1 1) 返回返回s1s1最左边的最左边的3 3个字符和最右边的个字符和最右边的3 3个字符。个字符。 (2 2)分别删除字符串)分别删除字符串s2s2首部空格、尾部空格、所有空格。首部空格、尾部空格、所有空格。 (3 3)返回字符串)返回字符串s1s1第第3 3个字符开始的个字符开始的4 4个字符串个字符串 (4 4)比较)比较s1s1和和s2s2两个字符串两个字符串 6 6、用用MySQLMySQL函数显示当前日期、当前时间、当前年、当前月的英文、函数显示当前日期、当前时间、当前年、当前月的英文、当期星期的英文名,当前日期减当期星期的英文名,当前日期减1010天的日期天的日期7 7、加密、加密显示当前数据库名,当前登录用户名显示当前数据库名,当前登录用户名 和和MySQLMySQL服务器的版本服务器的版本 系统内置函数1、有一组数(12,34,-5.5,103.2,0),求这组数中的最大值和最小值 select greatest(12,34,-5.5,103.2,0),least(12,34,-5.5,103.2,0);2、变量x=12.54,y=-10.63456,请用MySQL函数完成以下计算:(1)求x和y的最大整数值和最小整数值 Set x=12.54;Set y=-10.63456; Select floor(x),floor(y),ceiling(x),ceiling(y);(2)求x和y四舍五入的整数值 SELECT ROUND(x),ROUND(y);(3)求y分别保留小数位数为2位和保留小数位数4位的值 SELECT TRUNCATE(y, 2),TRUNCATE(y, 4);(4)求x的平方根和y的绝对值 SELECT SQRT(x),ABS(y);3、求字符R的ASCII值 SELECT ASCII(R);4、求ASCII码值为91、92、93组成的一个字符串 SELECT CHAR(91,92,93);5、设有字符串s1=ABCDEFG,s2= yxz ,请用MySQL函数完成以下运算: (1) 返回s1最左边的3个字符和最右边的3个字符。 SET s1=ABCDEFG;SETs2= XYZ ; SELECT LEFT(s1, 3) ,right(s1,3);(2)分别删除字符串s2首部空格、尾部空格、所有空格。 SELECT LTRIM(s2),RTRIM(s2),TRIM(s2);(3)返回字符串s1第3个字符开始的4个字符串 select substring(s1,3,4);(4)比较s1和s2两个字符串 SELECT STRCMP(s1, s2);6、用MySQL函数显示当前日期、当前时间、当前年、当前月的英文、当期星期的英文名,当前日期减10天的日期 select now(),CURTIME(),CURDATE(),YEAR(now(),MONTHNAME(now(), DAYNAME(now(),DATE_ADD(now(), INTERVAL -10 DAY);7、加密显示当前数据库名,当前登录用户名 和MySQL服务器的版本 SELECT DATABASE(),USER(),VERSION();任务二 存储过程使用存储过程的优点有:使用存储过程的优点有:(1 1)存储过程在服务器端运行,执行速度快。)存储过程在服务器端运行,执行速度快。(2 2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。执行,提高了系统性能。(3 3)确保数据库的安全。使用存储过程可以完成所有数据库操作,)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。并可通过编程方式控制上述操作对数据库信息访问的权限。创建存储过程创建存储过程可以使用创建存储过程可以使用CREATE PROCEDURECREATE PROCEDURE语句语句语法格式:语法格式: CREATE PROCEDURE 存储过程名存储过程名 (参数参数,.)存储过程体存储过程体参数参数:存储过程的参数,格式如下:存储过程的参数,格式如下: IN | OUT | INOUT 参数名参数名 类型类型 当有多个参数的时候中间用逗号隔开。存储过程可以有当有多个参数的时候中间用逗号隔开。存储过程可以有0个、个、1个或多个参数。个或多个参数。 MySQL存储过程支持三种类型的参数:输入参数、输存储过程支持三种类型的参数:输入参数、输出参数和输入出参数和输入/输出参数,关键字分别是输出参数,关键字分别是IN、OUT和和INOUT。 输入参数使数据可以传递给一个存储过程。当需要返回一个答输入参数使数据可以传递给一个存储过程。当需要返回一个答案或结果的时候,存储过程使用输出参数。输入案或结果的时候,存储过程使用输出参数。输入/输出参数既可以充当输出参数既可以充当输入参数也可以充当输出参数。存储过程也可以不加参数,但是名称后输入参数也可以充当输出参数。存储过程也可以不加参数,但是名称后面的括号是不可省略的。面的括号是不可省略的。存储过程体存储过程体:这是存储过程的主体部分,也叫做存储过程体。里面这是存储过程的主体部分,也叫做存储过程体。里面包含了在过程调用的时候必须执行的语句,这个部分总是以包含了在过程调用的时候必须执行的语句,这个部分总是以BEGIN开开始,以始,以END结束。但是,当存储过程体中只有一个结束。但是,当存储过程体中只有一个SQL语句时可以省略语句时可以省略BEGIN-END标志。标志。DELIMITER命令在在MySQLMySQL中,服务器处理语句的时候是以分号为结束标志的。但是中,服务器处理语句的时候是以分号为结束标志的。但是在创建存储过程的时候,存储过程体中可能包含多个在创建存储过程的时候,存储过程体中可能包含多个SQLSQL语句,每个语句,每个SQLSQL语句都是以分号为结尾的,这时服务器处理程序的时候遇到第一个语句都是以分号为结尾的,这时服务器处理程序的时候遇到第一个分号就会认为程序结束,这肯定是不行的。所以这里使用分号就会认为程序结束,这肯定是不行的。所以这里使用DELIMITERDELIMITER命命令将令将MySQLMySQL语句的结束标志修改为其他符号。语句的结束标志修改为其他符号。DELIMITERDELIMITER语法格式为:语法格式为: DELIMITER $说明:说明:$是用户定义的结束符,通常这个符号可以是一些特殊的是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个符号,如两个“#”#”,两个,两个“¥”等。当使用等。当使用DELIMITERDELIMITER命令时,应该命令时,应该避免使用反斜杠(避免使用反斜杠(“”)字符,因为那是)字符,因为那是MySQLMySQL的转义字符。的转义字符。【例例8.298.29】 将将MySQLMySQL结束符修改为两个斜杠结束符修改为两个斜杠“/”/”符号。符号。 DELIMITER /说明:执行完这条命令后,程序结束的标志就换为双斜杠符号说明:执行完这条命令后,程序结束的标志就换为双斜杠符号 “/”/”了。了。要想恢复使用分号要想恢复使用分号“;”;”作为结束符,运行下面命令即可:作为结束符,运行下面命令即可:DELIMITER ;DELIMITER ;创建存储过程举例【例例8.178.17】 编写一个存储过程,实现的功能是删除一个特定会员的信编写一个存储过程,实现的功能是删除一个特定会员的信息。息。 DELIMITER $ DELIMITER $ CREATE PROCEDURE del_member(IN sfz CHAR(6) CREATE PROCEDURE del_member(IN sfz CHAR(6) BEGIN BEGINDELETE FROM Members WHERE DELETE FROM Members WHERE 身份证号身份证号=sfz;=sfz; END $ END $ DELIMITER ; DELIMITER ; 在关键字在关键字BEGINBEGIN和和ENDEND之间指定了存储过程体,因为在程序开始用之间指定了存储过程体,因为在程序开始用DELIMITERDELIMITER语句转换了语句结束标志为语句转换了语句结束标志为“$”,所以,所以BEGINBEGIN和和ENDEND被看成是被看成是一个整体,在一个整体,在END END 后用后用“$”结束。当然,结束。当然,BEGIN-ENDBEGIN-END复合语句还可以嵌复合语句还可以嵌套使用。套使用。要想查看数据库中有哪些存储过程,可以使用要想查看数据库中有哪些存储过程,可以使用SHOW PROCEDURE STATUSSHOW PROCEDURE STATUS命令。命令。SHOW PROCEDURE STATUS要查看某个存储过程的具体信息,可使用要查看某个存储过程的具体信息,可使用SHOW CREATE PROCEDURE SHOW CREATE PROCEDURE sp_namesp_name命令,其中命令,其中sp_namesp_name是存储过程的名称。是存储过程的名称。SHOW CREATE PROCEDURE del_memberdel_memberDECLARE语句1. 1. 局部变量局部变量在存储过程中可以声明局部变量,它们可以用来存储临时结果。在存储过程中可以声明局部变量,它们可以用来存储临时结果。要声明局部变量必须使用要声明局部变量必须使用DECLAREDECLARE语句。在声明局部变量的同时也可以语句。在声明局部变量的同时也可以对其赋一个初始值。对其赋一个初始值。语法格式:语法格式: DECLARE 变量变量,. 类型类型 DEFAULT 值值【例例8.188.18】 声明一个整型变量和两个字符变量。声明一个整型变量和两个字符变量。DECLARE num INT(4);DECLARE str1, str2 VARCHAR(6);说明:局部变量只能在说明:局部变量只能在BEGINENDBEGINEND语句块中声明。语句块中声明。局部变量必须在存储过程的开头就声明,声明完后,可以在声明局部变量必须在存储过程的开头就声明,声明完后,可以在声明它的它的BEGINENDBEGINEND语句块中使用该变量,其他语句块中不可以使用它。语句块中使用该变量,其他语句块中不可以使用它。SET语句2. 2. 使用使用SETSET语句赋值语句赋值要给局部变量赋值可以使用要给局部变量赋值可以使用SETSET语句。语句。语法格式为:语法格式为: SET 变量名变量名1 = 表达式表达式1 ,变量名变量名2 = 表达式表达式2 .【例例8.198.19】 在存储过程中给局部变量在存储过程中给局部变量numnum赋值为赋值为1 1,str1str1赋值为赋值为hellohello。 SET num=1, str1= hello;SELECT.INTO语句3. SELECT.INTO3. SELECT.INTO语句语句 使用这个使用这个SELECTINTOSELECTINTO语法可以把选定的列值直接存储到变量中。因语法可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行。此,返回的结果只能有一行。语法格式为:语法格式为: SELECT 列名列名 ,. INTO 变量名变量名 ,. 数据来源表达式数据来源表达式 【例例8.208.20】 在存储过程体中将在存储过程体中将BookBook表中的书名为表中的书名为“计算机基础计算机基础”的的作者姓名和出版社的值分别赋给变量作者姓名和出版社的值分别赋给变量namename和和publishpublish。 SELECTSELECT作者作者, ,出版社出版社 INTO name, publish INTO name, publish FROM BookFROM Book WHERE WHERE 书名书名= = 计算机基础计算机基础;调用存储过程 存储过程创建完后,可以在程序、触发器或者存储过程中被调存储过程创建完后,可以在程序、触发器或者存储过程中被调用,调用时都必须使用到用,调用时都必须使用到CALLCALL语句,语句, 其语法格式:其语法格式: CALL 存储过程名存储过程名( 参数参数 ,.) 【例例8.218.21】 创建存储过程实现查询创建存储过程实现查询MembersMembers表中会员人数的功能表中会员人数的功能, ,并执行它。并执行它。首先创建查询首先创建查询MembersMembers表中会员人数的存储过程:表中会员人数的存储过程: CREATE PROCEDURE query_members() CREATE PROCEDURE query_members()SELECT COUNT(*) FROM Members;SELECT COUNT(*) FROM Members;这是一个不带参数的非常简单的存储过程,通常这是一个不带参数的非常简单的存储过程,通常SELECTSELECT语句不会被语句不会被直接用在存储过程中。直接用在存储过程中。调用该存储过程:调用该存储过程: CALL query_members(); CALL query_members();课堂练习1 1、创建存储过程,实现创建存储过程,实现给出员工编号,在给出员工编号,在employeesemployees表和表和salarysalary表中删除表中删除该员工记录。并调用该该员工记录。并调用该存储过程存储过程,删除员工编号为,删除员工编号为020018020018的记录。的记录。2 2、创建存储过程,实现查询创建存储过程,实现查询s salaryalary表中表中收入总额,并调用该的收入总额,并调用该的存储过程存储过程。删除存储过程 存储过程创建后需要删除时使用存储过程创建后需要删除时使用DROP PROCEDUREDROP PROCEDURE语句。语句。在此之前,必须确认该存储过程没有任何依赖关系,否则会在此之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。导致其他与之关联的存储过程无法运行。 语法格式为:语法格式为: DROP PROCEDURE IF EXISTS 存储过程名存储过程名【例例8.228.22】 删除存储过程删除存储过程query_members()query_members()。 DROP PROCEDURE IF EXISTS query_members();DROP PROCEDURE IF EXISTS query_members();流程控制语句在在MySQLMySQL中,常见的过程式中,常见的过程式SQLSQL语句可以用在一个存储过程体中。语句可以用在一个存储过程体中。例如:例如:IFIF语句、语句、CASECASE语句、语句、LOOPLOOP语句、语句、WHILEWHILE语句、语句、ITERATEITERATE语句和语句和LEAVELEAVE语句。语句。(1 1)IFIF语句语句语法格式为:语法格式为: IF 条件条件1 THEN 语句序列语句序列1 ELSEIF条件条件2 THEN语句序列语句序列2 . ELSE 语句序列语句序列e END IFIF语句举例DELIMITER $CREATE PROCEDURE COMPAR(IN K1 INTEGER, IN K2 INTEGER, OUT K3 CHAR(6) )BEGINIF K1K2 THENSET K3= 大于;ELSEIF K1=K2 THENSET K3= 等于;ELSE SET K3= 小于;END IF;END$DELIMITER ;说明:存储过程中说明:存储过程中K1K1和和K2K2是输入参数,是输入参数,K3K3是输出参数。是输出参数。要比较的数存入要比较的数存入K1,K2K1,K2“大于”=K3K1K2?K1=K2?“等于”=K3“小于”=K3输出K3是否是否【例例8.238.23】 创建存储过程,判断两个输入的参数哪一个更大。创建存储过程,判断两个输入的参数哪一个更大。存储过程创建完后,可以在程序、触发器或者存储过程中被调用,存储过程创建完后,可以在程序、触发器或者存储过程中被调用,但是都必须使用到但是都必须使用到CALLCALL语句。语句。语法格式:语法格式:CALL sp_name(parameter,.)CALL sp_name(parameter,.)parameterparameter为调用该存储过程使用的参数,这条语句中的参数个数必为调用该存储过程使用的参数,这条语句中的参数个数必须总是等于存储过程的参数个数。须总是等于存储过程的参数个数。如果是输出变量,前面加如果是输出变量,前面加 调用该存储过程:调用该存储过程:CALL COMPAR(3, 6, K);CALL COMPAR(3, 6, K);SELECT K;SELECT K;说明:说明:3 3和和6 6相当于输入参数相当于输入参数K1K1和和K2K2,用户变量,用户变量K K相当于输出参数相当于输出参数K3K3。可以看到,由于可以看到,由于363=5 AND sl10 THEN UPDATE Sell SET 订购单价订购单价=订购单价订购单价*0.8 WHERE 身份证号身份证号=sfz AND 图书编号图书编号=bh; END IF; END IF; END$DELIMITER ;调用存储过程调用存储过程dj_update: CALL dj_update (张三张三, 网络数据库网络数据库);调用存储过程举例CASE语句(2 2)CASECASE语句语句语法格式为:语法格式为: CASE 表达式表达式 WHEN 值值1 THEN 语句序列语句序列1 WHEN值值2 THEN语句序列语句序列2 . ELSE语句序列语句序列e END CASE或者:或者: CASE WHEN 条件条件1 THEN 语句序列语句序列1 WHEN条件条件2 THEN语句序列语句序列2 . ELSE语句序列语句序列e END CASE 第一种格式中第一种格式中表达式表达式是要被判断的值或表达式,接下来是一系列的是要被判断的值或表达式,接下来是一系列的WHEN-THEN块,每一块的块,每一块的值值参数都要与参数都要与表达式表达式比较的值,如果为真,就执行比较的值,如果为真,就执行语句序列语句序列中的中的SQL语句。如果前面的每一个块都不匹配就会执行语句。如果前面的每一个块都不匹配就会执行ELSE块指定的块指定的语句。语句。CASE语句最后以语句最后以END CASE结束。结束。 第二种格式中第二种格式中CASE关键字后面没有参数,在关键字后面没有参数,在WHEN-THEN块中,块中,条条件件指定了一个比较表达式,表达式为真时执行指定了一个比较表达式,表达式为真时执行THEN后面的语句。后面的语句。 第二种格式与第一种格式相比,更能够实现更为复杂的条件判断,使用第二种格式与第一种格式相比,更能够实现更为复杂的条件判断,使用起来更方便。起来更方便。【例例8.25】 创建一个存储过程,当给定参数为时返回创建一个存储过程,当给定参数为时返回“上升上升”,给定参数为,给定参数为时返回时返回“下降下降”,给定其他参数时返回,给定其他参数时返回“不变不变”。 DELIMITER $ CREATE PROCEDURE var_cp(IN str VARCHAR(1), OUT direct VARCHAR(4) ) BEGIN CASE strWHEN U THEN SET direct =上升上升;WHEN D THEN SET direct =下降下降;ELSE SET direct =不变不变; END CASE; END$ DELIMITER ;以上的以上的CASE语句用第二种格式来写如下:语句用第二种格式来写如下: CASE WHEN str= U THEN SET direct =上升上升;WHEN str= D THEN SET direct =下降下降;ELSE SET direct =不变不变; END CASE;CASE语句举例课堂练习1 1、创建存储过程,创建存储过程,输入员工编号输入员工编号bhbh ,输出该员工的性别。,输出该员工的性别。2 2、创建存储过程,创建存储过程,输入员工编号输入员工编号bhbh和级别和级别jbjb两个参数,如果两个参数,如果jbjb为为A A,该员,该员工收入增加工收入增加500500元,元, jbjb为为B B,该员工收入增加,该员工收入增加300300元,元,jbjb为为C C,该员工收入,该员工收入增加增加150150元,元,jbjb为为A A、B B、C C以外的其他值,该员工收入增加以外的其他值,该员工收入增加5050元。元。3 3、创建存储过程,比较两个员工的实际收入,如前者比后者高就输出、创建存储过程,比较两个员工的实际收入,如前者比后者高就输出0 0,否则输出否则输出1 1。并调用该存储过程比较。并调用该存储过程比较”000001”000001”和和”108991”108991”两员工的收两员工的收入。入。课堂练习参考答案1 1、创建存储过程、创建存储过程create procedure cp(in id1 char(6),in id2 char(6),out bj int)begin declare sr1,sr2 float(8);select income-outcome into sr1 from salary where employeeid=id1;select income-outcome into sr2 from salary where employeeid=id2;if id1id2 then set bj=0;elseset bj=1;end if;end 2 2、 调用存储过程:调用存储过程: call cp(000001,108991,bj)3 3、输出结果、输出结果 select bj;循环语句(3 3)循环语句)循环语句MySQLMySQL支持支持3 3条用来创建循环的语句:条用来创建循环的语句:WHILEWHILE、REPEATREPEAT和和LOOPLOOP语句。语句。 WHILEWHILE语句语法格式为:语句语法格式为: 开始标号开始标号: WHILE条件条件 DO程序段程序段 END WHILE 结束标号结束标号 语句首先判断语句首先判断条件条件是否为真,为真则执行是否为真,为真则执行程序段程序段中的语句,然中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。后再次进行判断,为真则继续循环,不为真则结束循环。 开始标号开始标号和和结束标号结束标号是是WHILE语句的标注。除非语句的标注。除非开始标号开始标号存存在,否则在,否则结束标号结束标号,并且如果两者都出现,它们的名字必须是相同的。,并且如果两者都出现,它们的名字必须是相同的。WHILE语句举例【例例8.26】 创建一个带创建一个带WHILE执行执行5次循环的存储过程。次循环的存储过程。 DELIMITER $ CREATE PROCEDURE dowhile() BEGIN DECLARE a INT DEFAULT 5; WHILE a 0 DO SET a = a 1; END WHILE; END$ DELIMITER ;REPEAT语句 REPEATREPEAT语句格式如下:语句格式如下: 开始标号开始标号: REPEAT 程序段程序段 UNTIL 条件条件 END REPEAT 结束标号结束标号用用REPEATREPEAT语句替换例语句替换例8.268.26的的WHILEWHILE循环过程如下:循环过程如下: REPEAT REPEAT a=a a=a 1;1; UNTIL a1; UNTIL a1; END REPEAT; END REPEAT;说明:说明:REPEATREPEAT语句和语句和WHILEWHILE语句的区别在于:语句的区别在于:REPEATREPEAT语句先执行语句,后语句先执行语句,后进行判断;而进行判断;而WHILEWHILE语句是先判断,条件为真时才执行语句。语句是先判断,条件为真时才执行语句。LOOP语句 LOOP LOOP语句语法格式如下:语句语法格式如下: 开始标号开始标号: LOOP 程序段程序段 END LOOP 结束标号结束标号说明:说明:LOOPLOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,允许某特定语句或语句群的重复执行,实现一个简单的循环构造,程序段程序段是需要重复执行的语句。在循环内的语句一直重复至循环被退出,退出时是需要重复执行的语句。在循环内的语句一直重复至循环被退出,退出时通常伴随着一个通常伴随着一个LEAVE LEAVE 语句。结构如下:语句。结构如下:LEAVE label【例例8.278.27】 使用使用LOOPLOOP语句重写语句重写8.268.26的存储过程。的存储过程。 DELIMITER $ DELIMITER $ CREATE PROCEDURE doloop() CREATE PROCEDURE doloop() BEGIN BEGIN SET a=5; SET a=5; Label: LOOP Label: LOOP SET a=a SET a=a 1;1; IF a1 THEN IF a1 THEN LEAVE Label; LEAVE Label; END IF; END IF; END LOOP Label; END LOOP Label; END$ END$ DELIMITER ; DELIMITER ;存储过程的嵌套【例例8.28】 创建一个存储过程创建一个存储过程sell_insert(),作用是向,作用是向Sell表中插入一行数据。创表中插入一行数据。创建另外一个存储过程建另外一个存储过程sell_update,在其中调用第一个存储过程,如果给定参数为,在其中调用第一个存储过程,如果给定参数为0,则修改由第一个存储过程插入记录的是否发货字段为则修改由第一个存储过程插入记录的是否发货字段为已发货已发货,如果给定参数为,如果给定参数为1则删除则删除第一个存储过程插入的记录,并将操作结果输出。第一个存储过程插入的记录,并将操作结果输出。第一个存储过程:向第一个存储过程:向Sell表中插入一行数据表中插入一行数据 CREATE PROCEDURE sell_insert() INSERT INTO Sell VALUES(17,430103198608201963, ISBN7-301-06342-3,4, 30, 2013-03-05, NULL, NULL, NULL);第二个存储过程:调用第一个存储过,并输出结果第二个存储过程:调用第一个存储过,并输出结果 CREATE PROCEDURE sell_update(IN X INT(1), OUT STR CHAR(8) BEGIN CALL sell_insert(); CASE WHEN x=0 THEN UPDATE Sell SET 是否发货=已发货 WHERE 订单号=17; SET STR=修改成功; WHEN X=1 THEN DELETE FROM Sell WHERE 订单号=17; SET STR=删除成功; END CASE; END 存储过程的嵌套接下来调用存储过程接下来调用存储过程sell_update来查看结果:来查看结果: CALL sell_update (1, str); SELECT str; 结果为:删除成功结果为:删除成功 CALL sell_update (0, str); SELECT str; 结果为:修改成功结果为:修改成功课堂练习1 1、创建存储过程,创建存储过程,输入一个数输入一个数x x ,输出,输出x!x!。2 2、创建存储过程创建存储过程DO_hz1DO_hz1,作用是向,作用是向salarysalary表中插入汇总行(合计,收入表中插入汇总行(合计,收入总和,支出总和)。创建另外一个存储过程总和,支出总和)。创建另外一个存储过程DO_show2DO_show2,在其中调用第一个,在其中调用第一个存储过程,并输出汇总结果。存储过程,并输出汇总结果。任务三 存储函数存储函数也是过程式对象之一,与存储过程很相似。它们都是由存储函数也是过程式对象之一,与存储过程很相似。它们都是由SQLSQL和过程和过程式语句组成的代码片断,并且可以从应用程序和式语句组成的代码片断,并且可以从应用程序和SQLSQL中调用。然而,它们也有一中调用。然而,它们也有一些区别:些区别:(1 1)存储函数不能拥有输出参数,因为存储函数本身就是输出参数;)存储函数不能拥有输出参数,因为存储函数本身就是输出参数;(2 2)不能用)不能用CALLCALL语句来调用存储函数;语句来调用存储函数;(3 3)存储函数必须包含一条)存储函数必须包含一条RETURNRETURN语句,而这条特殊的语句,而这条特殊的SQLSQL语句不允许包含语句不允许包含于存储过程中。于存储过程中。创建存储函数使用创建存储函数使用CREATE FUNCTIONCREATE FUNCTION语句。语句。语法格式:语法格式: CREATE FUNCTION 存储函数名存储函数名 (参数参数,.) RETURNS 类型类型 函数体函数体创建存储函数【例例8.298.29】 创建一个存储函数,它返回创建一个存储函数,它返回BookBook表中图书数目作为结果。表中图书数目作为结果。 DELIMITER $ DELIMITER $ CREATE FUNCTION num_book() CREATE FUNCTION num_book() RETURNS INTEGER RETURNS INTEGER BEGIN BEGINRETURN (SELECT COUNT(*) FROM Book);RETURN (SELECT COUNT(*) FROM Book); END$ END$ DELIMITER ; DELIMITER ;RETURNRETURN子句中包含子句中包含SELECTSELECT语句时,语句时,SELECTSELECT语句的返回结果只能是一行且只能语句的返回结果只能是一行且只能有一列值。有一列值。虽然此存储函数没有参数,使用时也要用(),如虽然此存储函数没有参数,使用时也要用(),如num_book()num_book()。要查看数据库中有哪些存储函数,可以使用要查看数据库中有哪些存储函数,可以使用SHOW FUNCTION STATUSSHOW FUNCTION STATUS命令。命令。 SHOW FUNCTION STATUS调用存储函数调用存储函数存储函数创建完后存储函数创建完后,就如同系统提供的内置函数(如就如同系统提供的内置函数(如VERSION()VERSION()),所以调),所以调用存储函数的方法也差不多,都是使用用存储函数的方法也差不多,都是使用SELECTSELECT关键字。关键字。语法格式为:语法格式为:SELECT sp_name (func_parameter,.)调用调用【例例8.298.29】存储函数存储函数: :Select NUM_book()存储函数举例【例例8.308.30】 创建一个存储函数,返回创建一个存储函数,返回BookBook表中某本书的作者姓名。表中某本书的作者姓名。 DELIMITER $ DELIMITER $ CREATE FUNCTION author_book(b_name CHAR(20) CREATE FUNCTION author_book(b_name CHAR(20) RETURNS CHAR(8) RETURNS CHAR(8) BEGIN BEGINRETURN (SELECT RETURN (SELECT 作者作者 FROM Book WHERE FROM Book WHERE 书名书名= b_name);= b_name); END$ END$ DELIMITER ; DELIMITER ;此存储函数给定书名,返回该书的作者。如要查询此存储函数给定书名,返回该书的作者。如要查询 计算机应用基础计算机应用基础 的作者,用的作者,用author_book(author_book(计算机应用基础计算机应用基础)。【例8.31】创建一个存储函数来删除创建一个存储函数来删除SellSell表中有但表中有但BookBook表中不存在的记录。表中不存在的记录。 CREATE FUNCTION del_Sell1(b_bh CHAR(20) CREATE FUNCTION del_Sell1(b_bh CHAR(20)RETURNS BOOLEANRETURNS BOOLEAN BEGIN BEGINDECLARE bh CHAR(20);DECLARE bh CHAR(20);SELECT SELECT 图书编号图书编号 INTO bh FROM Book WHERE INTO bh FROM Book WHERE 图书编号图书编号=b_bh;=b_bh;IF bh IS NULL THENIF bh IS NULL THENDELETE FROM Sell WHERE DELETE FROM Sell WHERE 图书编号图书编号=b_bh; =b_bh; RETURN TRUE;RETURN TRUE;ELSE ELSE RETURN FALSE;RETURN FALSE;END IF;END IF; END$ END$存储函数举例课堂练习1 1、创建一个存储函数,返回员工的总人数、创建一个存储函数,返回员工的总人数EM_NUM()EM_NUM()2 2、创建一个存储函数,判断员工是否在研发部工作,若是则、创建一个存储函数,判断员工是否在研发部工作,若是则返回其学历,若不是则返回返回其学历,若不是则返回“NONO”。课堂练习参考答案1 1、创建一个存储函数,返回员工的总人数、创建一个存储函数,返回员工的总人数EM_NUM()EM_NUM()CREATE FUNCTION EM_NUM() RETURNS Integer RETURN ( SELECT count( * ) FROM Employees);2 2、创建一个存储函数,判断员工是否在研发部工作,若是则返、创建一个存储函数,判断员工是否在研发部工作,若是则返回其学历,若不是则返回回其学历,若不是则返回“NONO”。CREATE FUNCTION XL(XH CHAR(6)RETURNS CHAR(10)BEGINDECLARE BM,ED CHAR(6);SELECT departmentID,education INTO BM,ED FROM employees WHERE employeeID =XH;IF bm=“4” THEN RETURN ED;ELSE RETURN “NO”;END IF;END任务四 触发器创建触发器语法格式:创建触发器语法格式: CREATE TRIGGER 触发器名触发器名 触发时间触发时间 触发事件触发事件 ON 表名表名 FOR EACH ROW 触发器动作触发器动作触发时间触发时间:触发器触发的时刻,有两个选项:触发器触发的时刻,有两个选项:AFTER和和BEFORE,以表示触,以表示触发器是在激活它的语句之前或之后触发。如果想要在激活触发器的语句执行之后执发器是在激活它的语句之前或之后触发。如果想要在激活触发器的语句执行之后执行几个或更多的改变,通常使用行几个或更多的改变,通常使用AFTER选项;如果想要验证新数据是否满足使用的选项;如果想要验证新数据是否满足使用的限制,则使用限制,则使用BEFORE选项。选项。触发事件触发事件:指明了激活触发程序的语句的类型。:指明了激活触发程序的语句的类型。触发事件触发事件可以是下述值之一:可以是下述值之一:INSERT:将新行插入表时激活触发器。例如,通过:将新行插入表时激活触发器。例如,通过INSERT、LOAD DATA和和REPLACE语句。语句。UPDATE:更改某一行时激活触发器。例如,通过:更改某一行时激活触发器。例如,通过UPDATE语句。语句。DELETE:从表中删除某一行时激活触发器。例如,通过:从表中删除某一行时激活触发器。例如,通过DELETE和和REPLACE语句。语句。触发器动作触发器动作:包含触发器激活时将要执行的语句。如果要执行多个语句,可使包含触发器激活时将要执行的语句。如果要执行多个语句,可使用用BEGIN . END复合语句结构。这样,就能使用存储过程中允许的相同语句。复合语句结构。这样,就能使用存储过程中允许的相同语句。 创建触发器举例【例例8.348.34】 创建一个表创建一个表table1table1,其中只有一列,其中只有一列a a。在表上创建一个。在表上创建一个触发器,每次插入操作时,将用户变量触发器,每次插入操作时,将用户变量strstr的值设为的值设为“TRIGGER IS TRIGGER IS WORKING”WORKING”。CREATE TABLE table1(a INTEGER);CREATE TRIGGER table1_insert AFTER INSERTON table1 FOR EACH ROWSET str= TRIGGER IS WORKING ;向向table1table1中插入一行数据:中插入一行数据: INSERT INTO table1 VALUES(10);查看查看strstr的值:的值: SELECT str;在在MySQLMySQL触发器中的触发器中的SQLSQL语句可以关联表中的任意列。但不能直接使用列的语句可以关联表中的任意列。但不能直接使用列的名称去标志,那会使系统混淆,因为激活触发器的语句可能已经修改、删除或名称去标志,那会使系统混淆,因为激活触发器的语句可能已经修改、删除或添加了新的列名,而列的旧名同时存在。因此必须用这样的语法来标志:添加了新的列名,而列的旧名同时存在。因此必须用这样的语法来标志:“NEW.column_name”NEW.column_name”或者或者“OLD.column_name”OLD.column_name”。NEW.column_nameNEW.column_name用来引用新用来引用新行的一列,行的一列,OLD.column_nameOLD.column_name用来引用更新或删除它之前的已有行的一列。用来引用更新或删除它之前的已有行的一列。对于对于INSERTINSERT语句,只有语句,只有NEWNEW是合法的;对于是合法的;对于DELETEDELETE语句,只有语句,只有OLDOLD才合法;才合法;而而UPDATEUPDATE语句可以与语句可以与NEWNEW或或OLDOLD同时使用。同时使用。创建触发器举例【例例8.358.35】 创建一个触发器,当删除表创建一个触发器,当删除表BookBook表中某图书的信息时,同时表中某图书的信息时,同时将将SellSell表中与该图书有关的数据全部删除。表中与该图书有关的数据全部删除。 DELIMITER $ DELIMITER $ CREATE TRIGGER book_del AFTER DELETE CREATE TRIGGER book_del AFTER DELETEON Book FOR EACH ROWON Book FOR EACH ROW BEGIN BEGINDELETE FROM Sell WHERE DELETE FROM Sell WHERE 图书编号图书编号=OLD.=OLD.图书编号图书编号; ; END$ END$ DELIMITER ; DELIMITER ;现在验证一下触发器的功能:现在验证一下触发器的功能: DELETE FROM Book WHERE 图书编号图书编号=ISBN 7-5006-6625;使用使用SELECT语句查看语句查看Sell表中的情况:表中的情况: SELECT * FROM Sell WHERE 图书编号图书编号=ISBN 7-5006-6625;这时可以发现,图书编号为这时可以发现,图书编号为ISBN 7-5006-6625在在Sell表中的所有表中的所有信息已经被删除了。信息已经被删除了。课堂练习创建触发器,在创建触发器,在EmployeesEmployees表中当删除员工信息的同时将表中当删除员工信息的同时将SalarySalary表表中与该员工有关的数据全部删除。中与该员工有关的数据全部删除。DELIMITER $CREATE TRIGGER EM_DELETE AFTER DELETEON Employees FOR EACH ROWBEGINDELETE FROM salary WHERE employeeID=OLD.employeeID;END$DELIMITER ;课堂练习参考答案课堂练习参考答案创建触发器举例【例例8.36】 创建一个触发器,当修改创建一个触发器,当修改Sell表中订购册数时,如果修改后的订购表中订购册数时,如果修改后的订购册数小于册数小于5本,则触发器将该对应的折扣修改为本,则触发器将该对应的折扣修改为1,否则,折扣修改为否则,折扣修改为0.8。 DELIMITER $ CREATE TRIGGER sell_update BEFORE UPDATEON Sell FOR EACH ROW BEGIN IF NEW.订购册数订购册数10,Book表中折扣在原折扣基表中折扣在原折扣基础上再打础上再打0.95折,否则折扣不变。折,否则折扣不变。 DELIMITER $ CREATE TRIGGER Sell_ins AFTER INSERTON Sell FOR EACH ROW BEGIN IF NEW.订购册数订购册数10 THEN UPDATE Book SET 折扣折扣=折扣折扣*.95 WHERE 图书编号图书编号=NEW.图书编号图书编号; END IF; END$ DELIMITER ;创建触发器举例课堂练习创建触发器,实现当向创建触发器,实现当向EmployeesEmployees表插入一行数据时,对表插入一行数据时,对SalarySalary表表也插入一行,也插入一行,EmployeeIDEmployeeID与与EmployeesEmployees表中的表中的EmployeeIDEmployeeID相同,相同,InComeInCome和和outcomeoutcome为为0.0.DELIMITER $CREATE TRIGGER EM_INSERT AFTER INSERTON Employees FOR EACH ROWBEGININSERT INTO SALARY VALUES(NEW. EmployeeID,0,0);END$DELIMITER ;课堂练习参考答案课堂练习参考答案触发器中调用存储过程【例例8.38】 假设假设Bookstore数据库中有一个与数据库中有一个与Members表结构完全一样的表结构完全一样的表表member_backup,创建一个触发器,在,创建一个触发器,在Members表中添加数据的时候,表中添加数据的时候,调用存储过程,将调用存储过程,将member_backup表中的数据与表中的数据与Members表同步。表同步。 首先,定义存储过程:创建一个与首先,定义存储过程:创建一个与Members表结构完全一样的表表结构完全一样的表member_backup DELIMITER $ CREATE PROCEDURE data_copy() BEGINREPLACE member_backup SELECT * FROM Members; END$ 接着创建触发器:调用存储过程接着创建触发器:调用存储过程data_copy() DELIMITER $ CREATE TRIGGER members_ins AFTER INSERT ON Members FOR EACH ROW CALL data_copy(); DELIMITER ;触发器的删除和其他数据库对象一样,使用和其他数据库对象一样,使用DROPDROP语句即可将触发器从数据库中删除。语句即可将触发器从数据库中删除。语法格式:语法格式: DROP TRIGGER 触发器名触发器名【例例8.398.39】 删除触发器删除触发器members_insmembers_ins。 DROP TRIGGER members_ins; DROP TRIGGER members_ins;创建触发器使用创建触发器使用CREATE TRIGGERCREATE TRIGGER语句语句 ,要查看数据库中有哪些触发,要查看数据库中有哪些触发器可以使用器可以使用SHOW TRIGGERSSHOW TRIGGERS命令。命令。 SHOW TRIGGERS课堂练习创建触发器,实现若将创建触发器,实现若将EmployeesEmployees表中员工的工作年限增加表中员工的工作年限增加n n年,年,收入增加收入增加n*500n*500。DELIMITER $CREATE TRIGGER EM_update AFTER updateON Employees FOR EACH ROWBEGINDECLARE years INT(1);set years=NEW.workyear-OLD.workyear; IF years=0 THEN UPDATE salary SET income=income+500*years where employeeID=NEW.employeeid;END IF;END$DELIMITER ;课堂练习参考答案课堂练习参考答案结束结束
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号