1,MySQL常用函数

一,MySQL聚合函数

1AVG()函数

AVG()函数是一个聚合函数,它用于计算一组值或表达式的平均值。

AVG()函数的语法如下:

AVG(DISTINCT expression)

例如有如下products表:

CREATE TABLE products(

  productCode INT AUTO_INCREMENT PRIMARY KEY,

  productName VARCHAR(50),

  productPrice DECIMAL(10,2)

);

如下数据:

要计算products表中所有产品的平均价格,并且保留2位小数,SQL如下:

SELECT ROUND(AVG(productPrice),2) '平均价格' FROM products;

执行上面查询语句,得到以下结果:

当数据中具有NULL的情况,AVG()函数忽略计算表中的NULL值。例如下数据:

同样要计算products表中所有产品的平均价格,并且保留2位小数,SQL如下:

SELECT ROUND(AVG(productPrice),2) '平均价格' FROM products;

执行上面查询语句,得到结果:

得到的结果与预期的结果不符合,我们可以使用IFNULL函数来替换NULL,SQL如下:

SELECT ROUND(AVG(IFNULL(productPrice,0)),2) '平均价格' FROM products;

执行上面查询语句,得到结果:

2COUNT()函数

COUNT()函数返回表中的行数。 COUNT()函数允许您对表中符合特定条件的所有行进行计数。

COUNT()函数的语法如下 :

COUNT(expression)

COUNT()函数的返回类型为BIGINT。 如果没有找到匹配的行,则COUNT()函数返回0。COUNT函数有几种形式:

COUNT(*)

COUNT(expression)

COUNT(DISTINCT expression)

例如products表中有如下数据:

COUNT(*):

COUNT(*)函数返回由SELECT语句返回的结果集中的行数。COUNT(*)函数计算包含NULL和非NULL值的行,即所有行。例如:

SELECT COUNT(*) FROM products;

COUNT(expression):

COUNT(expression)返回不包含NULL值的行数。例如:

SELECT COUNT(productPrice) FROM products;

COUNT(DISTINCT expression):

COUNT(DISTINCT expression)返回不包含NULL值的唯一行数。例如:

SELECT COUNT(DISTINCT productPrice) FROM products;

3INSTR()函数

INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串,则INSTR()函数返回零(0)。

INSTR()函数的语法:

INSTR(str,substr);

INSTR()函数接受两个参数:

str是要搜索的字符串。

substr是要搜索的子字符串。

INSTR()函数不区分大小写。这意味着如果通过小写,大写,标题大小写等,结果总是一样的。例如:

SELECT INSTR('MySQL INSTR', 'SQL'),INSTR('MySQL INSTR', 'sql');

要强制INSTR()函数根据以区分大小写的方式进行搜索,请使用BINARY运算符,如下:

SELECT INSTR('MySQL INSTR', BINARY 'sql');

4SUM()函数

SUM()函数用于计算一组值或表达式的总和,SUM()函数的语法如下:

SUM(DISTINCT expression)

如果在没有返回匹配行SELECT语句中使用SUM函数,则SUM函数返回NULL,而不是0。

DISTINCT运算符允许计算集合中的不同值。

SUM函数忽略计算中的NULL值。

例如products表中有如下数据:

SELECT SUM(productPrice) FROM products;

SELECT SUM(DISTINCT productPrice) FROM products;

5 MIN函数/MAX()函数

MIN()函数返回一组值中的最小值。MIN()函数的语法:

MIN(expression);

MAX()函数返回一组值中的最大值。MAX()函数的语法如下:

MAX(expression);

例如products表中有如下数据:

找出商品价格最小的:

SELECT MIN(productPrice) FROM products;

找出商品价格最大的:

SELECT MAX(productPrice) FROM products;

6GROUP_CONCAT函数

GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串。

GROUP_CONCAT()函数的语法:

GROUP_CONCAT(DISTINCT expression

ORDER BY expression

SEPARATOR sep);

例如products表中有如下数据:

以特定的格式输出商品价格:

SELECT GROUP_CONCAT(DISTINCT productPrice

ORDER BY productPrice DESC

SEPARATOR ';') FROM products;

1,DISTINCT子句用于在连接分组之前消除组中的重复值。

