mysql 很實用的函數(shù)解析

數(shù)據(jù)庫數(shù)據(jù):

CONCAT和CONCAT_WS:
#把信息用CONCAT連接
SELECT CONCAT (id, ',', username, ',', PASSWORD) AS info FROM my_test;
#使用CONCAT_WS,分割符連接,第一個不會加上,最后一個也不會加上!
SELECT CONCAT_WS(',', id,username,PASSWORD) AS info FROM my_test;
GROUP_CONCAT 和GROUP BY:
#group by 性別,名字和id會顯示不全,并且不能用select *
SELECT sex, id, username FROM my_test GROUP BY sex;
#GROUP_CONCAT解決上面的,按照性別分組后,想要選出這個性別下面的所有名字,可以采用這種方式:select要有sex  然后group by也是sex
#如果不用group by  只有n顯示男的!  一般都是結合使用
#注意:GROUP_CONCAT里面可以寫distinct  order by 這些,還可以決定使用哪種分隔符:username separator ';'
SELECT sex, GROUP_CONCAT(id) AS ids, GROUP_CONCAT(DISTINCT username) AS NAMES FROM my_test GROUP BY sex;

GROUP BY 結合聚合函數(shù):
  • group by 從英文里理解就是分組。必須有聚合函數(shù)來配合才能使用,使用時至少需要一個分組標志字段
    要不然沒有意義!除非分組的那個列對應數(shù)據(jù)剛好只有一個!
  • 當使用group by子句時則select中關于表的原始屬性名只能是被"by"的屬性,如上例中的SNO。若想輸出其他屬性列,則應在select子句后加上相應的聚合函數(shù)(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其實這也很容易理解,當參照SNO被分組后,每一個SNO的具體實例與其他任意一個屬性都變成一對一或一對多的關系,只有通過聚合函數(shù)將每組其他想要的屬性的多個實例算成一個值,即SNO與其形成一對一的關系后才能列出。而且一旦SQL語句中使用了group by子句后聚合函數(shù)都變成分別對每組起作用

順序:先執(zhí)行group by分組后再執(zhí)行聚合函數(shù)進行對應的計算

#統(tǒng)計博客種類數(shù)量
SELECT username,COUNT(username)  AS 數(shù)量 FROM my_test GROUP BY username 
#統(tǒng)計日期歸檔數(shù)量
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
#計算小王所有成績的的平均分
SELECT username,AVG(score)  AS 平均分 FROM my_test GROUP BY username


having和where的用法區(qū)別
  • where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),where條件中不能包含聚組函數(shù),使用where條件過濾出特定的行。

  • having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經常包含聚組函數(shù),使用having 條件過濾出特定的組,也可以使用多個分組標準進行分組。

  1. having只能用在group by之后,對分組后的結果進行篩選(即使用having的前提條件是分組)。
  2. where肯定在group by 之前。
  3. where后的條件表達式里不允許使用聚合函數(shù),而having可以。
    比如上面的數(shù)據(jù):
    SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
    如果要篩選出日期歸檔后 數(shù)量大于1的數(shù)據(jù):在group by后面加上HAVING COUNT(create_time)>1,
    一般來說這個having 后面的條件對應的就是前面選出來的字段基礎上加上條件
    SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 數(shù)量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m') HAVING COUNT(create_time)>1

當一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候,執(zhí)行順序和編寫順序是:
查詢選修了3門以上課程,且所有課程成績都高于60分的學生學號及課程數(shù)
select sno , count(cno),sum(grade) sum_grade
from sc
where grade > 60
group by sno having count(cno) > 3
order by sum_grade desc

1.執(zhí)行where xx對全表數(shù)據(jù)做篩選,返回第1個結果集。

2.針對第1個結果集使用group by分組,返回第2個結果集。

3.針對第2個結果集中的每1組數(shù)據(jù)執(zhí)行select xx,有幾組就執(zhí)行幾次,返回第3個結果集。

4.針對第3個結集執(zhí)行having xx進行篩選,返回第4個結果集。

5.針對第4個結果集排序order by。
一條SQL語句個子句的先后作用過程:
from→where→group by→select(含聚合函數(shù))→order by

時間分組格式化函數(shù)

按年月日分組:

  • DATE_FORMAT(create_time,'%Y%m') 也可以加上%Y年%m月
  • DATE_FORMAT(create_time,'%Y%m%d')
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ORACLE自學教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,255評論 0 0
  • 最近打算采用關系型數(shù)據(jù)庫來理一下公司的運營數(shù)據(jù),先拿點東西練手找感覺。下面是幾個關于學生課業(yè)的表,需要建立一個數(shù)據(jù)...
    九天朱雀閱讀 1,047評論 0 3
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,932評論 0 13
  • 花了3天時間學習MySql,考了個二級MySql 書籍參考:高等教育出版社《全國計算機等級考試二級教程-MySQL...
    如果仲有聽日閱讀 1,371評論 4 4
  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,337評論 0 7

友情鏈接更多精彩內容