码迷,mamicode.com
首页 > 数据库 > 详细

MySQL之自定义函数与存储过程

时间:2019-08-10 14:09:18      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:加密   数据表   lang   流程语句   div   修改   upd   字符串长度   逗号   

MySQL数据库常用函数与自定义函数

 1 SELECT ABS(-8);#绝对值
 2 SELECT MOD(10,9); #取模
 3 SELECT FLOOR(12.99); #地板
 4 SELECT CEILING(10.01);#天花板
 5 SELECT ROUND(12.99);#随机数,看第一个小数点数
 6 SELECT CONCAT(i,love,java);#拼接
 7 SELECT * FROM t_user t WHERE t.`uname` LIKE CONCAT(%,a,%); #拼接应用
 8 SELECT LENGTH(ilovejava); #字符串长度,从1开始
 9 SELECT INSTR(ilovejava,java);#取字符所在的位置,从1开始
10 SELECT LEFT(ilovejava,4); #左边开始取4位
11 SELECT RIGHT(ilovejava,4); #右边开始取4位
12 SELECT SUBSTRING(ilovejava,5);  #包括第5个,后面的截取; 
13 SELECT SUBSTRING(ilovejava,6,2); #从6开始,取2个字符; 
14 SELECT LENGTH(   java     ); #12 
15 SELECT LENGTH(TRIM(   java     )); #4
16 SELECT LENGTH(RTRIM(   java     )); #7
17 SELECT LENGTH(LTRIM(   java     )); #9
18 SELECT REPLACE(ilovejavalove,love,); #将指定的字符(第二个参数)替换为指定字符(第三个参数)
19 SELECT REPEAT(ilovejava,10);# 循环10次
20 SELECT REVERSE(a1a);# 反转
21 SELECT INSERT(ilovejava,6,4,web);#将指定的字符串从第六位开始用替换成指定的字符(web)
22 SELECT NOW();    #当前日期与时间;
23 SELECT CURDATE();#当前日期(年月日)
24 SELECT CURTIME();#当前时间
25 SELECT YEAR(NOW());#当前时间的年
26 SELECT MONTH(NOW());#当前时间的月
27 SELECT DAY(NOW());#当前时间的天
28 SELECT DATE(NOW());#当前日期(年月日)
29 SELECT HOUR(NOW());#当前时间的时
30 SELECT MINUTE(NOW());#当前时间的分
31 SELECT SECOND(NOW());#当前时间的秒
32 SELECT DAYNAME(NOW());#英文的星期几
33 SELECT QUARTER(NOW());#一刻钟
34 
35 SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR);#当前时间添加指定的1小时
36 SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);#当前时间减去指定的1小时
37 SELECT DATE_ADD(NOW(), INTERVAL 100 DAY);#当前时间减去指定的1天
38 SELECT DATE_FORMAT(NOW(),%Y-%m-%d %T);#拼接字符串
39 
40 SELECT uname,upwd,CASE urid WHEN 1 THEN 学员 WHEN 2 THEN 教员 ELSE 未知角色;#控制流程
41 
42 SELECT MD5(‘123456‘) #加密函数
43 SELECT PASSWORD(‘123456‘)#加密函数
44 
45 SELECT FORMAT(2.32131216,2)#保留2位小数
46 
47 #流程控制
48 SELECT t.uid,t.`uname`, CASE t.`urid` 
49 WHEN 1 THEN 学员
50 WHEN 2 THEN 讲师
51 WHEN 3 THEN 班主任
52 WHEN 4 THEN 前台
53 WHEN 5 THEN 顾问
54 WHEN 6 THEN 财务
55 ELSE 未知角色  
56 END  角色
57  FROM t_user8 t;
58  
59  
60 INSERT INTO t_user (uname, upwd, uaddress, usalary, ubirthday) VALUES 
61 (班长2,MD5(123456),sz,15000,NOW());
62 
63 
64 SELECT  FORMAT(t.`usalary`,1) 保留一位小数后的工资   FROM t_user t WHERE t.uid=1;
65 
66 #自己调用自定义的函数; 
67 SELECT addNum(100,200);
68 #创建自定义函数
69 #DELIMITER $$ 
71 CREATE
72     FUNCTION `dbschool`.`add_nums`(num1 INT,num2 INT)#两个参数变量,类型
73     RETURNS INT(12) #返回类型与可控范围
74     BEGIN
75     RETURN num1+num2; # 返回的结果
76     END$$
78 DELIMITER ;

MySQL存储过程

  • 存储过程就是具有名字的一段代码,用来完成一个特定的功能。
  • 创建的存储过程保存在数据库的数据字典中。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

创建存储过程的语法

 1 CREATE
 2     /*[DEFINER = { user | CURRENT_USER }]*/
 3     PROCEDURE `dbschool`.`test`()
 4     /*LANGUAGE SQL
 5     | [NOT] DETERMINISTIC
 6     | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
 7     | SQL SECURITY { DEFINER | INVOKER }
 8     | COMMENT ‘string‘*/
 9     BEGIN
10 
11     END$$
12 
13 DELIMITER ;

