mysql课件第十四章存储过程和函数.ppt
MySql数据库数据库天津理工大学 华信软件学院 田春艳 2011年9月-2012年1月 Mysql入门很简单 田春艳 存储过程和函数存储过程和函数(存储过程和函数(1)n n存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。Mysql入门很简单 田春艳 存储过程和函数存储过程和函数(存储过程和函数(2)n n将使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中。n n例如,银行经常需要计算用户的利息。不同类别例如,银行经常需要计算用户的利息。不同类别的用户的利率是不一样的。这就可以将计算利率的用户的利率是不一样的。这就可以将计算利率的的SQLSQL代码写成一个存储过程或者存储函数。只要代码写成一个存储过程或者存储函数。只要调用这个存储过程或者存储函数,就可以将不同调用这个存储过程或者存储函数,就可以将不同类别用户的利息计算出来。类别用户的利息计算出来。Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义创建存储过程和函数定义n n变量的定义赋值n n定义条件和处理程序n n游标的使用n n流程控制的使用n n修改存储过程和函数n n删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数创建存储过程创建存储过程n nMySQL中,创建存储过程的基本形式如下:n nCREATE procedure sp_name CREATE procedure sp_name(过程参数(过程参数1 1,过程,过程参数参数22)begin begin 过程体过程体 end end Mysql入门很简单 田春艳 存储过程和函数例如例如mysqlDELIMITER /mysqlCREATEPROCEDUREproc1(OUTsint)BEGINSELECTCOUNT(*)INTOsFROM student;ENDmysqlDELIMITER;Mysql入门很简单 田春艳 存储过程和函数注意事项注意事项n nDELIMITER /DELIMITER /和和 DELIMITER DELIMITER ;MySQL MySQL默认以默认以“;”“;”为一个命令的结束为一个命令的结束n n参数参数n nCREATE PROCEDURE(IN|OUT|INOUT CREATE PROCEDURE(IN|OUT|INOUT 参数名参数名数据类数据类形形.).)n nININ输入参数输入参数:表示该参数的值必须在调用存储过程时指定,表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值在存储过程中修改该参数的值不能被返回,为默认值n nOUTOUT输出参数输出参数:该值可在存储过程内部被改变,并可返回该值可在存储过程内部被改变,并可返回n nINOUTINOUT输入输出参数输入输出参数:调用时指定,并且可被改变和返回调用时指定,并且可被改变和返回n n过程体的开始与结束使用过程体的开始与结束使用BEGINBEGIN与与ENDEND进行标识。进行标识。Mysql入门很简单 田春艳 存储过程和函数创建存储函数创建存储函数n nMySQL中,创建存储函数的基本形式如下:n nCREATE function sp_name(函数的参数)RETURNS type characteristic.routine_body Mysql入门很简单 田春艳 存储过程和函数例如例如n nDelimiter/Create function t_f(s int)returns char(20)bengin return(select sname from student where sno=s);end/n ndelimiter;Mysql入门很简单 田春艳 存储过程和函数存储过程和函数的区别存储过程和函数的区别n n关键字 n nPROCEDUREPROCEDURE、function functionn n参数上 n n存储过程可以的参数分为存储过程可以的参数分为IN|OUT|INOUT IN|OUT|INOUT n n存储函数没有分类存储函数没有分类n n返回值上n n存储函数是有返回值的存储函数是有返回值的 而而PROCEDUREPROCEDURE是通过是通过参数返回的参数返回的 Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义n n变量的定义赋值变量的定义赋值n n定义条件和处理程序n n游标的使用n n流程控制的使用n n修改存储过程和函数n n删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数变量的使用变量的使用n n存储过程和函数中可以定义和使用变量。用户可以使用DECLARE关键字来定义变量。然后可以为变量赋值。这些变量的作用范围是BEGINEND程序段中。本小节将讲解如何定义变量和为变量赋值。n n1定义变量n n2为变量赋值 Mysql入门很简单 田春艳 存储过程和函数定义变量定义变量n nDECLARE var_name,.type DEFAULT value n n如如declare a,b,c int default 0declare a,b,c int default 0n n其中,其中,DECLARE DECLARE关键字是用来声明变量的;关键字是用来声明变量的;var_namevar_name参数是变量的名称,这里可以同时定义参数是变量的名称,这里可以同时定义多个变量;多个变量;typetype参数用来指定变量的类型;参数用来指定变量的类型;DEFAULT valueDEFAULT value子句将变量默认值设置为子句将变量默认值设置为valuevalue,没有使用没有使用DEFAULTDEFAULT子句时,默认值为子句时,默认值为NULLNULL。Mysql入门很简单 田春艳 存储过程和函数为变量赋值(为变量赋值(1)n n使用SET关键字来为变量赋值。基本语法如下:n nSET var_name=expr,var_name=expr.SET var_name=expr,var_name=expr.n n如:如:Set a=20,b=40,c=50Set a=20,b=40,c=50n n一个一个SETSET语句可以同时为多个变量赋值,各个变量的语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。赋值语句之间用逗号隔开。Mysql入门很简单 田春艳 存储过程和函数为变量赋值(为变量赋值(2)n n使用SELECTINTO语句为变量赋值。其基本语法如下:n nSELECT col_name,INTO var_name,FROM table_name WEHRE condition n n其中,其中,col_namecol_name参数表示查询的字段名称;参数表示查询的字段名称;var_namevar_name参数是变量的名称;参数是变量的名称;table_nametable_name参数指表的参数指表的名称;名称;conditioncondition参数指查询条件。参数指查询条件。n nSELECT d_id INTO my_sql FROM employee SELECT d_id INTO my_sql FROM employee WEHRE id=2;WEHRE id=2;Mysql入门很简单 田春艳 存储过程和函数使用使用set定义变量定义变量n nSet a=3;n n会话变量会话变量 对当前客户端有效对当前客户端有效n nSet global 变量名n n全局变量全局变量 对所有客户端生效对所有客户端生效 Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义n n变量的定义赋值n n定义条件和处理程序定义条件和处理程序n n游标的使用n n流程控制的使用n n修改存储过程和函数n n删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数定义条件和处理程序定义条件和处理程序n n定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。n n1定义条件n n2定义处理程序 Mysql入门很简单 田春艳 存储过程和函数定义条件定义条件n nMySQL中可以使用DECLARE关键字来定义条件。其基本语法如下:n nDECLARE condition_name CONDITION FOR condition_value n ncondition_value:n n SQLSTATE VALUE sqlstate_value|mysql_error_code Mysql入门很简单 田春艳 存储过程和函数n n/方法一:使用sqlstate_value n nDECLARE can_not_find CONDITION FOR SQLSTATE 42S02;n n/方法二:使用mysql_error_code n nDECLARE can_not_find CONDITION FOR 1146;Mysql入门很简单 田春艳 存储过程和函数定义处理程序定义处理程序n nDECLARE handler_type HANDLER for condition_value,.sp_statement n nhandler_type:n nCONTINUE|EXIT|UNDO CONTINUE|EXIT|UNDO Mysql入门很简单 田春艳 存储过程和函数n ncondition_value参数指明错误类型,该参数有6个取值。n nsqlstate_valuesqlstate_value和和mysql_error_codemysql_error_code与条件定义中的是同与条件定义中的是同一个意思。一个意思。n ncondition_namecondition_name是是DECLAREDECLARE定义的条件名称定义的条件名称n nSQLWARNINGSQLWARNING表示所有以表示所有以0101开头的开头的sqlstate_valuesqlstate_value值。值。n nNOT FOUNDNOT FOUND表示所有以表示所有以0202开头的开头的sqlstate_valuesqlstate_value值。值。n nSQLEXCEPTIONSQLEXCEPTION表示所有没有被表示所有没有被SQLWARNINGSQLWARNING或或NOT FOUNDNOT FOUND捕获的捕获的sqlstate_valuesqlstate_value值。值。Mysql入门很简单 田春艳 存储过程和函数n/方法一:捕获sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE 42S02SET info=CAN NOT FIND;n/方法二:捕获mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET info=CAN NOT FIND;n/方法三:先定义条件,然后调用 DECLARE can_not_find CONDITION FOR 1146;DECLARE CONTINUE HANDLER FOR can_not_find SET info=CAN NOT FIND;Mysql入门很简单 田春艳 存储过程和函数n/方法四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET info=ERROR;n/方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET info=CAN NOT FIND;n/方法六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET info=ERROR;Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义n n变量的定义赋值n n定义条件和处理程序n n游标的使用游标的使用n n流程控制的使用n n修改存储过程和函数n n删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数游标的使用游标的使用n n查询语句可能查询出多条记录,在存储过程和存储函数中使用游标来逐条读取查询结果集中的记录。游标的使用包括声明游标、打开游标、使用游标和关闭游标。游标必须声明在处理程序之前,并且声明在变量和条件之后。n n1 1声明游标声明游标n n2 2打开游标打开游标n n3 3使用游标使用游标n n4 4关闭游标关闭游标 Mysql入门很简单 田春艳 存储过程和函数声明游标(声明游标(1)n nMySQL中使用DECLARE关键字来声明游标。其语法的基本形式如下:n nDECLARE cursor_name CURSOR FOR select_statement;Mysql入门很简单 田春艳 存储过程和函数声明游标(声明游标(2)n n下面声明一个名为cur_employee的游标。代码如下:n nDECLARE cur_employee CURSOR FOR SELECT DECLARE cur_employee CURSOR FOR SELECT name,age FROM employee;name,age FROM employee;n n上面的示例中,游标的名称为cur_employee;SELECT语句部分是从employee表中查询出name和age字段的值。Mysql入门很简单 田春艳 存储过程和函数打开游标打开游标n nMySQL中使用OPEN关键字来打开游标。其语法的基本形式如下:n nOPEN cursor_name;OPEN cursor_name;n n其中,其中,cursor_namecursor_name参数表示游标的名称。参数表示游标的名称。n n例如:下面打开一个名为cur_employee的游标,代码如下:n nOPEN cur_employee;OPEN cur_employee;Mysql入门很简单 田春艳 存储过程和函数使用游标(使用游标(1)n nMySQL中使用FETCH关键字来使用游标。其语法的基本形式如下:n nFETCH cur_employee INTO var_name,var_name;n n其中,cursor_name参数表示游标的名称;var_name参数表示将游标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明游标之前就定义好。Mysql入门很简单 田春艳 存储过程和函数使用游标(使用游标(2)n n下面使用一个名为cur_employee的游标。将查询出来的数据存入emp_name和emp_age这两个变量中,代码如下:n nFETCH cur_employee INTO emp_name,emp_age;FETCH cur_employee INTO emp_name,emp_age;n n上面的示例中,将游标上面的示例中,将游标cur_employeecur_employee中中SELECTSELECT语句语句查询出来的信息存入查询出来的信息存入emp_nameemp_name和和emp_ageemp_age中。中。emp_nameemp_name和和emp_ageemp_age必须在前面已经定义。必须在前面已经定义。Mysql入门很简单 田春艳 存储过程和函数关闭游标MySQL中使用CLOSE关键字来关闭游标。其语法的基本形式如下:n nCLOSE cursor_name;CLOSE cursor_name;n n其中,其中,cursor_namecursor_name参数表示游标的名称。参数表示游标的名称。n n下面关闭一个名为cur_employee的游标。代码如下:CLOSE cur_employee;Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义n n变量的定义赋值n n定义条件和处理程序n n游标的使用n n流程控制的使用流程控制的使用n n修改存储过程和函数n n删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数流程控制的使用(流程控制的使用(1)n n存储过程和存储函数中可以使用流程控制来控制语句的执行。MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句、WHILE语句来进行流程控制。本小节将详细讲解这些流程控制语句。Mysql入门很简单 田春艳 存储过程和函数流程控制的使用(流程控制的使用(2)n n1IF语句n n2CASE语句n n3LOOP语句n n4LEAVE语句n n5ITERATE语句n n6REPEAT语句n n7WHILE语句 Mysql入门很简单 田春艳 存储过程和函数IF语句语句n n其语法的基本形式如下:IF search_condition THEN statement_list IF search_condition THEN statement_list ELSEIF search_condition THEN statement_list.ELSEIF search_condition THEN statement_list.ELSE statement_list ELSE statement_list END IF END IF Mysql入门很简单 田春艳 存储过程和函数If语句示例语句示例n n下面是一个IF语句的示例。代码如下:IF age=20&age=25&age30 THEN count2=count2+1;ELSE count3=count3+1;END IF;Mysql入门很简单 田春艳 存储过程和函数CASE 语句语句CASE case_value WHEN when_value THEN statement_list WHEN when_value THEN statement_list.ELSE statement_list END CASE n n其中,其中,case_valuecase_value参数表示条件判断的变量;参数表示条件判断的变量;when_valuewhen_value参数表示变量的取值;参数表示变量的取值;statement_list statement_list参数表示不同参数表示不同when_valuewhen_value值的执行语句。值的执行语句。n n适用于离散型适用于离散型 Mysql入门很简单 田春艳 存储过程和函数CASE 语句语句CASECASE语句还有另一种形式。语句还有另一种形式。CASE CASE WHEN search_condition THEN statement_list WHEN search_condition THEN statement_list WHEN search_condition THEN statement_list.WHEN search_condition THEN statement_list.ELSE statement_list ELSE statement_list END CASE END CASE n n其中,其中,search_conditionsearch_condition参数表示条件判断语句;参数表示条件判断语句;statement_liststatement_list参数表示不同条件的执行语句。参数表示不同条件的执行语句。n n适用于具体范围的情况适用于具体范围的情况 Mysql入门很简单 田春艳 存储过程和函数CASE 语句语句n nCASE age CASE age n nWHEN 20 THEN SET count1=count1+1;WHEN 20 THEN SET count1=count1+1;n nELSE SET count2=count2+1;ELSE SET count2=count2+1;n nEND CASE;END CASE;n n代码也可以是下面的形式:代码也可以是下面的形式:n nCASE CASE n nWHEN age=20 THEN SET count1=count1+1;WHEN age=20 THEN SET count1=count1+1;n nELSE SET count2=count2+1;ELSE SET count2=count2+1;n nEND CASE;END CASE;Mysql入门很简单 田春艳 存储过程和函数LOOP语句语句 n nLOOP LOOP 语句可以使某些特定的语句重复执行,实现一个语句可以使某些特定的语句重复执行,实现一个简单的循环。但是简单的循环。但是LOOPLOOP语句本身没有停止循环的语句,语句本身没有停止循环的语句,必须是遇到必须是遇到LEAVELEAVE语句等才能停止循环。语句等才能停止循环。LOOPLOOP语句的语句的语法的基本形式如下:语法的基本形式如下:n nbegin_label:LOOP begin_label:LOOP n nstatement_list statement_list n nEND LOOP end_label END LOOP end_label n n其中,其中,begin_labelbegin_label参数和参数和end_labelend_label参数分别表示循环开始参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;和结束的标志,这两个标志必须相同,而且都可以省略;statement_liststatement_list参数表示需要循环执行的语句。参数表示需要循环执行的语句。Mysql入门很简单 田春艳 存储过程和函数LEAVE语句n nLEAVE语句主要用于跳出循环控制。其语法形式如下:n nLEAVE label n n其中,label参数表示循环的标志。Mysql入门很简单 田春艳 存储过程和函数ITERATE语句n nITERATE语句也是用来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。ITERATE语句的基本语法形式如下:n nITERATE label n n其中,label参数表示循环的标志。Mysql入门很简单 田春艳 存储过程和函数ITERATE语句的示例语句的示例n n下面是一个ITERATE语句的示例。代码如下:n nCREATE PROCEDURE doiterate(p1 INT)CREATE PROCEDURE doiterate(p1 INT)n nBEGINBEGINn n label1:LOOP SET p1=p1+1;label1:LOOP SET p1=p1+1;n n IF p1 10 THEN ITERATE label1;END IF;IF p1 10 THEN ITERATE label1;END IF;n n LEAVE label1;LEAVE label1;n nSET y=p1;SET y=p1;n nEND LOOP label1;END LOOP label1;n nSET x=p1;ENDSET x=p1;END Mysql入门很简单 田春艳 存储过程和函数REPEAT语句n nREPEATREPEAT语句是有条件控制的循环语句。当满足语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。特定条件时,就会跳出循环语句。REPEATREPEAT语句语句的基本语法形式如下:的基本语法形式如下:n nbegin_label:REPEAT begin_label:REPEAT n nstatement_list statement_list n nUNTIL search_condition UNTIL search_condition n nEND REPEAT end_label END REPEAT end_label n n其中,其中,statement_liststatement_list参数表示循环的执行语句;参数表示循环的执行语句;search_conditionsearch_condition参数表示结束循环的条件,满足该参数表示结束循环的条件,满足该条件时循环结束。条件时循环结束。Mysql入门很简单 田春艳 存储过程和函数REPEATn nREPEAT n nSET count=count+1;n nUNTIL count=100 n nEND REPEAT;Mysql入门很简单 田春艳 存储过程和函数WHILE语句n nWHILE语句也是有条件控制的循环语句。WHILE语句是当满足条件时,执行循环内的语句。WHILE语句的基本语法形式如下:n nbegin_label:WHILE begin_label:WHILE 表达式表达式1 1 n nDO DO n nstatement_list statement_list n nEND WHILE end_label END WHILE end_label n n其中,表达式1参数表示循环执行的条件,满足该条件时循环执行;statement_list参数表示循环的执行语句。Mysql入门很简单 田春艳 存储过程和函数示例示例n nWHILE count100 DO n nSET count=count+1;n nEND WHILE;n n该示例循环执行count加1的操作,count值小于100时执行循环。如果count值等于100了,则跳出循环。WHILE循环需要使用END WHILE来结束。Mysql入门很简单 田春艳 存储过程和函数内容内容n n创建存储过程和函数定义n n变量的定义赋值n n定义条件和处理程序n n游标的使用n n流程控制的使用n n调用存储过程和函数调用存储过程和函数n n修改和删除存储过程和函数 Mysql入门很简单 田春艳 存储过程和函数调用存储过程和函数调用存储过程和函数n n存储过程和存储函数都是存储在服务器端的SQL语句的集合。要使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现。存储过程是通过CALL语句来调用的。而存储函数的使用方法与MySQL内部函数的使用方法是一样的。Mysql入门很简单 田春艳 存储过程和函数调用存储过程(调用存储过程(2)n nMySQL中使用CALL语句来调用存储过程。调用存储过程后,数据库系统将执行存储过程中的语句。然后,将结果返回给输出值。CALL语句的基本语法形式如下:n nCALL sp_name(parameter,);Mysql入门很简单 田春艳 存储过程和函数调用存储函数(调用存储函数(2)n nMySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。换言之,用户自己定义的存储函数与MySQL内部函数是一个性质的。区别在于,存储函数是用户自己定义的,而内部函数是MySQL的开发者定义的。Mysql入门很简单 田春艳 存储过程和函数查看存储过程和函数查看存储过程和函数n n存储过程和函数创建以后,用户可以查看存储过程和函数的状态和定义。用户可以通过SHOW STATUS语句来查看存储过程和函数的状态,也可以通过SHOW CREATE语句来查看存储过程和函数的定义。用户也可以通过查询information_schema数据库下的Routines表来查看存储过程和函数的信息。Mysql入门很简单 田春艳 存储过程和函数SHOW STATUS语句查看存储过程语句查看存储过程和函数的状态和函数的状态n nMySQL中可以通过SHOW STATUS语句查看存储过程和函数的状态。其基本语法形式如下:n nSHOW PROCEDURE|FUNCTION STATUS LIKE pattern ;n n其中,“PROCEDURE”参数表示查询存储过程;“FUNCTION”参数表示查询存储函数;“LIKE pattern”参数用来匹配存储过程或函数的名称。Mysql入门很简单 田春艳 存储过程和函数SHOW CREATE语句查看存储过程语句查看存储过程和函数的定义和函数的定义n nMySQL中可以通过SHOW CREATE语句查看存储过程和函数的状态。其基本语法形式如下:n nSHOW CREATE PROCEDURE|FUNCTION SHOW CREATE PROCEDURE|FUNCTION sp_name;sp_name;n n其中,其中,“PROCEDURE”“PROCEDURE”参数表示查询存储过程;参数表示查询存储过程;“FUNCTION”“FUNCTION”参数表示查询存储函数;参数表示查询存储函数;“sp_name”“sp_name”参数表示存储过程或函数的名称。参数表示存储过程或函数的名称。Mysql入门很简单 田春艳 存储过程和函数从从information_schema.Routines表中表中查看存储过程和函数的信息查看存储过程和函数的信息n n存储过程和函数的信息存储在存储过程和函数的信息存储在information_schemainformation_schema数据库下的数据库下的RoutinesRoutines表中。可以通过查询该表的记表中。可以通过查询该表的记录来查询存储过程和函数的信息。其基本语法形录来查询存储过程和函数的信息。其基本语法形式如下:式如下:n nSELECT*FROM information_schema.Routines SELECT*FROM information_schema.Routines WHERE ROUTINE_NAME=sp_name ;WHERE ROUTINE_NAME=sp_name ;n n其中,其中,ROUTINE_NAMEROUTINE_NAME字段中存储的是存储过字段中存储的是存储过程和函数的名称;程和函数的名称;“sp_name”“sp_name”参数表示存储过程参数表示存储过程或函数的名称。或函数的名称。Mysql入门很简单 田春艳 存储过程和函数修改存储过程和函数修改存储过程和函数n n修改存储过程和函数是指修改已经定义好的存储过程和函数。MySQL中通过ALTER PROCEDURE语句来修改存储过程。通过ALTER FUNCTION语句来修改存储函数。Mysql入门很简单 田春艳 存储过程和函数n nMySQL中修改存储过程和函数的语句的语法形式如下:ALTER PROCEDURE|FUNCTION sp_name characteristic.characteristic:CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA|SQL SECURITY DEFINER|INVOKER|COMMENT string Mysql入门很简单 田春艳 存储过程和函数删除存储过程和函数删除存储过程和函数n n删除存储过程和函数指删除数据库中已经存在的存储过程和函数。MySQL中使用DROP PROCEDURE语句来删除存储过程。通过DROP FUNCTION语句来删除存储函数。其基本形式如下:n nDROP PROCEDURE|FUNCTION sp_name;Mysql入门很简单 田春艳 存储过程和函数总结总结Q&A!