繼上一篇博客 《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(數據,...)