Mysql数据库内置功能之函数

一 函数

MySQL中提供了许多内置函数,例如:

一、数学函数
1  ROUND(x,y)
2         返回参数x的四舍五入的有y位小数的值
3 
4     RAND()
5         返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
View Code

二、聚合函数(常用于GROUP BY从句的SELECT查询中)
1  AVG(col)返回指定列的平均值
2     COUNT(col)返回指定列中非NULL值的个数
3     MIN(col)返回指定列的最小值
4     MAX(col)返回指定列的最大值
5     SUM(col)返回指定列的所有值之和
6     GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果 

三、字符串函数
 1  CHAR_LENGTH(str)
 2         返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
 3     CONCAT(str1,str2,...)
 4         字符串拼接
 5         如有任何一个参数为NULL ,则返回值为 NULL 6     CONCAT_WS(separator,str1,str2,...)
 7         字符串拼接(自定义连接符)
 8         CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
 9 
10     CONV(N,from_base,to_base)
11         进制转换
12         例如:
13             SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
14 
15     FORMAT(X,D)
16         将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
17         例如:
18             SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
19     INSERT(str,pos,len,newstr)
20         在str的指定位置插入字符串
21             pos:要替换位置其实位置
22             len:替换的长度
23             newstr:新字符串
24         特别的:
25             如果pos超过原字符串长度,则返回原字符串
26             如果len超过原字符串长度,则由新字符串完全替换
27     INSTR(str,substr)
28         返回字符串 str 中子字符串的第一个出现位置。
29 
30     LEFT(str,len)
31         返回字符串str 从开始的len位置的子序列字符。
32 
33     LOWER(str)
34         变小写
35 
36     UPPER(str)
37         变大写
38 
39     REVERSE(str)
40         返回字符串 str ,顺序和字符顺序相反。
41 
42     SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
43         不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
44 
45         mysql> SELECT SUBSTRING('Quadratically',5);
46             -> 'ratically'
47 
48         mysql> SELECT SUBSTRING('foobarbar' FROM 4);
49             -> 'barbar'
50 
51         mysql> SELECT SUBSTRING('Quadratically',5,6);
52             -> 'ratica'
53 
54         mysql> SELECT SUBSTRING('Sakila', -3);
55             -> 'ila'
56 
57         mysql> SELECT SUBSTRING('Sakila', -5, 3);
58             -> 'aki'
59 
60         mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
61             -> 'ki'

四、日期和时间函数
 1  CURDATE()或CURRENT_DATE() 返回当前的日期
 2     CURTIME()或CURRENT_TIME() 返回当前的时间
 3     DAYOFWEEK(date)   返回date所代表的一星期中的第几天(1~7)
 4     DAYOFMONTH(date)  返回date是一个月的第几天(1~31)
 5     DAYOFYEAR(date)   返回date是一年的第几天(1~366)
 6     DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
 7     FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳ts
 8     HOUR(time)   返回time的小时值(0~23)
 9     MINUTE(time)   返回time的分钟值(0~59)
10     MONTH(date)   返回date的月份值(1~12)
11     MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
12     NOW()    返回当前的日期和时间
13     QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
14     WEEK(date)   返回日期date为一年中第几周(0~53)
15     YEAR(date)   返回日期date的年份(1000~9999)

重点: DATE_FORMAT(date,format) 根据format字符串格式化date值
 1  CURDATE()或CURRENT_DATE() 返回当前的日期
 2     CURTIME()或CURRENT_TIME() 返回当前的时间
 3     DAYOFWEEK(date)   返回date所代表的一星期中的第几天(1~7)
 4     DAYOFMONTH(date)  返回date是一个月的第几天(1~31)
 5     DAYOFYEAR(date)   返回date是一年的第几天(1~366)
 6     DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
 7     FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳ts
 8     HOUR(time)   返回time的小时值(0~23)
 9     MINUTE(time)   返回time的分钟值(0~59)
10     MONTH(date)   返回date的月份值(1~12)
11     MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
12     NOW()    返回当前的日期和时间
13     QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
14     WEEK(date)   返回日期date为一年中第几周(0~53)
15     YEAR(date)   返回日期date的年份(1000~9999)

五、加密函数
1   MD5()    
2         计算字符串str的MD5校验和
3     PASSWORD(str)   
4         返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

