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;