近期在項目中,遇到了幾個自己不太清楚的SQL函數,總結一下,以後可能遇到:
1:FIND_IN_SET(str,strlist)
定義:
1. 假如字符串str在由N子鏈組成的字符串列表strlist中,則返回值的範圍在1到N之間。
2. 一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。
3. 如果第一個參數是一個常數字符串,而第二個是typeSET列,則FIND_IN_SET()函數被優化,使用比特計算。
4. 如果str不在strlist或strlist爲空字符串,則返回值爲0。
5. 如任意一個參數爲NULL,則返回值爲NULL。這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。
strlist:一個由英文逗號“,”鏈接的字符串,例如:"a,b,c,d",該字符串形式上類似於SET類型的值被逗號給鏈接起來。
示例:SELECT FIND_IN_SET('b','a,b,c,d'); //返回值爲2,即第2個值
一篇較詳細的文章:http://blog.sina.com.cn/s/blog_5b5460eb0100e5r9.html
https://www.cnblogs.com/mytzq/p/7090197.html
2:exist
EXISTS用於檢查子查詢是否至少會返回一行數據,該子查詢實際上並不返回任何數據,而是返回值True或False
EXISTS 指定一個子查詢,檢測 行 的存在。
EXISTS(包括 NOT EXISTS )子句的返回值是一個BOOL值。 EXISTS內部有一個子查詢語句(SELECT ... FROM...), 我將其稱爲EXIST的內查詢語句。其內查詢語句返回一個結果集。 EXISTS子句根據其內查詢語句的結果集空或者非空,返回一個布爾值。
一種通俗的可以理解爲:將外查詢表的每一行,代入內查詢作爲檢驗,如果內查詢返回的結果取非空值,則EXISTS子句返回TRUE,這一行行可作爲外查詢的結果行,否則不能作爲結果。
https://www.cnblogs.com/qlqwjy/p/8598091.html
3:MySQL教程之concat以及group_concat的用法 https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc
concat()函數
1、功能:將多個字符串連接成一個字符串。
2、語法:concat(str1, str2,...)
返回結果爲連接參數產生的字符串,如果有任何一個參數爲null,則返回值爲null。
3、舉例:
例1:select concat (id, name, score) as info from tt2;
中間有一行爲null是因爲tt2表中有一行的score值爲null。
例2:在例1的結果中三個字段id,name,score的組合沒有分隔符,我們可以加一個逗號作爲分隔符:
這樣看上去似乎順眼了許多~~
但是輸入sql語句麻煩了許多,三個字段需要輸入兩次逗號,如果10個字段,要輸入九次逗號...麻煩死了啦,有沒有什麼簡便方法呢?——於是可以指定參數之間的分隔符的concat_ws()來了!!!
二、concat_ws()函數
1、功能:和concat()一樣,將多個字符串連接成一個字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)
2、語法:concat_ws(separator, str1, str2, ...)
說明:第一個參數指定分隔符。需要注意的是分隔符不能爲null,如果爲null,則返回結果爲null。
3、舉例:
例3:我們使用concat_ws()將 分隔符指定爲逗號,達到與例2相同的效果:
例4:把分隔符指定爲null,結果全部變成了null:
三、group_concat()函數
前言:在有group by的查詢語句中,select指定的字段要麼就包含在group by語句的後面,作爲分組的依據,要麼就包含在聚合函數中。(有關group by的知識請戳:淺析SQL中Group By的使用)。
例5:
該例查詢了name相同的的人中最小的id。如果我們要查詢name相同的人的所有的id呢?
當然我們可以這樣查詢:
例6:
但是這樣同一個名字出現多次,看上去非常不直觀。有沒有更直觀的方法,既讓每個名字都只出現一次,又能夠顯示所有的名字相同的人的id呢?——使用group_concat()
1、功能:將group by產生的同一個分組中的值連接起來,返回一個字符串結果。
2、語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
說明:通過使用distinct可以排除重複值;如果希望對結果中的值進行排序,可以使用order by子句;separator是一個字符串值,缺省爲一個逗號。
3、舉例:
例7:使用group_concat()和group by顯示相同名字的人的id號:
例8:將上面的id號從大到小排序,且用'_'作爲分隔符:
例9:上面的查詢中顯示了以name分組的每組中所有的id。接下來我們要查詢以name分組的所有組的id和score:
4:時間函數 MySQL Date 函數 https://www.w3school.com.cn/sql/sql_dates.asp
函數 | 描述 |
---|---|
NOW() | 返回當前的日期和時間 |
CURDATE() | 返回當前的日期 |
CURTIME() | 返回當前的時間 |
DATE() | 提取日期或日期/時間表達式的日期部分 |
EXTRACT() | 返回日期/時間按的單獨部分 |
DATE_ADD() | 給日期添加指定的時間間隔 |
DATE_SUB() | 從日期減去指定的時間間隔 |
DATEDIFF() | 返回兩個日期之間的天數 |
DATE_FORMAT() | 用不同的格式顯示日期/時間 |