2,ORDER BY子句允许您在连接之前按升序或降序排序值。

3,SEPARATOR指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT函数使用逗号(,)作为默认分隔符。

4,GROUP_CONCAT函数忽略NULL值,如果找不到匹配的行,或者所有参数都为NULL值,则返回NULL。

5,GROUP_CONCAT函数返回二进制或非二进制字符串,这取决于参数。 默认情况下,返回字符串的最大长度为1024。如果您需要更多的长度,可以通过在SESSION或GLOBAL级别设置group_concat_max_len系统变量来扩展最大长度。

二,MySQL字符串函数

1,CONCAT函数

CONCAT()函数需要一个或多个字符串参数,并将它们连接成一个字符串。CONCAT()函数需要至少一个参数,否则会引起错误。

CONCAT()函数的语法:

CONCAT(string1,string2, ... );

例如:

SELECT CONCAT('MySQL','Zender');

2,CONCAT_WS函数

CONCAT_WS()函数将两个或多个字符串值与预定义的分隔符相连接。

CONCAT_WS()函数的语法:

CONCAT_WS(seperator,string1,string2, ... );

例如:

SELECT CONCAT_WS(',','A','B','C','D');

注意:

1,当且仅当作为分隔符的第一个参数为NULL时,CONCAT_WS函数才返回NULL。

2,CONCAT_WS函数在分隔符参数之后跳过NULL值。 换句话说,它忽略NULL值。

3LEFTRIGHT函数

LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。

LEFT()函数和RIGHT()的语法 :

LEFT(str,length);

RIGHT(str,length);

LEFT()函数接受两个参数:

str是要提取子字符串的字符串。

length是一个正整数,指定将从左边返回的字符数。

LEFT()函数返回str字符串中最左边的长度字符。RIGHT()函数返回str字符串中最左边边的长度字符。如果str或length参数为NULL,则返回NULL值。

例如:

SELECT LEFT('MySQL LEFT', 5), RIGHT('MySQL LEFT', 5);

4LENGTHCHAR_LENGTH函数

首先需要了解MySQL支持各种字符集,可以使用SHOW CHARACTER SET语句来获取MySQL数据库服务器支持的所有字符集。

Maxlen列存储字符集的字节数。在MySQL中,一个字符串可以是任何字符集。 如果一个字符串包含1个字节的字符,则其字符长度和以字节为单位测量的长度相等。 但是,如果字符串包含多字节字符,则其字节长度通常大于字符长度。

1,获取以字节为单位的字符串长度,使用LENGTH函数,如下所示:

LENGTH(str);

2,获取以字符为单位的字符串长度,使用CHAR_LENGTH函数,如下所示:

CHAR_LENGTH(str);

例如:

SET @s = CONVERT('1234567abc' USING ucs2);

SELECT CHAR_LENGTH(@s), LENGTH(@s);

首先,将MySQL字符串长度字符串转换为ucs2字符集,指定一个字符存储为2个字节。

然后,分别使用CHAR_LENGTH和LENGTH函数来获取@s字符串的长度(以字节为单位)。因为@s字符串以2个字节来存储每个字符,所以其字符长度为10,而字节长度为20 。

再次将MySQL字符串长度字符串转换为dec8字符集,dec8字符集是使用1个字节来存储每个字符的。因此,其字节长度和字符长度相等。结果如下:

SET @s = CONVERT('1234567abc' USING dec8);

SELECT CHAR_LENGTH(@s), LENGTH(@s);

使用CHAR_LENGTH函数来检查是否有超过35个字符,如果超过了,则附加省略号(...),有如下数据:

SELECT txt,

IF(CHAR_LENGTH(txt) > 35, CONCAT(LEFT(txt,35), '...'),txt) txt2

FROM testtables;

5REPLACE字符串函数

函数REPLACE(),可以用新的字符串替换表的列中的字符串。

REPLACE()函数的语法如下:

REPLACE(str,old_string,new_string);

REPLACE()函数有三个参数,它将string中的old_string替换为new_string字符串。

例如:

SELECT REPLACE('MySQL LEFT','LEFT','RIGHT');

6SUBSTRING函数

