Mysql學習筆記整理手冊
繼上一篇部落格《Oracle學習筆記整理手冊》 之後,我再寫一篇Mysql版本的
PS:本部落格收錄自己工作中遇到學到的一些mysql技能,有時間就更新整理一下
(1) str_to_date
oracle有to_date函式,Mysql的格式是str_to_date(‘2019-02-12 11:34:32’, ‘%Y-%m-%d %H:%i:%s’)
(2) 遞迴查詢
oracle實現遞迴查詢的話,就可以使用start with … connect by,mysql並沒有通過類似函式,解決方法是通過自定義函式的方法,具體可以參考我這篇部落格
https://blog.csdn.net/u014427391/article/details/87297884(3) 排序問題
oracle做資料排序的時候,有時候可以用nulls first或者nulls last將null值排在最前或者最後。
不過遷到Mysql的話,mysql並沒有提供類似函式,所以要怎麼實現?下面給出解決方法:
null值排在最後,用Mysql的IF和ISNULL函式。如果為空返回1,否返回0
select * from A order by IF(ISNULL(a),1,0),a desc
1
null值排在最前,用Mysql的IF和ISNULL函式。如果為空返回0,否返回1
select * from A order by IF(ISNULL(a),0,1),a desc
1
具體可以參考我寫的這篇部落格:https://blog.csdn.net/u014427391/article/details/87297068
(4) 條件函式
條件函式比如case..when在mysql、Oracle都是有的,除了case...when這最基本之外,Oracle有nvl、nvl2和decode函式,Mysql沒有提供類似decode的函式,不過有類似Oracle的nvl和nvl2函式。
Oracle
介紹一下oracle的nvl函式和nvl2函式。
nvl函式
nvl函式基本語法為nvl(E1,E2),意思是E1為null就返回E2,不為null就返回E1。
nvl2函式
nvl2函式的是nvl函式的拓展,基本語法為nvl2(E1,E2,E3),意思是E1為null,就返回E3,不為null就返回E2。
nvl函式具體可以參考我這篇部落格:https://blog.csdn.net/u014427391/article/details/84996009
Mysql
上面是Oracle的做法,mysql的做法可以用IFNULL(E1,E2)函式,其功能類似與Oracle的nvl函式。意思是E1為null就返回E2,不為null就返回E1。
Mysql IF函式,這裡可以和Oracle的nvl2函式做對比,不過差別比較大了,nvl2函式是針對數值為空的情況,IF函式是針對自定義條件的
格式:IF(Condition,A,B)
意義:當Condition為TRUE時,返回A;當Condition為FALSE時,返回B。
(5) 列轉行函式
Oracle列轉行函式可以用vm_comcat函式,mysql的用concat_ws函式
使用方法:
CONCAT_WS(separator,str1,str2,...)
eg:
select concat_ws(',','11','22','33');
Oracle列轉行函式的可以參考我以前部落格:https://blog.csdn.net/u014427391/article/details/84981114
列轉行函式不相容問題:https://blog.csdn.net/u014427391/article/details/84867390
(6) find_int_set
Mysql有提供一個find_int_set函式,其語法為FIND_IN_SET(str,strlist)
- str: 要查詢的字串
- strlist: 序列,用逗號分隔,比如(1,2,3)
這個函式只要用於查詢的時候,查詢字串是否在strlist序列裡,like查詢只是廣泛的模糊匹配
(7) 型別轉換函式
mysql的型別轉換函式為cast(欄位 as 型別),
mysql支援的型別有
- CHAR[(N)] 字元型
- DATE 日期型
- DATETIME 日期和時間型
- DECIMAL float型
- SIGNED int
- TIME 時間型
(8) 合併更新
Oracle實現merge into實現,意思是資料表已經有資料就更新,沒資料就新增
mysql的函式是replace into,語法
replace into 表格(欄位,...) values(資料,...)