42、mysql数据库(函数)


1、mysql中提供的内置函数:

(1)数学函数:

1)ROUND(x,y):

返回参数x的四舍五入的有y位小数的值。x不可转换时返回0,x为null时返回null。

2)RAND():

返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。


(2)聚合函数(常用于GROUP BY从句的SELECT查询中):

1)AVG(col):返回指定列的平均值,不包括null,全为null时返回结果为null。

2)COUNT(col):返回指定列中非NULL值的个数,全为null时返回结果为0。

3)count(*):返回表中所有行的个数,包括null。

4)MIN(col):返回指定列的最小值,不包括null,全为null时返回结果为null。

5)MAX(col):返回指定列的最大值,不包括null,全为null时返回结果为null。

6)SUM(col):返回指定列的所有值之和,不包括null,全为null时返回结果为null。

7)GROUP_CONCAT(col):返回由属于一组的列值连接组合而成的结果,不包括null,全为null时返回结果为null。

8)提示:在排序中null是最小的,null和任何值比较都没有结果,null和任何值相加都得null。


(3)字符串函数:

1)CHAR_LENGTH(str):

返回字符串str的字符长度,一个多字节字符算作一个单字符。str为null时,返回值为NULL。

2)CONCAT(str1,str2,...):

字符串横向拼接,如有任何一个参数为NULL,则返回值为NULL。

3)CONCAT_WS(<separator>,str1,str2,...):

字符串横向拼接,可以自定义连接符,如有任何一个参数为NULL,会变为空字符串再拼接。

4)CONV(N,from_base,to_base):

进制转换函数,N不可转换时返回0,N为null时返回null。

例如:SELECT CONV('a',16,2) from dual;

#表示将 a 由16进制转换为2进制字符串表示。

5)FORMAT(X,D):

将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位,并将结果以字符串的形式返回。

X为null时返回null,X不可转换时用0表示。若 D 为 0 则返回结果不带有小数点,或不含小数部分。

例如:SELECT FORMAT(12332.1,4);

6)INSERT(str,pos,len,newstr):

在str的指定位置插入字符串。pos:要替换位置起始位置,下标从1开始。len:替换的长度,是闭区间。newstr:新字符串。

str为null时返回null。

注意:如果pos超过原字符串长度,则返回原字符串。如果pos没有超过原字符串长度,而len超过剩余字符串长度,剩余字符

串则由新字符串完全替换。

7)INSTR(str,substr):

返回字符串 str 中子字符串的第一个出现位置。

str为null时返回null,在str中找不到子字符串时返回0。

8)LEFT(str,len):

返回字符串str 从开始的len位置的子序列字符。

str为null时返回null。

注意:如果len的长度超过str的长度,则返回原字符串。如果len的长度没有超过str的长度,则返回从开始的len位置的子序列

字符。

9)LOWER(str):

字符串变小写。

str为null时返回null,且只对英文字符生效。

10)UPPER(str):

字符串变大写。

str为null时返回null,且只对英文字符生效。

11)REVERSE(str):

返回字符串 str ,顺序和字符顺序相反。

str为null时返回null。

12)SUBSTRING(str,pos)、SUBSTRING(str FROM pos),SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len):

不带有len参数的格式从字符串str返回一个子字符串,起始于位置 pos。

带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。

使用 FROM的格式为标准 SQL语法。

str为null时返回null,pos从1开始,len是长度,pos和len是闭区间。

注意:如果pos超过原字符串长度,则返回空字符串。如果pos没有超过原字符串长度,而len超过剩余字符串长度,则返回剩余

字符串。

也可能对pos使用一个负值,假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置,在以下格

式的函数中可以对pos 使用一个负值。

例子:

mysql> SELECT SUBSTRING('Quadratically',5);

-> 'ratically'

mysql> SELECT SUBSTRING('foobarbar' FROM 4);

-> 'barbar'

mysql> SELECT SUBSTRING('Quadratically',5,6);

-> 'ratica'

