1. 程式人生 > >SQL基礎整理(三)關於聚合函式,分組,排序

SQL基礎整理(三)關於聚合函式,分組,排序

一.關於聚合函式

  • 首先常用的聚合函式有count,sum,avg,max,min 這些函式的功能不再贅述,只是有一些需要注意的地方
  • 注意事項:除了count(*)是對所有行進行統計之外,其餘的聚合函式再以列名做引數時,會把該列為NULL的排除在外,不會參與到計算當中
  • 注意事項:使用聚合函式刪除重複值時,distinct關鍵字需要寫在聚合函的引數內,列名之前

二.關於GROUP BY子句--切分表的一把刀

  • 首先根據單詞的意思進行理解就是根據什麼進行分組,更形象一些的理解就是對錶進行切分
  • 這裡需記住幾個注意事項:1.只能寫在select之中(意思是,只有在select語句中才會出現group by)    
    2.不能使用select子句中列的別名  3.聚合結果無效  4.where子句中不能使用聚合函式
  • group by(列名), 當語句中出現group by時,select需要注意的問題有,此時select語句能輸出的內容是列名,或者聚合函式,因為group by理解為是對錶進行分類統計,比如對十個人按照身高分類,那麼對於身高180的人來說,你偏要輸出他們的體重,那麼這些人的體重是不一樣的,是無法輸出的,所以只能輸出他們的身高,以及對這些人的其他屬性進行聚合
  • 聚合鍵含NULL的情況,把NULL單獨當做一個型別
  • 使用where子句時的執行順序:from-->where-->group by-->select 也就是DBMS會先通過where子句對行進行過濾再根據group by子句進行分組

常見錯誤:1.在select中輸出了聚合鍵外的列  2.在group by中使用了別名  3.在where中使用了聚合函式------只有select和having和order by子句中可以使用聚合函式

三.為聚合結果指定條件--想得到特定分組怎麼辦??

  • 這時候我們需要在group by 子句後使用having子句
  • 關於having子句的語法類似於where子句,這裡有一些需要注意的地方就是having子句更多的對分組進行過濾,他能夠給使用兩種要素:聚合函式和group by中指定的列名(聚合鍵)
  • 比如說,在group by(money),根據錢對資料進行分類,那麼你需要選擇出錢大於500的分組,那麼having應該寫成  having money >500

四.對查詢結果進行排序--order by

  • 如果表中有一列叫做學號,我們想讓查詢結果按照學號由小到大進行排序,需要寫成order by number asc,如果想按照從大到下的順序進行排序寫做 order by number desc,其中asc表示升序,desc表示降序,但是如果不寫的話是預設升序的
  • 對多個列進行排序,直接在order by 子句中書寫多個列名即可比如,先按照學號進行排序,學號相同時按照分數進行排序    寫做 order by number,grade
  • NULL的順序:order by的列中若值為空,則不參加排序,將該行放在結果的首部或者尾部進行顯示,具體是在首部還是在尾部根據DBMS的不同而不同
  • 可以在order by中使用別名原因是,from-->where-->group by-->having-->select-->order by,select的執行順序在order by 之前,也就是說,當你在order by中使用別名時已經知道了別名的存在,但是在group by中使用別名時還不知道別名的存在,所以不能在order by 中可以使用別名,但是在group by中不能使用別名