六、控制流函数
 1  CASE WHEN[test1] THEN [result1]...ELSE [default] END
 2         如果testN是真,则返回resultN,否则返回default
 3     CASE [test] WHEN[val1] THEN [result]...ELSE [default]END  
 4         如果test和valN相等,则返回resultN,否则返回default
 5 
 6     IF(test,t,f)   
 7         如果test是真,返回t;否则返回f
 8 
 9     IFNULL(arg1,arg2) 
10         如果arg1不是空,返回arg1,否则返回arg2
11 
12     NULLIF(arg1,arg2) 
13         如果arg1=arg2返回NULL;否则返回arg1      

七、控制流函数小练习
  1 #7.1、准备表
  2 /*
  3 Navicat MySQL Data Transfer
  4 
  5 Source Server         : localhost_3306
  6 Source Server Version : 50720
  7 Source Host           : localhost:3306
  8 Source Database       : student
  9 
 10 Target Server Type    : MYSQL
 11 Target Server Version : 50720
 12 File Encoding         : 65001
 13 
 14 Date: 2018-01-02 12:05:30
 15 */
 16 
 17 SET FOREIGN_KEY_CHECKS=0;
 18 
 19 -- ----------------------------
 20 -- Table structure for course
 21 -- ----------------------------
 22 DROP TABLE IF EXISTS `course`;
 23 CREATE TABLE `course` (
 24   `c_id` int(11) NOT NULL,
 25   `c_name` varchar(255) DEFAULT NULL,
 26   `t_id` int(11) DEFAULT NULL,
 27   PRIMARY KEY (`c_id`),
 28   KEY `t_id` (`t_id`)
 29 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 30 
 31 -- ----------------------------
 32 -- Records of course
 33 -- ----------------------------
 34 INSERT INTO `course` VALUES ('1', 'python', '1');
 35 INSERT INTO `course` VALUES ('2', 'java', '2');
 36 INSERT INTO `course` VALUES ('3', 'linux', '3');
 37 INSERT INTO `course` VALUES ('4', 'web', '2');
 38 
 39 -- ----------------------------
 40 -- Table structure for score
 41 -- ----------------------------
 42 DROP TABLE IF EXISTS `score`;
 43 CREATE TABLE `score` (
 44   `id` int(11) NOT NULL AUTO_INCREMENT,
 45   `s_id` int(10) DEFAULT NULL,
 46   `c_id` int(11) DEFAULT NULL,
 47   `num` double DEFAULT NULL,
 48   PRIMARY KEY (`id`)
 49 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
 50 
 51 -- ----------------------------
 52 -- Records of score
 53 -- ----------------------------
 54 INSERT INTO `score` VALUES ('1', '1', '1', '79');
 55 INSERT INTO `score` VALUES ('2', '1', '2', '78');
 56 INSERT INTO `score` VALUES ('3', '1', '3', '35');
 57 INSERT INTO `score` VALUES ('4', '2', '2', '32');
 58 INSERT INTO `score` VALUES ('5', '3', '1', '66');
 59 INSERT INTO `score` VALUES ('6', '4', '2', '77');
 60 INSERT INTO `score` VALUES ('7', '4', '1', '68');
 61 INSERT INTO `score` VALUES ('8', '5', '1', '66');
 62 INSERT INTO `score` VALUES ('9', '2', '1', '69');
 63 INSERT INTO `score` VALUES ('10', '4', '4', '75');
 64 INSERT INTO `score` VALUES ('11', '5', '4', '66.7');
 65 
 66 -- ----------------------------
 67 -- Table structure for student
 68 -- ----------------------------
 69 DROP TABLE IF EXISTS `student`;
 70 CREATE TABLE `student` (
 71   `s_id` varchar(20) NOT NULL,
 72   `s_name` varchar(255) DEFAULT NULL,
 73   `s_age` int(10) DEFAULT NULL,
 74   `s_sex` char(1) DEFAULT NULL,
 75   PRIMARY KEY (`s_id`)
 76 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 77 
 78 -- ----------------------------
 79 -- Records of student
 80 -- ----------------------------
 81 INSERT INTO `student` VALUES ('1', '鲁班', '12', '');
 82 INSERT INTO `student` VALUES ('2', '貂蝉', '20', '');
 83 INSERT INTO `student` VALUES ('3', '刘备', '35', '');
 84 INSERT INTO `student` VALUES ('4', '关羽', '34', '');
 85 INSERT INTO `student` VALUES ('5', '张飞', '33', '');
 86 
 87 -- ----------------------------
 88 -- Table structure for teacher
 89 -- ----------------------------
 90 DROP TABLE IF EXISTS `teacher`;
 91 CREATE TABLE `teacher` (
 92   `t_id` int(10) NOT NULL,
 93   `t_name` varchar(50) DEFAULT NULL,
 94   PRIMARY KEY (`t_id`)
 95 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 96 
 97 -- ----------------------------
 98 -- Records of teacher
 99 -- ----------------------------
100 INSERT INTO `teacher` VALUES ('1', '大王');
101 INSERT INTO `teacher` VALUES ('2', 'alex');
102 INSERT INTO `teacher` VALUES ('3', 'egon');
103 INSERT INTO `teacher` VALUES ('4', 'peiqi');
104 
105 #7.2、统计各科各分数段人数.显示格式:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
106 
107 select  score.c_id,
108           course.c_name, 
109       sum(CASE WHEN num BETWEEN 85 and 100 THEN 1 ELSE 0 END) as '[100-85]',
110       sum(CASE WHEN num BETWEEN 70 and 85 THEN 1 ELSE 0 END) as '[85-70]',
111       sum(CASE WHEN num BETWEEN 60 and 70 THEN 1 ELSE 0 END) as '[70-60]',
112       sum(CASE WHEN num < 60 THEN 1 ELSE 0 END) as '[ <60]'
113 from score,course where score.c_id=course.c_id GROUP BY score.c_id;


DATE_FORMAT(date,format)小练习
 1 #1 基本使用
 2 mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
 3         -> 'Sunday October 2009'
 4 mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
 5         -> '22:23:00'
 6 mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
 7     ->                 '%D %y %a %d %m %b %j');
 8         -> '4th 00 Thu 04 10 Oct 277'
 9 mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
10     ->                 '%H %k %I %r %T %S %w');
11         -> '22 22 10 10:23:00 PM 22:23:00 00 6'
12 mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
13         -> '1998 52'
14 mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
15         -> '00'
16 
17 
18 #2 准备表和记录
19 CREATE TABLE blog (
20     id INT PRIMARY KEY auto_increment,
21     NAME CHAR (32),
22     sub_time datetime
23 );
24 
25 INSERT INTO blog (NAME, sub_time)
26 VALUES
27     ('第1篇','2015-03-01 11:31:21'),
28     ('第2篇','2015-03-11 16:31:21'),
29     ('第3篇','2016-07-01 10:21:31'),
30     ('第4篇','2016-07-22 09:23:21'),
31     ('第5篇','2016-07-23 10:11:11'),
32     ('第6篇','2016-07-25 11:21:31'),
33     ('第7篇','2017-03-01 15:33:21'),
34     ('第8篇','2017-03-01 17:32:21'),
35     ('第9篇','2017-03-01 18:31:21');
36 
37 #3. 提取sub_time字段的值,按照格式后的结果即"年月"来分组
38 SELECT DATE_FORMAT(sub_time,'%Y-%m'),COUNT(1) FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m');
39 
40 #结果
41 +-------------------------------+----------+
42 | DATE_FORMAT(sub_time,'%Y-%m') | COUNT(1) |
43 +-------------------------------+----------+
44 | 2015-03                       |        2 |
45 | 2016-07                       |        4 |
46 | 2017-03                       |        3 |
47 +-------------------------------+----------+
48 rows in set (0.00 sec)
49 
50 需要掌握函数:date_format
View Code

更多函数:中文猛击这里 OR 官方猛击这里

一 自定义函数

#!!!注意!!!
1 #函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
2 #若要想在begin...end...中写sql,请用存储过程
 1 delimiter //
 2 create function f1(
 3     i1 int,
 4     i2 int)
 5 returns int
 6 BEGIN
 7     declare num int;
 8     set num = i1 + i2;
 9     return(num);
10 END //
11 delimiter ;
12 delimiter //
13 create function f5(
14     i int
15 )
16 returns int
17 begin
18     declare res int default 0;
19     if i = 10 then
20         set res=100;
21     elseif i = 20 then
22         set res=200;
23     elseif i = 30 then
24         set res=300;
25     else
26         set res=400;
27     end if;
28     return res;
29 end //
30 delimiter ;

二 删除函数

1 drop function func_name;

三 执行函数

1 # 获取返回值
2 select UPPER('egon') into @res;
3 SELECT @res;
4 
5 
6 # 在查询中使用
7 select f1(11,nid) ,name from tb2;
 

猜你喜欢

转载自www.cnblogs.com/anche/p/9027003.html
今日推荐