mysql> SELECT SUBSTRING('Sakila', -3);

-> 'ila'

mysql> SELECT SUBSTRING('Sakila', -5, 3);

-> 'aki'

mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);

-> 'ki'

13)replace(str,oldstr,newstr):

字符串替换函数。

str为null时返回null,替换不了的返回原字符串。


(4)日期和时间函数:

1)说明:函数中指代的参数代指如下:

date=>curdate()、now()、'2019/12/8',不符合条件的返回null。

time=>curtime()、now()、'15:10:14',不符合条件的返回0。

2)CURDATE()或CURRENT_DATE():返回当前的日期。

3)CURTIME()或CURRENT_TIME():返回当前的时间。

4)NOW():返回当前的日期和时间。

5)DAYOFWEEK(date):返回date所代表的一星期中的第几天(1~7,代表周日到周六)。

6)DAYOFMONTH(date):返回date是一个月的第几天(1~31)。

7)DAYOFYEAR(date):返回date是一年的第几天(1~366)。

8)DAYNAME(date):返回date的星期名。

9)DATE_FORMAT(date,format):根据format字符串格式化date值(重点)。

--参数:

--示例1:

SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');

#'Sunday October 2009'

SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');

#'22:23:00'

SELECT DATE_FORMAT('1900-10-04 22:23:00', '%D %y %a %d %m %b %j');

#'4th 00 Thu 04 10 Oct 277'

SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');

#'22 22 10 10:23:00 PM 22:23:00 00 6'

SELECT DATE_FORMAT('1999-01-01', '%X %V');

#'1998 52'

SELECT DATE_FORMAT('2006-06-00', '%d');

#'00'

--示例二:

--准备表:

CREATE TABLE blog1 (

id INT PRIMARY KEY auto_increment,

NAME CHAR (32) not null unique,

sub_time datetime

);

--准备数据:

insert into blog1 (name, sub_time)

values

('第1篇','2015-03-01 11:31:21'),

('第2篇','2015-03-11 16:31:21'),

('第3篇','2016-07-01 10:21:31'),

('第4篇','2016-07-22 09:23:21'),

('第5篇','2016-07-23 10:11:11'),

('第6篇','2016-07-25 11:21:31'),

('第7篇','2017-03-01 15:33:21'),

('第8篇','2017-03-01 17:32:21'),

('第9篇','2017-03-01 18:31:21');

--提取sub_time字段的值,按照格式后的结果即"年月"来分组:

SELECT DATE_FORMAT(sub_time,'%Y-%m') as ym,COUNT(1) FROM blog1 GROUP BY ym;

10)HOUR(time):返回time的小时值(0~23)。

11)MINUTE(time):返回time的分钟值(0~59)。

12)MONTH(date):返回date的月份值(1~12)。

13)MONTHNAME(date):返回date的月份名。

14)QUARTER(date):返回date在一年中的季度(1~4)。

15)WEEK(date):返回日期date为一年中第几周(0~53)。

16)YEAR(date):返回日期date的年份(1000~9999)。


(5)加密函数:

1)MD5(str):

计算字符串str的MD5校验和。

str为null时返回null。

2)PASSWORD(str):

返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

str为null时返回空字符串。


(6)控制流函数:

1)语法:

A、IF(test,t,f):

如果test是真,返回t,否则返回f。

B、IFNULL(arg1,arg2):

如果arg1是空,返回arg2,否则返回arg1。

B、NULLIF(arg1,arg2):

如果arg1=arg2返回NULL,否则返回arg1。

C、CASE WHEN test THEN result1 ELSE result2 END

如果test是真,则返回result1,否则返回result2。

D、CASE test WHEN value THEN result1 ELSE result2 END

如果test和value相等,则返回result1,否则返回result2。

2)示例:

--准备表:

------------------------------

--Table structure for teacher

------------------------------

DROP TABLE IF EXISTS teacher;

