SQL基礎(chǔ)介紹-函數(shù)使用

MySQL
函數(shù)使用

這里介紹下铐望,MySQL中常用的函數(shù),函數(shù)有太多太多栖袋,不一定都需要記住蚕甥,只需要有個印象,需要的時候去文檔中找一下栋荸,記住一些常用的就好了

數(shù)學(xué)函數(shù)

abs(x)

返回x的絕對值

select abs(-10),abs(10)
abs

ceil(x)菇怀、ceiling(x)

向上取整,比該值大的第一個整數(shù)

select CEIL(9.3),CEIL(9.5),CEIL(9.6),CEIL(-9.5),CEIL(-9.1)
ceil

floor(x)

向下取整,比該值小的第一個整數(shù)

select FLOOR(9.3),FLOOR(9.5),FLOOR(9.6),FLOOR(-9.5),FLOOR(-9.1)
floor

round(x),round(x,y)

四舍五入晌块,round(x)爱沟,最近的一個整數(shù),round(x,y)匆背,這個y可以指定精度

select ROUND(9.3),ROUND(9.6),ROUND(9.378,2),ROUND(9.455,2)
round

rand(),rand(x)

rand() 返回0~1之間的隨機(jī)數(shù)
rand(x) 返回0~1之間的隨機(jī)數(shù)呼伸,如果x值相等,則返回值相等

select RAND(),RAND(),RAND(10),RAND(10)
rand

字符串函數(shù)

獲取字符串長度

length(str),返回str的長度,這里要注意下中文括享,占3個長度,這里的長度單位是bytes

mysql> select length('abc'),length('中國'),length('hi中國');
+---------------+----------------+------------------+
| length('abc') | length('中國') | length('hi中國') |
+---------------+----------------+------------------+
|             3 |              6 |                8 |
+---------------+----------------+------------------+
1 row in set

CHAR_LENGTH(str)搂根,返回str的長度,中文和英文一樣铃辖,占1個字符剩愧,這里長度單位是字符

mysql> select char_length('abc'),char_length('中國'),char_length('hi中國');
+--------------------+---------------------+-----------------------+
| char_length('abc') | char_length('中國') | char_length('hi中國') |
+--------------------+---------------------+-----------------------+
|                  3 |                   2 |                     4 |
+--------------------+---------------------+-----------------------+
1 row in set

字符串拼接

CONCAT(str1,str2,...),將str1娇斩,str2拼接在一起


mysql> select concat('h','e','gogo','中國');
+-------------------------------+
| concat('h','e','gogo','中國') |
+-------------------------------+
| hegogo中國                    |
+-------------------------------+
1 row in set

這里要注意下NULL仁卷,如果其中有參數(shù)為NULL,則結(jié)果為NULL

mysql> select concat('h','e','gogo',NULL,'中國');
+------------------------------------+
| concat('h','e','gogo',NULL,'中國') |
+------------------------------------+
| NULL                               |
+------------------------------------+
1 row in set

CONCAT_WS(separator,str1,str2,...)犬第,使用指定的separator進(jìn)行拼接

mysql> select concat_ws('^','e','gogo',NULL,'中國');
+---------------------------------------+
| concat_ws('^','e','gogo',NULL,'中國') |
+---------------------------------------+
| e^gogo^中國                           |
+---------------------------------------+
1 row in set

這里是如果有NULL锦积,對結(jié)果是沒有影響的,會直接忽略NULL值

剔除空格或指定字符

剔除字符串左右的空格
ltrim(str),剔除左側(cè)空格
rtrim(str),剔除右側(cè)空格
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str)
trim可以使用參數(shù)來控制剔除空格或者是指定的remstr歉嗓,默認(rèn)是空格

mysql> select concat(ltrim('   hi   '),'oo'),concat(rtrim('   hi   '),'oo'),concat(trim('   hi   '),'oo');
+--------------------------------+--------------------------------+-------------------------------+
| concat(ltrim('   hi   '),'oo') | concat(rtrim('   hi   '),'oo') | concat(trim('   hi   '),'oo') |
+--------------------------------+--------------------------------+-------------------------------+
| hi   oo                        |    hioo                        | hioo                          |
+--------------------------------+--------------------------------+-------------------------------+
1 row in set

