一、 聚合函数1.1 求和函数-----sum()
求和函数sum( )用于对数据求和,返回选取结果集中所有值的总和。
语法:select sum(column_name) from table_name
说明:sum()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
1.2 计数函数-----count()
count()函数用来计算表中记录的个数或者列中值的个数,计算内容由select语句指定。
使用count函数时,必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。
两种使用形式如下:
count(*),计算表中行的总数,即使表中行的数据为null,也被计入在内。
count(column),计算column列包含的行的数目,如果该列中某行数据为null,则该行不计入统计总数。
--使用count(*)函数对表中的行数计数:
count(*)函数将返回满足select语句的where子句中的搜索条件的函数。
--使用count( )函数对一列中的数据计数:
count( )函数可用于对一列中的数据值计数。
与忽略了所有列的count(*)函数不同,count( )函数逐一检查一列(或多列)中的值,并对那些值不是null的行计数。
--使用count( )函数对多列中的数据计数:
count( )函数不仅可用于对一列中的数据值计数,也可以对多列中的数据值计数。
如果对多列计数,则需要将要计数的多列通过连接符连接后,作为count( )函数的参数。
1.3 最大/最小值函数—-----max()/min()
当需要了解一列中的最大值时,可以使用max()函数;
同样,当需要了解一列中的最小值时,可以使用min()函数。语法如下。
select max (column_name) / min (column_name) from table_name
说明:列column_name中的数据可以是数值、字符串或是日期时间数据类型。
max()/min()函数将返回与被传递的列同一数据类型的单一值。
1.4 均值函数-----avg()
函数avg()用于计算一列中数据值的平均值。
语法:select avg (column_name) from table_name
说明:avg()函数的执行过程实际上是将一列中的值加起来,再将其和除以非null值的数目。
所以,与sum( )函数一样,avg()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
1.5 合并函数-----group_concat()
group_concat可以对分组后的列进行字符串的合并(拼接)。
语法:
group_concat (
[distinct] [,expr ...] [,col_name]
[ order by {,col_name ...} [asc | desc] ]
[separator str_val]
)
举例:表如下
country|population|name
中国|1|a
美国|1|b
日本|5|a
欧洲|5|c
韩国|2|a
非洲|null|b
(from table_name忽略)
--select group_concat(population) group by name
(result:1,5,2|1|5)
--select group_concat(population order by population) group by name
(result:1,2,5|1|5)
--select group_concat(population,'-',country) group by name
(result:1-中国,2-韩国,5-日本|1-美国|5-欧洲)
--select group_concat(
(case country
when '中国' then 'good'
else 'bad'
end)
,'-',population) group by name
(result:good-1,bad-2,bad-5|bad-1|bad-5)
--select group_concat(population,separator '-') group by name
(result:1-5-2|1|5)
1.6 聚合分析的重值处理
前面介绍的5种聚合函数,可以作用于所选列中的所有数据(不管列中的数据是否有重置),
也可以只对列中的非重值进行处理,即把重复的值只取一次进行聚合分析。
当然,对于max()/min()函数来讲,重值处理意义不大。
可以使用all关键字指明对所选列中的所有数据进行处理,
使用distinct关键字指明对所选列中的非重值数据进行处理。
以avg()函数为例,语法如下。
select avg ([all/distinct] column_name) from table_name
说明:[all/distinct]在缺省状态下,默认是all关键字,
即不管是否有重值,处理所有数据。其他聚合函数的用法与此相同。
二、 数学函数abs(x) 返回x的绝对值
bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)
ceiling(x) 返回大于x的最小整数值
exp(x) 返回值e(自然对数的底)的x次方
floor(x) 返回小于x的最大整数值
greatest(x1,x2,...,xn)返回集合中最大的值
least(x1,x2,...,xn) 返回集合中最小的值
ln(x) 返回x的自然对数
log(x,y)返回x的以y为底的对数
mod(x,y) 返回x/y的模(余数)
pi()返回pi的值(圆周率)
rand()返回0到1内的随机值,可以通过提供一个参数(种子)使rand()随机数生成器生成一个指定的值。
round(x,y)返回参数x的四舍五入的有y位小数的值
sign(x) 返回代表数字x的符号的值
sqrt(x) 返回一个数的平方根
truncate(x,y) 返回数字x截短为y位小数的结果
三、 字符串函数ascii(char)返回字符的ascii码值
bit_length(str)返回字符串的比特长度
concat(s1,s2...,sn)将s1,s2...,sn连接成字符串
concat_ws(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔
insert(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
find_in_set(str,list)分析逗号分隔的list列表,如果发现str,返回str在list中的位置
lcase(str)或lower(str) 返回将字符串str中所有字符改变为小写后的结果
left(str,x)返回字符串str中最左边的x个字符
length(s)返回字符串str中的字符数
ltrim(str) 从字符串str中切掉开头的空格
position(substr,str) 返回子串substr在字符串str中第一次出现的位置
quote(str) 用反斜杠转义str中的单引号
repeat(str,srchstr,rplcstr)返回字符串str重复x次的结果
reverse(str) 返回颠倒字符串str的结果
right(str,x) 返回字符串str中最右边的x个字符
rtrim(str) 返回字符串str尾部的空格
strcmp(s1,s2)比较字符串s1和s2
trim(str)去除字符串首部和尾部的所有空格
ucase(str)或upper(str) 返回将字符串str中所有字符转变为大写后的结果
四、日期和时间函数4.1 获取当前系统时间
--curdate()或current_date() 返回当前的日期,例如'2015-07-27'
--curtime()或current_time() 返回当前的时间,例如'09:36:23'
--now()或current_timestamp()或sysdate() 返回当前日期时间,例如'2015-07-27 09:37:11'
--unix_timestamp(date)
如果没有参数调用,返回一个unix时间戳记(从'1970-01-01 00:00:00'gmt开始的秒数)。
如果unix_timestamp()用一个date参数被调用,它返回从'1970-01-01 00:00:00' gmt开始的秒数值。
date可以是一个date字符串、一个datetime字符串、一个timestamp或以yymmdd或yyyymmdd格式的本地时间的一个数字。
例子:select unix_timestamp();//结果1437965279
例子:select unix_timestamp('1997-10-04 22:23:00'); //结果875996580
--from_unixtime(unix_timestamp)
以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式返回unix_timestamp参数所表示的值,
取决于函数是在一个字符串还是或数字上下文中被使用。
例子:select from_unixtime(875996580);//'1997-10-04 22:23:00'
例子:select from_unixtime(875996580) + 0;//19971004222300
--from_unixtime(unix_timestamp,format)
返回表示 unix 时间标记的一个字符串,根据format字符串格式化。
format可以包含与date_format()函数列出的条目同样的修饰符。具体参考下面format表.
例子:select from_unixtime(unix_timestamp(),'%y %d %m %h:%i:%s');//'2015 27th july 10:53:29'
--sec_to_time(seconds)
返回seconds参数,变换成小时、分钟和秒,值以'hh:mm:ss'或hhmmss格式化,
取决于函数是在一个字符串还是在数字上下文中被使用。
例子:select sec_to_time(2378);//'00:39:38'
例子:select sec_to_time(2378) + 0; //3938
--time_to_sec(time)
返回time参数,转换成秒。
例子:select time_to_sec('22:23:00');//80580v
例子:select time_to_sec('00:39:38'); //2378
4.2 日期的时间间隔函数
(4.2.1) 增加(减少)几年几月几天几时几分几秒
--adddate或date_add(date,interval expr type)
--subdate或date_sub(date,interval expr type)
--extract(type from date)函数从日期中返回“type”间隔
expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;
它可以以一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。
second 秒 seconds
minute 分钟 minutes
hour 时间 hours
day 天 days
month 月 months
year 年 years
minute_second 分钟和秒 minutes:seconds
hour_minute 小时和分钟 hours:minutes
day_hour 天和小时 days hours
year_month 年和月 years-months
hour_second 小时, 分钟, hours:minutes:seconds
day_minute 天, 小时, 分钟 days hours:minutes
day_second 天, 小时, 分钟, 秒 days hours:minutes:seconds
举例:
(1)select date_add(now(),interval 60 second);//间隔60秒
(2)select date_add(now(),interval 2:20 minute_second);//间隔2分钟60秒
(3)select date_sub(1998-01-01 00:00:00,interval -1 1 1 day_second);
//间隔一小时一分一秒,天数为空 默认取0.expr前可加-
(4)select extract(hour_second from now());//结果102111,表示10点21分11秒.
--period_add(p,n)
增加n个月到阶段p(以格式yymm或yyyymm)。以格式yyyymm返回值。注意阶段参数p不是日期值。
例子:select period_add(9801,2);//结果199803
--period_diff(p1,p2)
返回在时期p1和p2之间月数,p1和p2应该以格式yymm或yyyymm。注意,时期参数p1和p2不是日期值。
例子:select period_diff(9802,199703);//结果11
(4.2.2) 日期转换
--to_days(date) 给出一个日期date,返回一个天数(从0年的天数)。
例子:select to_days(950501);//结果728779
例子:select to_days('1997-10-07'); //结果729669
--from_days(n)
给出一个天数n,返回一个date值。
例子:select from_days(366);//结果0001-01-01
4.3 日期格式化(转换)
--date_format(date,fmt) 依照指定的fmt格式格式化日期date值.
--time_format(time,format)处理包含小时、分钟和秒的那些格式修饰符。其他修饰符产生一个null值或0。
%m 月名字(january……december)
%w 星期名字(sunday……saturday)
%d 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(sun……sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(jan……dec)
%j 一年中的天数(001……366)
%h 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%i 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [ap]m)
%t 时间,24 小时(hh:mm:ss)
%s 秒(00……59)
%s 秒(00……59)
%p am或pm
%w 一个星期中的天数(0=sunday ……6=saturday )
%u 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
4.4 提取日期
--dayofyear(date) 返回date是一年的第几天(1~366)
例子:select dayofyear('2015-07-27');//208
--dayofmonth(date)或day() 返回date是一个月的第几天(1~31)
例子:select dayofmonth('2015-07-27');//27
--dayofweek(date) 返回date所代表的一星期中的第几天(1~7)
例子:select dayofweek('2015-07-27');//2星期一为第二天.
--weekday(date) 返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
例子:select weekday('2015-07-27 10:09:08');//0表示星期一
--dayname(date) 返回date的星期名.
例子:select dayname('2015-07-27 10:09:08');//monday
--monthname(date) 返回date的月份名.
例子:select monthname('2015-07-27 10:09:08');//july
--last_day(date )
函数使用说明:获取一个日期或日期时间值,返回该月最后一天对应的值。
若参数无效,则返回 null 。
例子:select last_day('2015-02-1 10:09:08');//2015-02-28
--year(date) 返回日期date的年份(1000~9999)
例子:select year('2015-07-27 10:09:08');//2015
--quarter(date) 返回date在一年中的季度(1~4)
例子:select quarter('2015-07-27 10:09:08');//3
--month(date) 返回date的月份值(1~12)
例子:select month('2015-07-27 10:09:08');//7
--week(date) 返回日期date为一年中第几周(0~52)
例子:select week('2015-07-27 10:09:08');//30
--week(date,first)
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,
范围在0到52。2个参数形式week()允许你指定星期是否开始于星期天或星期一。
如果第二个参数是0,星期从星期天开始,如果第二个参数是1,从星期一开始。
例子:select week('2015-07-27 10:09:08',1);//31
--hour(time) 返回time的小时值(0~23)
例子:select hour('2015-07-27 10:09:08');//10
--minute(time) 返回time的分钟值(0~59)
例子:select minute('2015-07-27 10:09:08');//9
--second(time) 返回time的秒数,范围是0到59。
例子:select second('2015-07-27 10:09:08');//8
五、控制流函数case when[test1] then [result1]...else [default] end如果testn是真,则返回resultn,否则返回default
case [test] when[val1] then [result]...else [default]end 如果test和valn相等,则返回resultn,否则返回default
if(test,t,f) 如果test是真,返回t;否则返回f
ifnull(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
nullif(arg1,arg2) 如果arg1=arg2返回null;否则返回arg1