SUBSTRING函数从特定位置开始的字符串返回一个给定长度的子字符串。

SUBSTRING函数语法如下:

SUBSTRING(string,position);

SUBSTRING(string FROM position);

有两个参数:

string参数是要提取子字符串的字符串。

position参数是一个整数,用于指定子串的起始字符,position可以是正或负整数。

例如:

SELECT SUBSTRING('MYSQL SUBSTRING', 7),SUBSTRING('MySQL SUBSTRING' FROM -10);

要从字符串中提取的子字符串的长度,可以使用以下形式的SUBSTRING函数:

SUBSTRING(string,position,length);

SUBSTRING(string FROM position FOR length);

例如:

SELECT SUBSTRING('MySQL SUBSTRING',1,5), SUBSTRING('MySQL SUBSTRING' FROM 1 FOR 5);

7TRIM函数

TRIM()函数从字符串中删除不必要的前导和后缀字符。

TRIM()函数的语法如下:

TRIM([{BOTH|LEADING|TRAILING} [removed_str]] FROM str);

可以使用LEADING(前导),TRAILING(尾随)或BOTH(前导和尾随)选项明确指示TRIM()函数从字符串中删除不必要的字符。如果没有指定任何内容,TRIM()函数默认使用BOTH选项。

[removed_str]是要删除的字符串。默认情况下,它是一个空格。这意味着如果不指定特定的字符串,则TRIM()函数仅删除空格。

str是要删除子字符removed_str的字符串。

例如:

从字符串中除去前导和尾随空格:

SELECT TRIM(' MySQL 123 ');

仅删除前导空格 :

SELECT TRIM(LEADING FROM ' MySQL 123 ');

仅删除尾随空格:

SELECT TRIM(TRAILING FROM ' MySQL 123 ');

8FORMAT函数

FORMAT函数格式化各种语言环境中的十进制数。

FORMAT函数语法如下:

FOMRAT(N,D,locale);

FORMAT函数接受三个参数:

N是要格式化的数字。

D是要舍入的小数位数。

locale是一个可选参数,用于确定千个分隔符和分隔符之间的分组。如果省略locale操作符,MySQL将默认使用en_US。

例如:

SELECT FORMAT(14500.2018, 2), FORMAT(12500.2015, 2,'de_DE');

de_DE语言环境使用点(.)来分隔千位和逗号(,)来分隔小数点。

三,MySQL日期和时间函数

1YEAR/MONTH/DAY函数

YEAR/MONTH/DAY函数的语法如下:

YEAR(date)

MONTH(date)

DAY(date)

例如:

SELECT YEAR('2017-03-23'),MONTH('2017-03-23'),DAY('2017-03-23');

2NOW()函数

NOW()函数以"YYYY-MM-DD HH:MM:DD"格式的字符串或数字返回配置的时区中的当前日期和时间。例如:

SELECT NOW();

3CURDATE函数

CURDATE()函数将以"YYYY-MM-DD"格式的值返回当前日期。例如:

SELECT CURDATE();

CURDATE()函数的结果等同于以下表达式:

SELECT DATE(NOW());

CURDATE()函数只返回当前日期,NOW()函数返回当前时间的日期和时间部分。

4 DATEDIFF函数

DATEDIFF函数计算两个DATE,DATETIME或TIMESTAMP值之间的天数。

DATEDIFF函数的语法如下:

DATEDIFF(date_expression_1,date_expression_2);

DATEDIFF函数接受两个任何有效日期或日期时间值的参数。如果传递DATETIME或TIMESTAMP值,则DATEDIFF函数仅将日期部分用于计算,并忽略时间部分。例如:

SELECT DATEDIFF('2017-03-17','2017-02-17');

5DATE_ADD函数

DATE_ADD函数将间隔时间添加到DATE或DATETIME值。

DATE_ADD函数的语法如下:

DATE_ADD(start_date, INTERVAL expr unit);

DATE_ADD函数有两个参数:

start_date是DATE或DATETIME的起始值。

INTERVAL expr unit是要添加到起始日期值的间隔值。

例如:

1,加1秒到时间:2017-12-31 23:59:59

SELECT DATE_ADD('2017-12-31 23:59:59', INTERVAL 1 SECOND);

