MySQL總結

原文鏈接:https://blog.csdn.net/weixin_41858337

近期在項目中,遇到了幾個自己不太清楚的SQL函數,總結一下,以後可能遇到:

1:FIND_IN_SET(str,strlist)

      定義

         1. 假如字符串str在由N子鏈組成的字符串列表strlist中,則返回值的範圍在1到N之間。

         2. 一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。

         3. 如果第一個參數是一個常數字符串,而第二個是typeSET列,則FIND_IN_SET()函數被優化,使用比特計算。

         4. 如果str不在strliststrlist爲空字符串,則返回值爲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() 用不同的格式顯示日期/時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章