一,MySQL聚合函数
1,AVG()函数
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; |
执行上面查询语句,得到结果:
2,COUNT()函数
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; |
3,INSTR()函数
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'); |
4,SUM()函数
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; |
6,GROUP_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值。
3,LEFT和RIGHT函数
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); |
4,LENGTH和CHAR_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; |
5,REPLACE字符串函数
函数REPLACE(),可以用新的字符串替换表的列中的字符串。
REPLACE()函数的语法如下:
REPLACE(str,old_string,new_string); |
REPLACE()函数有三个参数,它将string中的old_string替换为new_string字符串。
例如:
SELECT REPLACE('MySQL LEFT','LEFT','RIGHT'); |
6,SUBSTRING函数
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); |
7,TRIM函数
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 '); |
8,FORMAT函数
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日期和时间函数
1,YEAR/MONTH/DAY函数
YEAR/MONTH/DAY函数的语法如下:
YEAR(date) MONTH(date) DAY(date) |
例如:
SELECT YEAR('2017-03-23'),MONTH('2017-03-23'),DAY('2017-03-23'); |
2,NOW()函数
NOW()函数以"YYYY-MM-DD HH:MM:DD"格式的字符串或数字返回配置的时区中的当前日期和时间。例如:
SELECT NOW(); |
3,CURDATE函数
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'); |
5,DATE_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); |
6,DATE_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); |
7,DATE_FORMAT函数
日期值格式化为特定格式。
DATE_FORMAT函数的语法如下:
DATE_FORMAT(date,format); |
DATE_FORMAT()函数接受两个参数:
date:是要格式化的有效日期值
format:是由预定义的说明符组成的格式字符串,每个说明符前面都有一个百分比字符(%)。有关预定义说明符的列表,请参见下表。
限定符 |
含义 |
%a |
三个字符缩写的工作日名称,例如:Mon, Tue, Wed,等 |
%b |
三个字符缩写的月份名称,例如:Jan,Feb,Mar等 |
%c |
以数字表示的月份值,例如:1, 2, 3…12 |
%D |
英文后缀如:0th, 1st, 2nd等的一个月之中的第几天 |
%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 |
AM或PM,取决于其他时间说明符 |
%r |
表示时间,12小时格式hh:mm:ss AM或PM |
%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'); |
8,DAYNAME函数
DAYNAME函数返回指定日期的工作日的名称。
DAYNAME函数的语法如下:
DAYNAME(date); |
如果日期为NULL或无效,例如2017-02-30,DAYNAME函数将返回NULL。例如:
SELECT DAYNAME('2017-01-01'); |
9,DAYOFWEEK/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'); |
10,EXTRACT函数
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'); |
11,SYSDATE函数
返回当前日期时间,格式为"YYYY-MM-DD HH:MM:SS"的值
SYSDATE()函数的语法如下:
SYSDATE(fsp); |
例如:
SELECT SYSDATE(),SYSDATE(3); |
如果传递fsp参数,则结果将包括小数秒精度。
12,WEEK函数
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'); |