mysql> select trim('a' from 'aabbbccaa'),trim(leading 'a' from 'aabbbccaa'),trim(trailing 'a' from 'aabbbccaa');
+----------------------------+------------------------------------+-------------------------------------+
| trim('a' from 'aabbbccaa') | trim(leading 'a' from 'aabbbccaa') | trim(trailing 'a' from 'aabbbccaa') |
+----------------------------+------------------------------------+-------------------------------------+
| bbbcc                      | bbbccaa                            | aabbbcc                             |
+----------------------------+------------------------------------+-------------------------------------+
1 row in set

字符串填充

LPAD(str,len,padstr)丰介,左側(cè)填充
RPAD(str,len,padstr),右側(cè)填充
len是指定str的長度鉴分,如果不夠基矮,則使用padstr填充,如果超了冠场,則進(jìn)行截取

mysql> select lpad('hi',6,'@'),lpad('higogo',4,'@'),rpad('hi',6,'@'),rpad('higogo',4,'@');
+------------------+----------------------+------------------+----------------------+
| lpad('hi',6,'@') | lpad('higogo',4,'@') | rpad('hi',6,'@') | rpad('higogo',4,'@') |
+------------------+----------------------+------------------+----------------------+
| @@@@hi           | higo                 | hi@@@@           | higo                 |
+------------------+----------------------+------------------+----------------------+
1 row in set

字符串截取

LEFT(str,len)家浇,從左側(cè)開始截取len個字符
RIGHT(str,len),從右側(cè)截取len個字符
SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len)碴裙,從指定pos開始截取len個字符

mysql> select left('hello',1),left('hello',3),right('hello',3);
+-----------------+-----------------+------------------+
| left('hello',1) | left('hello',3) | right('hello',3) |
+-----------------+-----------------+------------------+
| h               | hel             | llo              |
+-----------------+-----------------+------------------+
1 row in set

mysql> select substr('hello',1),substr('hello',2),substr('hello' from 2);
+-------------------+-------------------+------------------------+
| substr('hello',1) | substr('hello',2) | substr('hello' from 2) |
+-------------------+-------------------+------------------------+
| hello             | ello              | ello                   |
+-------------------+-------------------+------------------------+
1 row in set

mysql> select substr('hello',1,3),substr('hello',2,3),substr('hello' from 2 for 2);
+---------------------+---------------------+------------------------------+
| substr('hello',1,3) | substr('hello',2,3) | substr('hello' from 2 for 2) |
+---------------------+---------------------+------------------------------+
| hel                 | ell                 | el                           |
+---------------------+---------------------+------------------------------+
1 row in set

大小寫轉(zhuǎn)換

LOWER(str) LCASE(str)钢悲,將str轉(zhuǎn)為小寫
UPPER(str) UCASE(str),將str轉(zhuǎn)為大寫

mysql> select lower('AppLE'),lcase('AppLE'),upper('AppLE'),ucase('AppLE');
+----------------+----------------+----------------+----------------+
| lower('AppLE') | lcase('AppLE') | upper('AppLE') | ucase('AppLE') |
+----------------+----------------+----------------+----------------+
| apple          | apple          | APPLE          | APPLE          |
+----------------+----------------+----------------+----------------+
1 row in set

更多字符串函數(shù)

參考官網(wǎng): https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

日期和函數(shù)

獲取當(dāng)前日期舔株、時間

SELECT CURRENT_DATE,CURRENT_DATE(),CURRENT_TIME,CURRENT_TIME(),CURRENT_TIMESTAMP(),NOW()
當(dāng)前日期莺琳、時間

時間戳相關(guān)函數(shù)

UNIX_TIMESTAMP() 返回當(dāng)前時間的時間戳,
UNIX_TIMESTAMP(x) 返回指定日期的時間戳
FROM_UNIXTIME(x) 將時間戳轉(zhuǎn)為日期
FROM_UNIXTIME(x,y) 將時間戳轉(zhuǎn)為指定格式的日期

mysql> select UNIX_TIMESTAMP(),UNIX_TIMESTAMP('2017-09-10');
+------------------+------------------------------+
| UNIX_TIMESTAMP() | UNIX_TIMESTAMP('2017-09-10') |
+------------------+------------------------------+
|       1505096065 |                   1504972800 |
+------------------+------------------------------+
1 row in set

