mysql常用函数介绍
参考:http://c.biancheng.net/mysql/function/
目录
MySQL 运算符
算术运算符
+ 加法
- 减法
* 乘法
/ 或 DIV 除法
% 或 MOD 取余
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL
比较运算符
SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL
= 等于
<>, != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间
IN 在集合中
NOT IN 不在集合中
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配
REGEXP 或 RLIKE 正则式匹配
IS NULL 为空
IS NOT NULL 不为空
逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>> 右移
数值型函数
abs()--hive ok
绝对值函数 ABS(x) 返回 x 的绝对值。正数的绝对值是其本身,负数的绝对值为其相反数,0 的绝对值是 0
mysql> select abs(3), abs(-3), abs(0);
+--------+---------+--------+
| abs(3) | abs(-3) | abs(0) |
+--------+---------+--------+
| 3 | 3 | 0 |
+--------+---------+--------+
sqrt(x) --hive 在这里返回的都是是浮点数
平方根函数 SQRT(x) 返回非负数 x 的二次方根。负数没有平方根,返回结果为 NULL
mysql> select sqrt(25), sqrt(-25), sqrt(0), sqrt(33), sqrt(33.5);
+----------+-----------+---------+-------------------+-------------------+
| sqrt(25) | sqrt(-25) | sqrt(0) | sqrt(33) | sqrt(33.5) |
+----------+-----------+---------+-------------------+-------------------+
| 5 | NULL | 0 | 5.744562646538029 | 5.787918451395113 |
+----------+-----------+---------+-------------------+-------------------+
mod(x, y) -- hive 中是pmod(x, y)
求余函数 MOD(x,y) 返回 x 被 y 除后的余数,MOD() 对于带有小数部分的数值也起作用,它返回除法运算后的余数
mysql> select mod(3, 2), mod(1.1, 2);
+-----------+-------------+
| mod(3, 2) | mod(1.1, 2) |
+-----------+-------------+
| 1 | 1.1 |
+-----------+-------------+
ceil(x), ceiling(x) -- hive ok
取整函数 CEIL(x) 和 CEILING(x) 的意义相同,返回不小于 x 的最小整数值,返回值转化为一个 BIGINT
mysql> select ceil(3.2), ceiling(3.2);
+-----------+--------------+
| ceil(3.2) | ceiling(3.2) |
+-----------+--------------+
| 4 | 4 |
+-----------+--------------+
floor(x) -- hive ok
FLOOR(x) 向下取整函数返回小于 x 的最大整数值
mysql> select floor(3.2);
+------------+
| floor(3.2) |
+------------+
| 3 |
+------------+
rand() -- hive ok
RAND() 函数被调用时,可以产生一个在 0 和 1 之间的随机数
mysql> select rand(), rand();
+---------------------+--------------------+
| rand() | rand() |
+---------------------+--------------------+
| 0.37282911257150503 | 0.4535757354028297 |
+---------------------+--------------------+
rand(x) -- hive ok
当使用整数作为参数调用时,RAND() 使用该值作为随机数的种子发生器。每次种子使用给定值生成,RAND() 将产生一个可重复的系列数字
mysql> select rand(2), rand(2);
+--------------------+--------------------+
| rand(2) | rand(2) |
+--------------------+--------------------+
| 0.6555866465490187 | 0.6555866465490187 |
+--------------------+--------------------+
ROUND(x) --hive 返回都是浮点数
函数返回最接近于参数 x 的整数;ROUND(x,y) 函数对参数x进行四舍五入的操作,返回值保留小数点后面指定的y位
mysql> select round(-6.6), round(-8.44), round(3.44), round(-6.66, 1), round(3.33, 3), round(88.66, -1), round(88.46, -2);
+-------------+--------------+-------------+-----------------+----------------+------------------+------------------+
| round(-6.6) | round(-8.44) | round(3.44) | round(-6.66, 1) | round(3.33, 3) | round(88.66, -1) | round(88.46, -2) |
+-------------+--------------+-------------+-----------------+----------------+------------------+------------------+
| -7 | -8 | 3 | -6.7 | 3.330 | 90 | 100 |
+-------------+--------------+-------------+-----------------+----------------+------------------+------------------+
ROUND(x)函数将值x四舍五入之后保留了整数部分
从执行结果可以看出,根据参数y值,将参数x四舍五入后得到保留小数点后y位的值,x值的小数位不够y位的补零;
如果y为负值,则保留小数点左边y位,先进行四舍五入操作,再将相应的位数值取零
sign(x) -- hive 返回的都是浮点数
符号函数 SIGN(x) 返回参数的符号,x 的值为负、零和正时返回结果依次为 -1、0 和 1
mysql> select sign(3.22), sign(-1), sign(0);
+------------+----------+---------+
| sign(3.22) | sign(-1) | sign(0) |
+------------+----------+---------+
| 1 | -1 | 0 |
+------------+----------+---------+
pow(x, y), power(x, y) -- hive返回的都是浮点数
POW(x,y) 函数和 POWER(x,y) 函数用于计算 x 的 y 次方
mysql> select pow(3, 2), power(3, 2);
+-----------+-------------+
| pow(3, 2) | power(3, 2) |
+-----------+-------------+
| 9 | 9 |
+-----------+-------------+
pi() -- hive ok
返回圆周率
mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
正弦函数 SIN(x) 返回 x 的正弦值,其中 x 为弧度值
mysql> select sin(1), sin(0.5*pi());
+--------------------+---------------+
| sin(1) | sin(0.5*pi()) |
+--------------------+---------------+
| 0.8414709848078965 | 1 |
+--------------------+---------------+
反正弦函数 ASIN(x) 返回 x 的反正弦值,若 x 不在 -1 到 1 的范围之内,则返回 NULL
mysql> select asin(0), asin(0.5), asin(1);
+---------+--------------------+--------------------+
| asin(0) | asin(0.5) | asin(1) |
+---------+--------------------+--------------------+
| 0 | 0.5235987755982989 | 1.5707963267948966 |
+---------+--------------------+--------------------+
余弦函数 COS(x) 返回 x 的余弦值,x 为弧度值
mysql> select cos(0),cos(0.25 * pi()), cos(0.5*pi());
+--------+--------------------+-----------------------+
| cos(0) | cos(0.25 * pi()) | cos(0.5*pi()) |
+--------+--------------------+-----------------------+
| 1 | 0.7071067811865476 | 6.123233995736766e-17 |
+--------+--------------------+-----------------------+
反余弦函数 ACOS(x) 。x 值的范围必须在 -1 和 1 之间,否则返回 NULL
mysql> select acos(-1), acos(0), acos(1);
+-------------------+--------------------+---------+
| acos(-1) | acos(0) | acos(1) |
+-------------------+--------------------+---------+
| 3.141592653589793 | 1.5707963267948966 | 0 |
+-------------------+--------------------+---------+
正切函数 TAN(x) 返回 x 的正切值,x 为给定的弧度值
mysql> select tan(0.25 * pi()), tan(0), tan(-0.5 * pi());
+--------------------+--------+-----------------------+
| tan(0.25 * pi()) | tan(0) | tan(-0.5 * pi()) |
+--------------------+--------+-----------------------+
| 0.9999999999999999 | 0 | -1.633123935319537e16 |
+--------------------+--------+-----------------------+
反正切 ATAN(x) 返回 x 的反正切值,正切为 x 的值
余切函数 COT(x) 返回 x 的余切值,x 是给定的弧度值
mysql字符串函数
length(str) -- hive返回的是字符长度
LENGTH(str) 函数的返回值为字符串的字节长度,使用 uft8(UNICODE 的一种变长字符编码,又称万国码)编码字符集时,一个汉字是 3 个字节,一个数字或字母是一个字节
mysql> select length('mouse'), length('我的祖国');
+-----------------+------------------------+
| length('mouse') | length('我的祖国') |
+-----------------+------------------------+
| 5 | 12 |
+-----------------+------------------------+
concat(s1, s2, ...) -- hive ok
CONCAT(sl,s2,...) 函数返回结果为连接参数产生的字符串,或许有一个或多个参数
若有任何一个参数为 NULL,则返回值为 NULL。若所有参数均为非二进制字符串,则结果为非二进制字符串。若自变量中含有任一二进制字符串,则结果为一个二进制字符串
mysql> select concat('mysql', '5.7'), concat('mysql', null);
+------------------------+-----------------------+
| concat('mysql', '5.7') | concat('mysql', null) |
+------------------------+-----------------------+
| mysql5.7 | NULL |
+------------------------+-----------------------+
insert(s1, start, len, s2) -- hive没有此函数
使用字符串s2,替换s1中从start开始,start+len 之间的字符串,然后返回一个新的字符串,包括起始位置
mysql> select insert('people', 1, 2, 'mo'), insert('people', 1, 3, 'mo');
+------------------------------+------------------------------+
| insert('people', 1, 2, 'mo') | insert('people', 1, 3, 'mo') |
+------------------------------+------------------------------+
| moople | mople |
+------------------------------+------------------------------+
注意:这里的字符串是从1开始计算位置的
replace(s, s1, s2) -- hive ok
替换函数 REPLACE(s,s1,s2) 使用字符串 s2 替换字符串 s 中所有的字符串 s1
mysql> select replace('peopeple', 'pe', 'mous');
+-----------------------------------+
| replace('peopeple', 'pe', 'mous') |
+-----------------------------------+
| mousomousple |
+-----------------------------------+
lower(x)/upper(x) -- hive ok
将字符串转换为小写/大写
mysql> select lower('PEOple'), upper('people');
+-----------------+-----------------+
| lower('PEOple') | upper('people') |
+-----------------+-----------------+
| people | PEOPLE |
+-----------------+-----------------+
left(x, n)/right(x, n)/trim(x) --hive没有left/right函数
从左边开始截取字符串/从右边开始截取字符串/删除字符串两侧的空格
mysql> select left('people', 2), right('people', 2), trim(' people ');
+-------------------+--------------------+----------------------+
| left('people', 2) | right('people', 2) | trim(' people ') |
+-------------------+--------------------+----------------------+
| pe | le | people |
+-------------------+--------------------+----------------------+
substring(s, n, len) -- hive ok
获取子串函数 SUBSTRING(s,n,len) 带有 len 参数的格式,从字符串 s 返回一个长度为 len 的子字符串,从n开始
mysql> select substring('people', 2, 3), substring('people', -2, 3);
+---------------------------+----------------------------+
| substring('people', 2, 3) | substring('people', -2, 3) |
+---------------------------+----------------------------+
| eop | le |
+---------------------------+----------------------------+
字符串索引是从1开始计数的,如果开始位置是负数则是从后向前看
reverse(str) -- hive ok
符串逆序函数 REVERSE(s) 可以将字符串 s 反转,返回的字符串的顺序和 s 字符串的顺序相反
mysql> select reverse('people');
+-------------------+
| reverse('people') |
+-------------------+
| elpoep |
+-------------------+
myslq日期和时间函数
CURDATE() 和 CURRENT_DATE() 函数的作用相同,将当前日期按照“YYYY-MM-DD”或“YYYYMMDD”格式的值返回,具体格式根据函数用在字符串或数字语境中而定
CURTIME() 和 CURRENT_TIME() 函数的作用相同,将当前时间以“HH:MM:SS”或“HHMMSS”格式返回,具体格式根据函数用在字符串或数字语境中而定
NOW() 和 SYSDATE() 函数的作用相同,都是返回当前日期和时间值,格式为“YYYY-MM-DD HH:MM:SS”或“YYYYMMDDHHMMSS”,具体格式根据函数用在字符串或数字语境中而定
mysql> select current_date(), curdate(), current_time(), curtime(), now(), sysdate();
+----------------+------------+----------------+-----------+---------------------+---------------------+
| current_date() | curdate() | current_time() | curtime() | now() | sysdate() |
+----------------+------------+----------------+-----------+---------------------+---------------------+
| 2019-10-25 | 2019-10-25 | 05:43:33 | 05:43:33 | 2019-10-25 05:43:33 | 2019-10-25 05:43:33 |
+----------------+------------+----------------+-----------+---------------------+---------------------+
-- hive 只有current_date()
current_timestamp() hive中查询当前时间
UNIX_TIMESTAMP(date) 若无参数调用(默认为当前时间),返回一个无符号整数类型的 UNIX 时间戳('1970-01-01 00:00:00'GMT之后的秒数)。
如果传入参数,它会将参数值以'1970-01-01 00:00:00'GMT后的秒数的形式返回
FROM_UNIXTIME(date) 函数把 UNIX 时间戳转换为普通格式的日期时间值,与 UNIX_TIMESTAMP () 函数互为反函数
mysql> select unix_timestamp(), unix_timestamp(now() - 5), from_unixtime(unix_timestamp());
+------------------+---------------------------+---------------------------------+
| unix_timestamp() | unix_timestamp(now() - 5) | from_unixtime(unix_timestamp()) |
+------------------+---------------------------+---------------------------------+
| 1571953688 | 1571953683 | 2019-10-25 05:48:08 |
+------------------+---------------------------+---------------------------------+
-- hive 也有这两个函数,用法类似
MONTH(date) -- hive ok
函数返回指定 date 对应的月份,范围为 1~12
MONTHNAME(date) -- hive没有此函数
函数返回日期 date 对应月份的英文全名
DAYNAME(date) -- hive没有此函数
函数返回 date 对应的工作日英文名称,例如 Sunday、Monday 等
DAYOFWEEK(d) -- hive没有此函数
函数返回 d 对应的一周中的索引(位置)。1 表示周日,2 表示周一,……,7 表示周六。这些索引值对应于ODBC标准
WEEK() -- hive没有此函数
函数计算日期 date 是一年中的第几周。WEEK(date,mode) 函数允许指定星期是否起始于周日或周一,以及返回值的范围是否为 0~52 或 1~53
DAYOFYEAR(d) -- hive没有此函数
函数返回 d 是一年中的第几天,范围为 1~366
DAYOFMONTH(d) -- hive ok
函数返回 d 是一个月中的第几天,范围为 1~31
YEAR(date) -- hive ok
函数返回的年份值范围为 1000 到 9999,如果日期为零,YEAR() 函数返回 0
mysql> select month(now()), monthname(now()), dayname(now()), dayofweek(now()), week(now());
+--------------+------------------+----------------+------------------+-------------+
| month(now()) | monthname(now()) | dayname(now()) | dayofweek(now()) | week(now()) |
+--------------+------------------+----------------+------------------+-------------+
| 10 | October | Friday | 6 | 42 |
+--------------+------------------+----------------+------------------+-------------+
mysql> select dayofyear(now()), dayofmonth(now()), year(now());
+------------------+-------------------+-------------+
| dayofyear(now()) | dayofmonth(now()) | year(now()) |
+------------------+-------------------+-------------+
| 298 | 25 | 2019 |
+------------------+-------------------+-------------+
DATE_ADD(date,INTERVAL expr type) 和 ADDDATE(date,INTERVAL expr type) 两个函数的作用相同,都是用于执行日期的加运算
DATE_ADD() 和 ADDDATE() 函数有两个参数:
date 是 DATE 或 DATETIME 的起始值。
INTERVAL expr type是要添加到起始日期值的间隔值
DATE_SUB(date,INTERVAL expr type) 和 SUBDATE(date,INTERVAL expr type) 两个函数作用相同,都是执行日期的减法运算。
DATE_SUB() 和 SUBDATE() 函数接受两个参数:
date 是 DATE 或 DATETIME 的起始值。
expr 是一个字符串,用于确定从起始日期减去的间隔值。type 是 expr 可解析的间隔单位,例如 DAY,HOUR 等
ADDTIME(time,expr) 函数用于执行时间的加法运算。添加 expr 到 time 并返回结果。
其中:time 是一个时间或日期时间表达式,expr 是一个时间表达式
SUBTIME(time,expr) 函数用于执行时间的减法运算。
其中:函数返回 time。expr 表示的值和格式 time 相同。time 是一个时间或日期时间表达式, expr 是一个时间
DATEDIFF(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数。date1 和 date2 为日期或 date-and-time 表达式
mysql> select date_add(now(), interval 3 day), date_sub(now(), interval 3 day), addtime(now(), '0:5:5');
+---------------------------------+---------------------------------+-------------------------+
| date_add(now(), interval 3 day) | date_sub(now(), interval 3 day) | addtime(now(), '0:5:5') |
+---------------------------------+---------------------------------+-------------------------+
| 2019-10-28 06:38:15 | 2019-10-22 06:38:15 | 2019-10-25 06:43:20 |
+---------------------------------+---------------------------------+-------------------------+
mysql> select now(), subtime(now(), '0:10:25'), datediff(now(), date_add(now(), interval 4 day));
+---------------------+---------------------------+--------------------------------------------------+
| now() | subtime(now(), '0:10:25') | datediff(now(), date_add(now(), interval 4 day)) |
+---------------------+---------------------------+--------------------------------------------------+
| 2019-10-25 06:41:55 | 2019-10-25 06:31:30 | -4 |
+---------------------+---------------------------+--------------------------------------------------+
type取值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
注意:
上面的函数中hive虽然有date_add, date_sub函数,但是增减单位限定为了day,而不是可调的,而且传入的日期可以直接是字符串
hive中datediff(date1, date2)可以直接传入字符串
DATE_FORMAT(date,format) 函数是根据 format 指定的格式显示 date 值。
DATE_FORMAT() 函数接受两个参数:
date:是要格式化的有效日期值
format:是由预定义的说明符组成的格式字符串,每个说明符前面都有一个百分比字符(%)
主要的格式如下:
%H 以 2 位数表示 24 小时(00~23)
%k 以 24 小时(0~23)表示
%m 月份,数字形式(00~12)
%c 月份,数字形式(0~12)
%d 该月日期,数字形式(00~31)
%e 该月日期,数字形式((0~31)
%i 分钟,数字形式(00~59)
%Y 4 位数形式表示年份
%y 2 位数形式表示年份
%T 时间,24 小时制(小时 (hh): 分钟 (mm): 秒数 (ss))
WEEKDAY(d) -- hive 没有此函数
返回 d 对应的工作日索引。0 表示周一,1 表示周二,……,6 表示周日
mysql> select weekday(now());
+----------------+
| weekday(now()) |
+----------------+
| 4 |
+----------------+
mysql聚合函数
mysql流程控制函数
if(expr,v1,v2)
mysql> select if(1<2, 'right', 'wrong'), if(length('mouse')>3, 'long', 'short');
+---------------------------+----------------------------------------+
| if(1<2, 'right', 'wrong') | if(length('mouse')>3, 'long', 'short') |
+---------------------------+----------------------------------------+
| right | long |
+---------------------------+----------------------------------------+
ifnull(v1, v2)
如果 v1 不为 NULL,则 IFNULL 函数返回 v1; 否则返回 v2 的结果
mysql> select ifnull(3, 'null'), ifnull(null, 'it is null');
+-------------------+----------------------------+
| ifnull(3, 'null') | ifnull(null, 'it is null') |
+-------------------+----------------------------+
| 3 | it is null |
+-------------------+----------------------------+
简单的 CASE 语句就是指使用简单 CASE 语句来检查表达式的值与一组唯一值的匹配。
简单的 CASE 语句的语法:
CASE
WHEN condition1 THEN <操作>
WHEN condition2 THEN <操作>
...
ELSE <操作>
END;