其中的关键字作用

  分隔符 DELIMITER $$  

  结束符 DELIMITER ;

  声明存储过程: CREATE PROCEDURE 存储过程名  ([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) 

  存储过程开始和结束符号: BEGIN .... END

  变量定义: declare 变量名 类型(长度) default 默认值;

  变量赋值:SET 变量名=1  注意:在使用这个存储过程时,调用这个参数需要加上@符号

示例:

  1 ====================增加================
  2 
  3 DELIMITER $$
  4 
  5 #使用 java1302 数据库
  6 USE `java1302`$$
  7 
  8 #删除如果存在 insert_user 存储流程,则删除
  9 DROP PROCEDURE IF EXISTS `insert_user`$$
 10 
 11 #创建自定义存储过程,有参有返,DEFINER=`root`@`localhost` 表示用户与本地服务器地址
 12 # PROCEDURE `insert_user`定义存储过程名
 13 CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_user`(
 14     IN u_name VARCHAR(20),##输入操作  参数名   参数类型; 
 15     IN u_pwd VARCHAR(50),##输入参数; 
 16     IN u_sex VARCHAR(2),##输入参数; 
 17     IN u_addr VARCHAR(100),##输入参数; 
 18     IN u_rid INT(4),##输入参数; 
 19     IN u_total DECIMAL(7,2),##输入参数; 
 20     OUT msg VARCHAR(20)        #输出 参数  参数类型,返回值; 因为是最后一个,所以 不需要逗号;     
 21     )
 22 BEGIN
 23     DECLARE t_cnt INT(4) DEFAULT 0;  # 自定义变量名,给定默认值,翻译:int t_cnt=0;
 24     
 25     #根据uname判断查询表t_user8中uid返回的数量
 26     SELECT COUNT(uid) INTO t_cnt FROM t_user8 WHERE uname = u_name; #如果有数据,t_cnt>0
 27     
 28     #IF语句控制流程 开始
 29     IF t_cnt=0 THEN
 30     #满足t_cnt=0就进入,执行这条语句
 31     INSERT INTO t_user8 (uname,upwd,usex,uaddr,urid,total)
 32         VALUES (u_name,u_pwd,u_sex,u_addr,u_rid,u_total);
 33         
 34     SET msg = 插入成功!; # 给返回的变量赋值
 35     ELSE 
 36     SET msg = 此用户名已经 存在,插入失败!;
 37     END IF; 
 38     #IF语句控制流程 结束
 39         
 40     SELECT msg; #查询返回变量的值,不然没有数据显示
 41     END$$ #  $$表示分隔
 42 
 43 DELIMITER ;#存储流程语句结束
 44 
 45 
 46 ======================删除========================
 47  DELIMITER $$
 48 
 49 CREATE
 50    
 51     PROCEDURE  `delete_user`(
 52     IN u_id INT(4),   ##输入参数; 
 53     OUT msg VARCHAR(20) ##输出参数; 
 54     )
 55     
 56     BEGIN
 57     
 58     DECLARE cnt INT(4) DEFAULT 0;
 59     SELECT COUNT(*) INTO cnt FROM t_user8 WHERE uid=u_id;
 60     
 61     IF cnt>0 THEN
 62        DELETE FROM t_user8 WHERE uid=u_id;
 63        SET msg = 删除成功!;    
 64     ELSE 
 65     SET msg = 此uid不存在,无法删除 !;
 66     END IF;
 67     
 68     SELECT msg;
 69     
 70     END$$
 71 
 72 DELIMITER ;
 73 
 74 =========================修改==========================
 75 
 76 
 77 
 78 
 79 DELIMITER $$
 80 
 81 CREATE
 82    
 83     PROCEDURE `java1302`.`update_user`(
 84     IN u_id INT(4),
 85     IN u_name VARCHAR(20),
 86     IN u_pwd VARCHAR(50),
 87     IN u_sex VARCHAR(2),
 88     IN u_addr VARCHAR(100),
 89     IN u_rid INT(4),
 90     IN u_total DECIMAL(7,2),
 91     OUT msg VARCHAR(20)        #输出 参数,返回 值; 因为是最后一个,所以 不需要逗号;     
 92     
 93     )
 94      
 95     BEGIN
 96     
 97      DECLARE cnt INT(4) DEFAULT 0;
 98     SELECT COUNT(*) INTO cnt FROM t_user8 WHERE uid=u_id;
 99     
100     IF cnt>0 THEN
101        UPDATE t_user8 SET uname=u_name,
102               upwd = u_pwd,
103               usex = u_sex,
104               uaddr = u_addr,
105               urid = u_rid,
106               total=u_total
107               WHERE uid=u_id;
108               
109        SET msg = 修改成功!;    
110     ELSE 
111     SET msg = 此uid不存在,无法修改 !;
112     END IF;
113     
114     SELECT msg;
115 
116     END$$
117 
118 DELIMITER ;
119 
120 ====================查询=====================
121 
122 DELIMITER $$
123 
124 USE `java1302`$$
125 
126 DROP PROCEDURE IF EXISTS `getAllUser`$$
127 
128 CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllUser`(   #getAllUser 自定义的名字; 
129        IN u_name VARCHAR(20)   #in:输入参数; u_name:输入参数名称; varchar(20):参数类型及长度; 
130        
131     
132     )
133 BEGIN
134         #过程体; 
135         SELECT * FROM t_user8 t WHERE t.uname LIKE CONCAT(%,u_name,%);
136     END$$
137 
138 DELIMITER ;
139 
140 
141 
142 ===============在sql客户端中调用=========================
143 
144 #调用 自定义函数; 
145 SELECT getTodayDate();
146 
147 #调用 存储过程 使用CALL关键字与函数的SELECT 不同;   1 : 输入参数; 
148 CALL getAllUser(1);
149 
150 #调用插入一条数据的存储过程; 
151 CALL insert_user(yijie2,999,m,sz,9,777,@msg);#这里的输出需要用@家输出的变量
152 
153 #调用 删除 的存储过程 ; 
154 CALL delete_user(10,@msg);
155 
156 #调用 修改的存储过程; 
157 CALL update_user(10,yijie2,888,f,sz,8,688,@msg);

 

MySQL之自定义函数与存储过程

标签:加密   数据表   lang   流程语句   div   修改   upd   字符串长度   逗号   

原文地址:https://www.cnblogs.com/in-the-game-of-thrones/p/11331198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!