mysql> select FROM_UNIXTIME(1505096033),FROM_UNIXTIME(1504972800),FROM_UNIXTIME(1505096033,'%Y-%m-%d');
+---------------------------+---------------------------+--------------------------------------+
| FROM_UNIXTIME(1505096033) | FROM_UNIXTIME(1504972800) | FROM_UNIXTIME(1505096033,'%Y-%m-%d') |
+---------------------------+---------------------------+--------------------------------------+
| 2017-09-11 10:13:53       | 2017-09-10 00:00:00       | 2017-09-11                           |
+---------------------------+---------------------------+--------------------------------------+
1 row in set

mysql> 

extract

EXTRACT(unit FROM date)
返回日期/時間的單獨部分载慈,比如年惭等、月、日办铡、小時辞做、分鐘等等
date 參數(shù)是合法的日期表達(dá)式。unit 參數(shù)可以是下列的值:

extract
mysql> select extract(YEAR FROM NOW()),extract(MONTH from now()),extract(HOUR from now());
+--------------------------+---------------------------+--------------------------+
| extract(YEAR FROM NOW()) | extract(MONTH from now()) | extract(HOUR from now()) |
+--------------------------+---------------------------+--------------------------+
|                     2017 |                         9 |                       10 |
+--------------------------+---------------------------+--------------------------+
1 row in set

mysql> 

datediff寡具、timediff秤茅、timestampdiff

datediff(expr1,expr2),獲取2個日期相差的天數(shù)

mysql> select datediff('2017-09-11 10:00:00','2017-09-08 00:00:00');
+-------------------------------------------------------+
| datediff('2017-09-11 10:00:00','2017-09-08 00:00:00') |
+-------------------------------------------------------+
|                                                     3 |
+-------------------------------------------------------+
1 row in set

mysql> 

TIMEDIFF(expr1,expr2),返回expr1-expr2的時間差

mysql> select timediff('2017-09-11 10:00:00','2017-09-08 00:00:00');
+-------------------------------------------------------+
| timediff('2017-09-11 10:00:00','2017-09-08 00:00:00') |
+-------------------------------------------------------+
| 82:00:00                                              |
+-------------------------------------------------------+
1 row in set

mysql> 

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
返回指定unit的datetime_expr2 ? datetime_expr1時間差
unit可以是MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

mysql> select timestampdiff(DAY,'2017-09-11 10:00:00','2017-09-08 00:00:00');
+----------------------------------------------------------------+
| timestampdiff(DAY,'2017-09-11 10:00:00','2017-09-08 00:00:00') |
+----------------------------------------------------------------+
|                                                             -3 |
+----------------------------------------------------------------+
1 row in set

mysql> select timestampdiff(HOUR,'2017-09-11 10:00:00','2017-09-08 00:00:00');
+-----------------------------------------------------------------+
| timestampdiff(HOUR,'2017-09-11 10:00:00','2017-09-08 00:00:00') |
+-----------------------------------------------------------------+
|                                                             -82 |
+-----------------------------------------------------------------+
1 row in set

時間加減函數(shù)

對日期進(jìn)行加減操作童叠,有很多方法可以使用框喳,最簡單的是直接使用interval

mysql> select now(),now() + interval 3 DAY,now()+interval 1 Hour;
+---------------------+------------------------+-----------------------+
| now()               | now() + interval 3 DAY | now()+interval 1 Hour |
+---------------------+------------------------+-----------------------+
| 2017-09-11 10:57:18 | 2017-09-14 10:57:18    | 2017-09-11 11:57:18   |
+---------------------+------------------------+-----------------------+
1 row in set

當(dāng)然也可使用提供的函數(shù)

ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

日期加減
mysql> select now(),date_add(now(),interval 1 Day),adddate(now(),interval 3 Hour);
+---------------------+--------------------------------+--------------------------------+
| now()               | date_add(now(),interval 1 Day) | adddate(now(),interval 3 Hour) |
+---------------------+--------------------------------+--------------------------------+
| 2017-09-11 10:59:09 | 2017-09-12 10:59:09            | 2017-09-11 13:59:09            |
+---------------------+--------------------------------+--------------------------------+
1 row in set

