数据库高级应用技术03-(存储过程).ppt_第1页
数据库高级应用技术03-(存储过程).ppt_第2页
数据库高级应用技术03-(存储过程).ppt_第3页
数据库高级应用技术03-(存储过程).ppt_第4页
数据库高级应用技术03-(存储过程).ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高等职业技术院校教材 数据库高级应用技术 主编:温立辉 Date1 存储过程 本单元教学目标 了解存储过程的种类 认识、了解存储过程的作用 掌握存储过程的开发语法 熟练使用数据库IDE开发、调试存储过程 Date2 存储过程概念(一) nSQL语句: nSQL语句在执行的时候需要先编译先编译,然后执行然后执行 n存储过程: n存储过程(Stored Procedure) n n 是一组为了完成特定功能的是一组为了完成特定功能的SQLSQL语句集语句集 n n 经编译后存储在数据库中经编译后存储在数据库中 n用户通过指定存储过程的名字与参数存储过程的名字与参数(如果该存储 过程带有参数)来调用执行它。 Date3 存储过程概念(二) n一个存储过程是一个可编程可编程的函数函数 n它在数据库中创建并保存 n它由SQLSQL语句语句和一些特殊的控制结构控制结构组成 n存储过程适用于以下场合 n在不同的平台(应用程序)不同的平台(应用程序)上执行相同的函数 n n 封装特定功能封装特定功能 n是数据库编程中面向对象方法的模拟 Date4 存储过程优点(一) n(1).存储过程增强了SQL语言的功能和灵活性 n存储过程可以用流控制语句编写,有很强的灵活性 n可以完成复杂的判断和较复杂的运算 n(2).存储过程是允许编程的标准组件 n被创建后,可以在程序中被多次调用,而不必重新编写该存 储过程的SQL语句 n数据库专业人员可以随时对存储过程进行修改,对应用程序 源代码毫无影响 n(3).存储过程能实现较快的执行速度 n如果某一操作包含大量的SQL代码或分别被多次执行, n存储过程比批处理执行速度快很多,因存储过程是预编译的 n批处理的SQL语句在每次运行时要进行编译,速度相对慢 Date5 存储过程优点(二) n(4).存储过程能过减少网络流量。 n当同一操作所涉及的众多SQL语句被编码到存储过程中 n在客户机上调用该存储过程时,网络中只需传送该调用语句 n从而大大减少了网络流量并降低了网络负载 n(5).存储过程被作为一种安全机制来充分利用 n系统管理员通过执行某一存储过程的权限进行限制 n能够实现对相应的数据的访问权限的限制, n避免了非授权用户对数据的访问,从而保证了数据的安全 Date6 存储过程的创建 nMySQL格式: n n CREATE PROCEDURECREATE PROCEDURE 存储过程名存储过程名 ( 过过 程参数程参数,.,.) n n BEGINBEGIN n n过程控制语句(Transaction-SQL) n n n END END Date7 存储过程案例-创建User表 nCREATE DATABASE IF NOT EXISTS mydb; nUSE mydb; nDROP TABLE IF EXISTS user; nCREATE TABLE user ( n user_id int(10) unsigned NOT NULL auto_increment, n user_name varchar(45) NOT NULL, n pass_word varchar(45) NOT NULL, n email varchar(45) NOT NULL, n phone varchar(45) NOT NULL, n sex char(1) NOT NULL, n score int(10) unsigned NOT NULL, n PRIMARY KEY (user_id) n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; nINSERT INTO user (user_id,user_name,pass_word,email,phone,sex,score) VALUES n (1,LiMing,LiMing,LiM,83278904,0,60), n (2,ZhuangPing,ZhuangPing,ZhuangP,83278678,0,70), n (3,LuMei,LuMei,LuM,83278904,1,80), n (4,QiaoBing,QiaoBing,QiaoB,83278452,1,70), n (5,Kerry,Kerry,K,83278678,1,50), n (6,Jetty,Jetty,J,83278904,0,90), n (7,Lucy,Lucy,L,83278904,0,40), n (8,Honey,Honey,H,83278904,1,80), n (9,Wendy,Wendy,W,83278452,0,50), n (10,Rose,Rose,R,83278904,0,30); Date8 存储过程案例-开发编码 nDELIMITER / nCREATE PROCEDURE proc1(in s int) nBEGIN nupdate user set score=s where user_id in(2,4,6,8,10); nEND n/ nDELIMITER ; Date9 案例语句解释 nDELIMITER / n表示把MySQL分隔符修改为: “/“ nMySQL默认以“;”为分隔符 n如果没有声明分割符,编译器会把存储过程中的 ”;” 当成SQL语句结束分隔符 进行处理,则存储过程的编译过程会报错;所以要事先用DELIMITER关键字 声明当前段分隔符,这样MySQL才会将 “;” 当做存储过程中的代码,而不是 语句MySQL中语句的结束分隔符 n n DELIMITER ;DELIMITER ; n用完了之后要把分隔符还原为:“ ; “ n存储过程根据需要可能会有输入、输出、输入输出参数 n本案例中有一个输入参数s,类型是int型 n如果有多个参数用“,“分割开 n n 过程体的开始与结束使用过程体的开始与结束使用BEGINBEGIN与与ENDEND进行标识。进行标识。 Date10 存储过程调用 n调用格式如下: n n call + call + 存储过程名存储过程名 + + 参数参数 ncall proc1(100) ; n调用后看到user表中user_id为:2、4、6、 8、10 的记录的score字段值变为了100 n删除存储过程格式: n n drop + PROCEDURE +drop + PROCEDURE +存储过程名存储过程名 ndrop PROCEDURE proc1; Date11 存储过程参数 n n 存储过程共有三种参数类型存储过程共有三种参数类型,IN,OUT,INOUT,IN,OUT,INOUT,形式如:形式如: nCREATE PROCEDURE(IN |OUT |INOUT 参数名 数据 类形.) nIN 输入参数: n表示该参数值必须在调用存储过程时指定,在存储过程中修改该 参数值将不被返回,为默认值 nOUT 输出参数: n该值可在存储过程内部被改变,并可返回 nINOUT 输入输出参数: n调用时指定,并且可被改变和返回 Date12 IN参数例子 nDELIMITER / nCREATE PROCEDURE demo_in_parameter(IN p_id int, IN p_score_add int) nBEGIN nupdate user set score=(score+p_score_add) where user_id=p_id; nEND; n/ nDELIMITER ; Date13 存储过程调用( IN参数) n n 直接调用:直接调用: n n CALL CALL demo_in_parameterdemo_in_parameter (10,5000) ; (10,5000) ; n n 通过预定义参数变量调用:通过预定义参数变量调用: n n 先定义两个参数变量先定义两个参数变量 n n set set p_idp_id=10 ;=10 ; n n set set p_score_addp_score_add=5000 ;=5000 ; n n 再把变量作为参数调用再把变量作为参数调用 n n CALL CALL demo_in_parameter(p_id,p_score_adddemo_in_parameter(p_id,p_score_add) ;) ; 调用后可看到user_id 为10的score字段的 值增加了5000 Date14 OUT参数例子 nDELIMITER / nCREATE PROCEDURE demo_out_parameter(OUT p_out int) nBEGIN nSELECT COUNT(*) INTO p_out FROM user; nEND n/ nDELIMITER ; Date15 存储过程调用( OUT参数) n n 通过预定义输出参数变量调用:通过预定义输出参数变量调用: n n 先定义输出参数变量先定义输出参数变量 n n set set p_outp_out=0;=0; n n 再把变量作为参数调用再把变量作为参数调用 n n CALL CALL demo_out_parameter(p_outdemo_out_parameter(p_out);); 可以看到: 调用前p_out的变量值为0 调用后p_out的变量值为10 Date16 INOUT参数例子 nDELIMITER / nCREATE PROCEDURE demo_inout_parameter(INOUT p_inout_num int,INOUT p_inout_str varchar(50) nBEGIN nDECLARE id int default 0; nSET id=p_inout_num; nUPDATE user SET email=p_inout_str WHERE user_id=id; nSELECT score INTO p_inout_num FROM user WHERE user_id=id; nSELECT phone INTO p_inout_str FROM user WHERE user_id=id; nEND n/ nDELIMITER ; Date17 INOUT参数例子 n n 通过预定义输出参数变量调用:通过预定义输出参数变量调用: n n 先定义输出参数变量先定义输出参数变量 n n set p_inout_num=5;set p_inout_num=5; n n set p_inout_str=T;set p_inout_str=T; n n 再把变量作为参数调用再把变量作为参数调用 n n call call demo_inout_parameter(p_inout_num,demo_inout_parameter(p_inout_num, p_inout_strp_inout_str);); Date18 INOUT参数例子(结果分析) 调用前: p_inout_num 的变量值为5 p_inout_str 的变量值为 T 调用后: p_inout_num 的变量值为50 对应score字段值 p_inout_str 的变量值为83278678 对应phone字段值 Date19 课堂练习1 n写一个存储过程,实现以下功能: n把上面USRE表中积分(score)大于60的用户同步到 一个VIP_USER表中 ninsert into new_table ( (column1,column2column1,column2) ) select column1 , column2 column1 , column2 from old_table n给积分60以下的女性会员(sex字段值为0),每人 加5分 n返回以上操作以后男会员的平均分与女会员的平均 分 Date20 变量 nmysql存储过程中,定义变量有两种方式: n n 会话变量:也叫用户变量,会话变量:也叫用户变量,使用set直接赋值,变量名以 开头 n例如:set num=1;set num=1; n可以在一个客户端会话的任何地方声明,作用域是整个会话。 n n 存储过程变量:存储过程变量:以 DECLARE 关键字声明的变量,只能在存储过 程中使用, n例如:DECLARE DECLARE mynummynum INT DEFAULT 0; INT DEFAULT 0; n主要用在存储过程中,或者是给存储传参数中。 n两者的区别是: n以DECLARE声明的变量都会被初始化为 NULL n而会话变量(即开头的变量)则不会被再初始化 n在一个会话内,只须初始化一次 n会话断开后,会话变量也就消失 Date21 存储过程变量 n变量定义 n n DECLARE +DECLARE +变量名变量名+数据类型数据类型 + DEFAULT value;+ DEFAULT value; n数据类型为MySQL的数据类型 n如:int, float, date, varchar(length) n默认值:DEFAULT value,可有可无 n例如: n n DECLARE DECLARE my_intmy_int intint default 4000000; default 4000000; n n DECLARE DECLARE my_numericmy_numeric number(8,2) DEFAULT 9.95; number(8,2) DEFAULT 9.95; n n DECLARE DECLARE my_datemy_date date DEFAULT 1999-12-31; date DEFAULT 1999-12-31; n n DECLARE DECLARE my_datetimemy_datetime datetimedatetime DEFAULT 1999-12-31 DEFAULT 1999-12-31 23:59:59; 23:59:59; n n DECLARE DECLARE my_varcharmy_varchar varchar(255) DEFAULT This will not be varchar(255) DEFAULT This will not be padded;padded; Date22 存储过程变量 n变量赋值 n n SET SET 变量名变量名 = = 表达式值表达式值 n例如: n n SET SET my_intmy_int =100 =100 n n SET SET my_numericmy_numeric = 11.02 = 11.02 n n SET SET my_datemy_date = 2009-11-21 = 2009-11-21 n n SET SET my_datetimemy_datetime = 2009-11-21 20:50:50 = 2009-11-21 20:50:50 n n SET SET my_varcharmy_varchar = Hello = Hello n变量取值 n n 直接调用变量名即可取得变量值直接调用变量名即可取得变量值 n例如: nINSERT INTO table1 VALUES (my_intmy_int ) n上面的INSERT语句直接用前面定义的my_intmy_int 变量名,即可取得变量值100100 Date23 变量案例 nDELIMITER / nCREATE PROCEDURE proc_declare_demo(IN p_in INTEGER) nBEGIN n n DECLARE DECLARE mystrmystr CHAR(10); CHAR(10); nIF p_in = 17 THEN nSET mystrmystr = -birds-; nELSE nSET mystrmystr = -beasts-; nEND IF; nINSERT INTO user (user_name,pass_word,email,phone,sex,score) VALUES n(mystrmystr,mystrmystr,-,81234567,0,111); nEND n/ nDELIMITER ; Date24 变量作用域 n变量的作用范围: n往上回溯,从最靠近变量的第一个从最靠近变量的第一个beginbegin开始开始 n往下延伸,到最靠近变量的第一个到最靠近变量的第一个endend结束结束 n n 内部的变量比外部变量内部的变量比外部变量在其作用域范围内享有更高更高 的优先权的优先权 Date25 变量作用域案例 nDELIMITER / nCREATE PROCEDURE proc3() nbegin n n declare x1 varchar(5) default outer;declare x1 varchar(5) default outer; n begin n n declare x1 varchar(5) default inner; declare x1 varchar(5) default inner; n n select x1; select x1; n end; n n select x1;select x1; nend; n/ nDELIMITER ; Date26 课程练习2 n写一个存储过程,实现以下功能: n给上面用户表(User表),增加一个备注字段(mark) n n ALTER TABLE user ADD COLUMN mark VARCHAR(45) AFTER scoreALTER TABLE user ADD COLUMN mark VARCHAR(45) AFTER score n用DECLAREDECLARE定义几个存储过程变量 n变量1值为:“不活跃会员” n变量2值为:“普通会员” n变量3值为:“高级会员” n根据上面定义的变量填充mark字段 n如果积分在60分以下,填充变量1的值 n如果积分在60-79分,填充变量2的值 n如果积分在80分以上,填充变量3的值 n返回以上操作以后每个等级会员的个数 Date27 注释 nMySQL存储过程可使用两种风格的注释 n双模杠: n n - - + 空格空格 n该风格一般用于单行单行注释 n编程风格: n n /*/* */*/ n一般用于多行多行注释 Date28 注释样例 Date29 条件语句(ifthen) nifthen elseifthenelse语句 nif后面跟判断条件判断条件 nelseif后面跟判断条件判断条件 nthen后面跟条件分支语句块条件分支语句块 n可以有多个多个elseifelseifthenthen语句块,也可以没有 nelse表示以上条件均不满足以上条件均不满足时会执行的语句块执行的语句块 n整个条件语句块的最后面以end ifend if表示结束 Date30 条件语句案例(ifthen) nDELIMITER / nCREATE PROCEDURE proc_if_else(IN if_parameter int) nbegin ndeclare condition_para int; nset condition_para=if_parameter; n n if if condition_para=1 thenthen nINSERT INTO user (user_name,pass_word,email,phone,sex,score) VALUES n(if_user,if_user,if_,88888888,0,100); n n elseifelseif condition_paracondition_para=2 =2 thenthen nupdate user set score=200 where user_id5; n n else else nupdate user set score=1000; n n end ifend if; nend; n/ nDELIMITER ; Date31 课程练习3 n写一个存储过程: n如果输入参数值为1 n把user表数据同步到user_info表 n如果输入参数值为2 n删除user_info表数据 n如果输入参数值为3 n把user表数据同步到user_bak表 n如果输入参数值为4 n删除user_bak表数据 n如果输入参数值为5 n同时删除user_info 、user_bak表数据 nuser、user_info 、user_bak 三个表结构相同 n用ifthen elseifthenelse语句实现 Date32 SELECT中的IF条件语句 nIF表达式: n n IF(expr1,expr2,expr3)IF(expr1,expr2,expr3) n如果 expr1expr1 是TRUE 则 IF()的返回值为expr2expr2 n否则返回值则为 expr3expr3 nIF() 的返回值为数字值或字符串值,具体情 况视其所在语境而定 n n select select if(sexif(sex=0,=0,女女,男男) from user;) from user; Date33 条件语句(casewhen) ncasewhenthenelse语句 ncase后面跟条件变量条件变量 nwhen后面跟条件值条件值 nthen后面跟条件分支语句块条件分支语句块 n可以有多个多个whenthenwhenthen语句块,也可以只有 有一个 nelse表示以上条件均不满足以上条件均不满足时会执行的语句块执行的语句块 n整个条件语句块最后面以end caseend case表示结束 Date34 条件语句案例(casewhen) nDELIMITER / nCREATE PROCEDURE proc_case_when(IN case_parameter int) nbegin ndeclare condition_para int; nset condition_para=case_parameter; n n casecase condition_paracondition_para n n whenwhen 1 1 thenthen nINSERT INTO user (user_name,pass_word,email,phone,sex,score) VALUES(case_user,case_user,case_,7777777,0,200); n n whenwhen 2 2 thenthen nupdate user set score=300 where user_id5; n n elseelse nupdate user set score=2000; n n end caseend case; nend; n/ nDELIMITER ; Date35 课程练习4 n用 casewhenthenelse 语句改写课 程练习3 Date36 SELECT中的CASEWHEN n语句格式: nselect case whencase when A条件 thenthen 字段1 whenwhen B条 件 thenthen 字段2 elseelse 字段0 end end from tb n n SELECT CASE WHEN SEX=0 THEN SELECT CASE WHEN SEX=0 THEN 女女 WHEN WHEN SEX=1 THEN SEX=1 THEN 男男 ELSE ERROR END FROM USER; ELSE ERROR END FROM USER; Date37 循环语句(whiledo) nwhiledo语句 nwhile后面跟条件表达式条件表达式 ndo后面跟条件分支语句块条件分支语句块 n整个条件语句块最后面以end whileend while表示结束 Date38 循环语句案例(whiledo) nDELIMITER / nCREATE PROCEDURE proc_while_do() nbegin ndeclare a int; nset a=0; n n whilewhile a=200b=200 n n end repeatend repeat; nend; n/ nDELIMITER ; Date42 课程练习6 n用 repeatuntil语句改写课程练习5 Date43 循环语句(loopleave) nloopleave语句 nloop循环不需要初始条件 nloop循环格式:循环标识循环标识 + : + loop+ : + loop n n 如:如: LOOP_LABLE : loopLOOP_LABLE : loop n不需要结束条件, leave语句即表示跳出循环 nleave的格式是: leave + leave + 循环标识循环标识 n n 如:如:leave LOOP_LABLEleave LOOP_LABLE n整个条件语句块最后面以end loopend loop表示结束 Date44 循环语句案例(loopleave) nDELIMITER / nCREATE PROCEDURE proc_loop () nbegin ndeclare c int; nset c=0; n n LOOP_LABLE:loopLOOP_LABLE:loop nINSERT INTO user (user_name,pass_word,email,phone,sex,score) VALUES(loop_user,loop_user,loop_,22222222,0,c); nset c=c+1; nif c =400 then n n leave LOOP_LABLE; leave LOOP_LABLE; nend if; n n end loop;end loop; nend; n/ nDELIMITER ; Date45 课程练习7 n用 loopleave语句改写课程练习5 Date46 游标(cursor) n游标的作用及属性 n游标的作用是: n n 对查询数据库所返回的记录进行遍历对查询数据库所返回的记录进行遍历 n游标如下属性: n游标是只读的只读的,也就是不能更新它; n游标是不能滚动的不能滚动的,也就是只能在一个方向上进只能在一个方向上进 行遍历行遍历,不能在记录之间随意进退,不能跳过某 些记录; n避免在已经打开游标的表上更新数据 Date47 如何使用游标 n首先用DECLARE语句声明一个游标 n格式: n n DECLARE + DECLARE + 游标名游标名 + CURSOR FOR + + CURSOR FOR + SELECTSELECT语句语句 n n 例如,声明一个叫例如,声明一个叫mycoursormycoursor的游标:的游标: nDECLARE mycoursor CURSOR FOR select user_name , password from user Date48 如何使用游标 n其次需要使用OPEN语句来打开定义的游标 n格式: n n OPEN + OPEN + 游标名游标名 n n 例如,打开一个叫例如,打开一个叫mycoursormycoursor的游标:的游标: nOPEN mycoursor Date49 如何使用游标 n接下来可以用FETCH语句来获得下一行数据 n游标将移动到对应的记录上 n类似java里面的iterator n格式: n n FETCH + FETCH + 游标名游标名 + INTO + + INTO + 变量列表变量列表 n n 例如:例如: n n 把把mycoursormycoursor游标的一行记录装进游标的一行记录装进my_namemy_name、my_pwdmy_pwd 变量变量 nFETCH mycoursor INTO my_name , my_pwd nmy_name 、 my_pwd 两个变量需提前定义好 Date50 如何使用游标 n最后操作都结束后要把游标释放掉 n格式: n n CLOSE + CLOSE + 游标名游标名 n n 例如:关闭例如:关闭mycoursormycoursor游标游标 nCLOSE mycoursor Date51 如何使用游标 n定义一个NOT FOUND条件处理函数 n游标到达记录的末尾时避免出现“no data to fetch”这样的错误 n格式: n n DECLARE CONTINUE HANDLER FOR NOT FOUND DECLARE CONTINUE HANDLER FOR NOT FOUND + + 需要执行的语句需要执行的语句 n例如: n n DECLARE CONTINUE HANDLER FOR NOT FOUNDDECLARE CONTINUE HANDLER FOR NOT FOUND SET SET no_more_productsno_more_products = 1 = 1 Date52 游标使用案例-建表 nCREATE DATABASE IF NOT EXISTS mydb; nUSE mydb; nDROP TABLE IF EXISTS products; nCREATE TABLE products ( n id int(10) unsigned NOT NULL auto_increment, n name varchar(45) NOT NULL, n category varchar(45) NOT NULL, n price float NOT NULL, n code varchar(45) NOT NULL, n quantity int(10) unsigned NOT NULL, n PRIMARY KEY (id) n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; nINSERT INTO products (id,name,category,price,code,quantity) VALUES n (1,cake,dessert,10,112011,323), n (2,cheese,dairy,12.5,112010,55), n (3,cookie,dessert,50,112012,323), n (4,carpet,furniture,100,113010,323), n (5,couch,furniture,1250,113011,15); Date53 游标使用案例 n/* 游标使用演示获取库存量小于100的产品的代码code */ nDELIMITER $ nDROP PROCEDURE IF EXISTS CursorProc $ nCREATE PROCEDURE CursorProc () nBEGIN n DECLARE no_more_products, quantity_in_stock INT DEFAULT 0; n DECLARE prd_code VARCHAR(255); n DECLARE cur_product CURSOR FOR SELECT code FROM products; /*First: Delcare a cursor,首先这里对游标进行定义*/ n DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1; /*when “not found“ occur,just continue,这个是个条件处理,针对NOT FOUND的 条件*/ n /* for loggging information 创建个临时表格来保持*/ n CREATE TEMPORARY TABLE infologs ( n Id int(11) NOT NULL AUTO_INCREMENT, n Msg varchar(255) NOT NULL, n PRIMARY KEY (Id) n ); n OPEN cur_product; /*Second: Open the cursor 接着使用OPEN打开游标*/ n FETCH cur_product INTO prd_code; /*Third: now you can Fetch the row 把第一行数据写入变量中,游标也随之指向了记录的第一行*/ n REPEAT n SELECT quantity INTO quantity_in_stock n FROM products n WHERE code = prd_code; n n IF quantity_in_stock 100 THEN n INSERT INTO infologs(msg) n VALUES (prd_code); n END IF; n FETCH cur_product INTO prd_code; n UNTIL no_more_products = 1 n END REPEAT; n CLOSE cur_product; /*Finally: cursor need be closed 用完后记得用CLOSE把资源释放掉*/ n SELECT * FROM infologs; n DROP TABLE infologs; nEND $ nDELIMITER ; Date54 课程练习7 n改用游标功能实现课程练习1 Date55 基本函数-字符串类 nCHARSET(str) /返回字串字符集 nCONCAT(string2,string3,.) /连接字串 nINSTR(string ,substring ) /返回substring首次在string中出现的位置,不存在返回0 nLCASE(string2 ) /转换成小写 nUCASE(string2 ) /转换成大写 nLEFT(string2 ,length ) /从string2中的左边起取length个字符 nRIGHT(string2 ,length ) /从string2中的右边起取length个字符 nLENGTH(string ) /string长度 nLTRIM(string2 ) /去除前端空格 nRTRIM(string2 ) /去除后端空格 nTRIM(string2 ) /去除前后端空格 nSPACE(count) /生成count个空格 nREPLACE(str ,search_str ,replace_str ) /在str中用replace_str替换search_str nSUBSTRING(str, position ,length) /从str的position开始,取length个字符, position从1开始 Date56 基本函数-数学类 nABS(number2 ) /绝对值 nBIN(decimal_number ) /十进制转二进制 nCEILING(number2 ) /向上取整 nFLOOR(number2 ) /向下取整 nFORMAT(number,decimal_places ) /保留小数位数 nLEAST(number,number2,) /求最小值 nMOD(numerator ,denominator ) /求余 nSQRT(number2) /开平方 nRAND() /随机数 nROUND (number) /四舍五入,保留到整数 nROUND (number ,decimals) /四舍五入,decimals为小数位数 Date57 基本函数-日期类 nCURRENT_DATE( ) /当前日期 nCURRENT_TIME( ) /当前时间 nCURRENT_TIMESTAMP( ) /当前时间戳 nNOW( ) /当前时间 nSEC_TO_TIME(seconds ) /秒数转成时间(时、分、秒) nMAKETIME(hour ,minute ,second ) /生成时间串 nYEAR(datetime ) /年份 nMONTH(datetime) /月 nDATE(datetime ) /返回datetime的日期部分 nHOUR(datetime) /小时 Date58 存储过程函数演示 n字符串类 n数学类 n日期类 Date59 数学操作符 Date60 单元作业1 n用存储过程存储过程对商品销售明细表商品销售明细表(order_detailorder_detail)作如下统 计操作: n按月统计出7、8月份的销售金额,把数据汇总到月销售汇总表月销售汇总表( order_monthorder_month) n按商品类型统计出各种类型商品销售金额,把数据汇总到类型销售类型销售 汇总表汇总表(order_total_typeorder_total_type) n按月份及商品类型统计出7、8月份各种类型商品销售金额,把数据 汇总到月类型销售汇总表月类型销售汇总表(order_total_type_monthorder_total_type_month) n n 参考语句:参考语句: ninsert into new_table ( (column1,column2column1,column2) ) select column1 , column2 column1 , column2 from old_table Date61 建表脚本 nCREATE DATABASE IF NOT EXISTS mydb; nUSE mydb; nDROP TABLE IF EXISTS order_detail; nCREATE TABLE order_detail ( n order_id int(10) unsigned NOT NULL auto_increment, n commodity varchar(45) NOT NULL, n commodity_num int(10) unsigned NOT NULL, n order_money float NOT NULL, n order_time datetime NOT NULL, n commodity_type varchar(45) default NULL, n PRIMARY KEY (order_id) n) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; nINSERT INTO order_detail (order_id,commodity,commodity_num,order_money,order_time,commodity_type) VALUES n (1,衬衣,9,900,2015-07-02 12:13:20,服装), n (2,帽子,30,600,2015-08-07 12:13:40,服装), n (3,裤子,8,640,2015-08-17 11:13:20,服装), n (4,大米,100,350,2015-07-20 12:13:20,食品), n (5,零食,50,200,2015-08-11 12:13:40,食品), n (6,蔬菜,30,90,2015-07-09 12:12:30,食品), n (7,面包,20,80,2015-08-25 12:13:40,食品), n (8,风车,10,70,2015-07-21 12:13:30,玩具), n (9,汽球,40,60,2015-08-13 12:13:45,玩具), n (10,钢笔,25,500,2015-07-10 12:13:35,文具), n (11,铅笔,150,300,2015-08-14 12:13:45,文具), n (12,毛笔,10,50,2015-07-0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论