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);