2,添加1天到时间:2017-12-31 00:00:00

SELECT DATE_ADD('2017-12-31 00:00:00',INTERVAL 1 DAY);

3,在时间2017-12-31 00:00:00上加1分1秒。

SELECT DATE_ADD('2017-12-31 00:00:00', INTERVAL '1:1' MINUTE_SECOND);

4,在时间2017-12-31 00:00:00上加-1天10小时。

SELECT DATE_ADD('2017-12-31 00:00:00', INTERVAL '-1 10' DAY_HOUR);

6DATE_SUB函数

DATE_SUB()函数从DATE或DATETIME值中减去时间值(或间隔)

ATE_SUB()函数的语法如下:

DATE_SUB(start_date,INTERVAL expr unit);

DATE_SUB()函数接受两个参数:

start_date是DATE或DATETIME的起始值。

expr是一个字符串,用于确定从起始日期减去的间隔值。unit是expr可解析的间隔单位,例如DAY,HOUR等。

例如:

求昨天的日期值。

SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);

7DATE_FORMAT函数

日期值格式化为特定格式。

DATE_FORMAT函数的语法如下:

DATE_FORMAT(date,format);

DATE_FORMAT()函数接受两个参数:

date:是要格式化的有效日期值

format:是由预定义的说明符组成的格式字符串,每个说明符前面都有一个百分比字符(%)。有关预定义说明符的列表,请参见下表。

限定符

含义

%a

三个字符缩写的工作日名称,例如:MonTueWed,等

%b

三个字符缩写的月份名称,例如:JanFebMar

%c

以数字表示的月份值,例如:1, 2, 3…12

%D

英文后缀如:0th1st2nd等的一个月之中的第几天

%d

如果是1个数字(小于10),那么一个月之中的第几天表示为加前导加0, 如:00, 01,02, …31

%e

没有前导零的月份的日子,例如:1,2,… 31

%f

微秒,范围在000000..999999

%H

24小时格式的小时,前导加0,例如:00,01..23

%h

小时,12小时格式,带前导零,例如:01,02 … 12

%I

%h相同

%i

分数为零,例如:00,01,… 59

%j

一年中的的第几天,前导为0,例如,001,002,… 366

%k

24小时格式的小时,无前导零,例如:0,1,2 … 23

%l

12小时格式的小时,无前导零,例如:0,1,2 … 12

%M

月份全名称,例如:January, February,…December

%m

具有前导零的月份名称,例如:00,01,02,… 12

%p

AMPM,取决于其他时间说明符

%r

表示时间,12小时格式hh:mm:ss AMPM

%S

表示秒,前导零,如:00,01,… 59

%s

%S相同

%T

表示时间,24小时格式hh:mm:ss

%U

周的第一天是星期日,例如:00,01,02 … 53时,前导零的周数

%u

周的第一天是星期一,例如:00,01,02 … 53时,前导零的周数

%V

%U相同,它与%X一起使用

%v

%u相同,它与%x一起使用

%W

工作日的全称,例如:Sunday, Monday,…, Saturday

%w

工作日,以数字来表示(0 = 星期日,1 = 星期一等)

%X

周的四位数表示年份,第一天是星期日; 经常与%V一起使用

%x

周的四位数表示年份,第一天是星期日; 经常与%v一起使用

%Y

表示年份,四位数,例如2000,2001,…等。

%y

表示年份,两位数,例如00,01,…等。

%%

将百分比(%)字符添加到输出

常用的日期格式字符串:

DATE_FORMAT字符串

格式化日期

%Y-%m-%d

2017/4/30

%e/%c/%Y

4/7/2013

%c/%e/%Y

7/4/2013

%d/%m/%Y

4/7/2013

%m/%d/%Y

7/4/2013

%e/%c/%Y %H:%i

4/7/2013 11:20

%c/%e/%Y %H:%i

7/4/2013 11:20

%d/%m/%Y %H:%i

4/7/2013 11:20

%m/%d/%Y %H:%i

7/4/2013 11:20

%e/%c/%Y %T

4/7/2013 11:20

%c/%e/%Y %T

7/4/2013 11:20

%d/%m/%Y %T

4/7/2013 11:20