更多日期、時間函數(shù)

參考官方介紹: [https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html](https:
//dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html)

條件判斷函數(shù)

if

if(expr,v1,v2)
如果expr為真,則返回v1五垮,為假升筏,則返回v2

mysql> select if(1>0,'ok','no'),if(1=0,'ok','no');
+-------------------+-------------------+
| if(1>0,'ok','no') | if(1=0,'ok','no') |
+-------------------+-------------------+
| ok                | no                |
+-------------------+-------------------+
1 row in set

mysql> 

ifnull

ifnull(v1,v2)
如果v1的值為null颊乘,則返回v2林螃,如果v1不為null抢蚀,則返回v1

mysql> select ifnull(99,20),ifnull(NULL,99);
+---------------+-----------------+
| ifnull(99,20) | ifnull(NULL,99) |
+---------------+-----------------+
|            99 |              99 |
+---------------+-----------------+
1 row in set

mysql> 

case when

這里可以根據(jù)多個條件來判斷峻凫,在不同的情況下秋泄,返回不同的值

select 
    s_id,s_name,s_gender,
    case 
        when s_gender=0 then '男' 
        when s_gender=1 then '女' 
    end gender,
    s_birthday,
    s_hobby,
    c_id
from 
    t_student
;
case when
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末香伴,一起剝皮案震驚了整個濱河市揽趾,隨后出現(xiàn)的幾起案子小作,更是在濱河造成了極大的恐慌亭姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顾稀,死亡現(xiàn)場離奇詭異达罗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)静秆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門粮揉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抚笔,你說我怎么就攤上這事扶认。” “怎么了殊橙?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵辐宾,是天一觀的道長。 經(jīng)常有香客問我膨蛮,道長叠纹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任敞葛,我火速辦了婚禮誉察,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惹谐。我一直安慰自己持偏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布氨肌。 她就那樣靜靜地躺著综液,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儒飒。 梳的紋絲不亂的頭發(fā)上谬莹,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼附帽。 笑死埠戳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕉扮。 我是一名探鬼主播整胃,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喳钟!你這毒婦竟也來了屁使?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奔则,失蹤者是張志新(化名)和其女友劉穎蛮寂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體易茬,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酬蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抽莱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范抓。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖食铐,靈堂內(nèi)的尸體忽然破棺而出匕垫,到底是詐尸還是另有隱情,我是刑警寧澤虐呻,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布年缎,位于F島的核電站,受9級特大地震影響铃慷,放射性物質(zhì)發(fā)生泄漏单芜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一犁柜、第九天 我趴在偏房一處隱蔽的房頂上張望洲鸠。 院中可真熱鬧,春花似錦馋缅、人聲如沸扒腕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘾腰。三九已至,卻和暖如春覆履,著一層夾襖步出監(jiān)牢的瞬間蹋盆,已是汗流浹背费薄。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留栖雾,地道東北人楞抡。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像析藕,于是被迫代替她去往敵國和親召廷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.簡介 數(shù)據(jù)存儲有哪些方式账胧?電子表格竞慢,紙質(zhì)文件,數(shù)據(jù)庫治泥。 那么究竟什么是關(guān)系型數(shù)據(jù)庫筹煮? 目前對數(shù)據(jù)庫的分類主要是...
    喬震閱讀 1,707評論 0 2
  • 一、MySQL 獲得當(dāng)前日期時間 函數(shù) 1.1 獲得當(dāng)前日期+時間(date + time)函數(shù):now() my...
    極簡架構(gòu)閱讀 1,220評論 0 1
  • “風(fēng)無涯,你個縮頭烏龜眼俊,究竟什么時候才肯放老娘出來意狠?你等著,我一出去就打得你滿地找牙疮胖,連你家老子都認(rèn)不得环戈!” 天庭...
    貓大順閱讀 146評論 0 5
  • 文/熠歆 其實這東西真名叫啥,我還不知道澎灸。 上次回家聽媽媽說叫“苤納”院塞,我是按拼音打出來的。媽媽用它來炒肉性昭,脆脆的...
    熠歆閱讀 263評論 14 5
  • 【人的煩惱就12個字】放不下拦止,想不開,看不透糜颠,忘不了汹族。
    帥也得忍著閱讀 276評論 0 1