CREATE TABLE teacher (

id int PRIMARY KEY AUTO_INCREMENT comment '自增id号',

t_name varchar(50) not null comment '老师姓名',

t_id varchar(50) not null unique comment '老师编号'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

------------------------------

--Records of teacher

------------------------------

INSERT INTO teacher(t_name,t_id) VALUES

('大王','1'),

('alex','2'),

('egon','3'),

('peiqi','4');


------------------------------

--Table structure for course

------------------------------

DROP TABLE IF EXISTS course;

CREATE TABLE course (

id int PRIMARY KEY AUTO_INCREMENT comment '自增id号',

c_name varchar(50) not null comment '课程名称',

c_id varchar(50) not null unique comment '课程编号',

t_id varchar(50) comment 'teacher表t_id的外键',

FOREIGN KEY(t_id) REFERENCES teacher(t_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

------------------------------

-- Records of course

------------------------------

INSERT INTO course(c_name,c_id,t_id) VALUES

('python','1','1'),

('java', '2','2'),

('linux', '3','3'),

('web', '4','2');


------------------------------

--Table structure for student

------------------------------

DROP TABLE IF EXISTS student;

CREATE TABLE student (

id int PRIMARY KEY AUTO_INCREMENT comment '自增id号',

s_name varchar(50) not null comment '学生姓名',

s_id varchar(50) not null unique comment '学生学号',

s_age int comment '学生年龄',

s_sex char(1) comment '学生性别'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-------------------------------

--Records of student

------------------------------

INSERT INTO student(s_name,s_id,s_age,s_sex) VALUES

('鲁班', '1',12, '男'),

('貂蝉', '2',20, '女'),

('刘备', '3',35, '男'),

('关羽', '4',34, '男'),

('张飞', '5',33, '女');


------------------------------

--Table structure for score

------------------------------

DROP TABLE IF EXISTS score;

CREATE TABLE score (

id int PRIMARY KEY AUTO_INCREMENT comment '自增id号',

s_id varchar(50) comment 'student表s_id的外键',

c_id varchar(50) comment 'course表c_id的外键',

num double comment '学生分数',

FOREIGN KEY(s_id) REFERENCES student(s_id),

FOREIGN KEY(c_id) REFERENCES course(c_id)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of score

-- ----------------------------

INSERT INTO score(s_id,c_id,num) VALUES

('1', '1', '79'),

('1', '2', '78'),

('1', '3', '35'),

('2', '2', '32'),

('3', '1', '66'),

('4', '2', '77'),

('4', '1', '68'),

('5', '1', '66'),

('2', '1', '69'),

('4', '4', '75'),

('5', '4', '66.7');


--统计各科各分数段人数,显示格式:课程ID、课程名称、[100-85]、[85-70]、[70-60]、[ <60]:

select c.c_id,c.c_name,

sum(CASE WHEN s.num BETWEEN 85 and 100 THEN 1 ELSE 0 END) as '[100-85]',

sum(CASE WHEN s.num BETWEEN 70 and 85 THEN 1 ELSE 0 END) as '[85-70]',

sum(CASE WHEN s.num BETWEEN 60 and 70 THEN 1 ELSE 0 END) as '[70-60]',

sum(CASE WHEN s.num < 60 THEN 1 ELSE 0 END) as '[ <60]'

from score as s,course as c where c.c_id=s.c_id GROUP BY c.c_id;


2、自定义函数:

(1)说明:

1)函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能。

2)若要想在begin...end...中写sql,请用存储过程。


(2)创建函数:

delimiter //

create function f5(

i int

/*定义输入值的类型*/

)

returns int

/*定义返回值的类型*/

begin

declare res int default 0;

/*在函数体中定义变量类型及默认值*/

if i = 10 then

set res=100;

elseif i = 20 then

set res=200;

elseif i = 30 then

set res=300;

else

set res=400;

end if;

return res;

end //

delimiter ;


(3)执行函数:


(4)删除函数:

1)语法:drop function <func_name>;

2)示例:drop function f5;













猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12320644.html