%m/%d/%Y %T

7/4/2013 11:20

%a %D %b %Y

Thu 4th Jul 2013

%a %D %b %Y %H:%i

Thu 4th Jul 2013 11:20

%a %D %b %Y %T

Thu 4th Jul 2013 11:20:05

%a %b %e %Y

Thu Jul 4 2013

%a %b %e %Y %H:%i

Thu Jul 4 2013 11:20

%a %b %e %Y %T

Thu Jul 4 2013 11:20:05

%W %D %M %Y

Thursday 4th July 2013

%W %D %M %Y %H:%i

Thursday 4th July 2013 11:20

%W %D %M %Y %T

Thursday 4th July 2013 11:20:05

%l:%i %p %b %e, %Y

7/4/2013 11:20

%M %e, %Y

4-Jul-13

%a, %d %b %Y %T

Thu, 04 Jul 2013 11:20:05

例如:

SELECT DATE_FORMAT(CURDATE(),'%c/%e/%Y %H:%i');

8DAYNAME函数

DAYNAME函数返回指定日期的工作日的名称。

DAYNAME函数的语法如下:

DAYNAME(date);

如果日期为NULL或无效,例如2017-02-30,DAYNAME函数将返回NULL。例如:

SELECT DAYNAME('2017-01-01');

9DAYOFWEEK/WEEKDAY函数

DAYOFWEEK/WEEKDAY函数返回日期的工作日索引值,即星期日为1,星期一为2,星期六为7。

DAYOFWEEK/WEEKDAY函数的语法如下:

DAYOFWEEK(date)

WEEKDAY(date)

DAYOFWEEK函数接受1个参数,即DATE或DATETIME值。 它返回一个整数,范围从1到7,表示星期日到星期六。如果日期为NULL,零(0000-00-00)或无效,则DAYOFWEEK函数返回NULL。例如:

SELECT DAYOFWEEK('2017-03-23');

10EXTRACT函数

EXTRACT()函数提取日期的一部分。

EXTRACT()函数的语法如下:

EXTRACT(unit FROM date)

EXTRACT()函数需要两个参数:unit和date。

1,unit是要从日期中提取的间隔。 以下是unit参数的有效间隔。

DAY

DAY_HOUR

DAY_MICROSECOND

DAY_MINUTE

DAY_SECOND

HOUR

HOUR_MICROSECOND

HOUR_MINUTE

HOUR_SECOND

MICROSECOND

MINUTE

MINUTE_MICROSECOND

MINUTE_SECOND

MONTH

QUARTER

SECOND

SECOND_MICROSECOND

WEEK

YEAR

YEAR_MONTH

2,date是DATE或DATETIME值,从中提取间隔的日期。

例如:

SELECT EXTRACT(DAY FROM '2017-03-23 19:14:43');

11SYSDATE函数

返回当前日期时间,格式为"YYYY-MM-DD HH:MM:SS"的值

SYSDATE()函数的语法如下:

SYSDATE(fsp);

例如:

SELECT SYSDATE(),SYSDATE(3);

如果传递fsp参数,则结果将包括小数秒精度。

12WEEK函数

WEEK函数来获取日期的周数

WEEK()函数的语法如下:

WEEK(date, mode);

WEEK函数接受两个参数:

1,date是要获取周数的日期。

2,mode是一个可选参数,用于确定周数计算的逻辑。它允许指定本周是从星期一还是星期日开始,返回的周数应在0到52之间或0到53之间。

如果忽略mode参数,默认情况下WEEK函数将使用default_week_format系统变量的值。要获取default_week_format变量的当前值,请使用SHOW VARIABLES语句如下:

SHOW VARIABLES LIKE 'default_week_format';

default_week_format的默认值为0,下表格说明了mode参数如何影响WEEK函数:

模式

一周的第一天

范围

0

星期日

0-53

1

星期一

0-53

2

星期日

1-53

3

星期一

1-53

4

星期日

0-53

5

星期一

0-53

6

星期日

1-53

7

星期一

1-53

例如:

SELECT WEEK('2017-03-23 19:14:43');

posted @ 2017-12-04 15:54  Zender  阅读(835)  评论(0编辑  收藏  举报