group by和order by的用法和區別
一、order by的用法
使用order by,一般是用來,依照查詢結果的某一列(或多列)屬性,進行排序(升序:ASC;降序:DESC;預設為升序)。
當排序列含空值時:
ASC:排序列為空值的元組最後顯示。
DESC:排序列為空值的元組最先顯示。
為了好記憶,我的理解是,可以把null值看做無窮大,因為不知道具體為多少。然後去考慮排序,asc升序null肯定在最後,而desc降序,null肯定在最前面。(我的想法,輕噴。。。)
1》單一列屬性排序
舉例1:預設排序:
select * from s
select * from s order by sno desc
按照sno降序:
2》多個列屬性排序
選擇多個列屬性進行排序,然後排序的順序是,從左到右,依次排序。
如果前面列屬性有些是一樣的話,再按後面的列屬性排序。(前提一定要滿足前面的屬性排序,因為在前面的優先順序高)。
舉例2:
-
select * from s
-
order by sname desc, sage desc
首先按照sname降序排序,然後出現了xx一樣的,在按照sage降序排序。(預設sage是升序)。
如果最開始使用sno排序,
-
select * from s
-
order by sno desc, sage asc
必須先滿足前面列屬性的排序(sno在前優先順序高)。才會去考慮後續列屬性的排序。
二、group by的用法
group by按照查詢結果集中的某一列(或多列),進行分組,值相等的為一組。
1》細化集函式(count,sum,avg,max,min)的作用物件:
未對查詢結果分組,集函式將作用於整個查詢結果。
對查詢結果分組後,集函式將分別作用於每個組。
例子3:
求各個課程號及相應的選課人數:
SELECT cno,count(sno) from sc
對整個表進行count。
SELECT cno,count(sno) from sc group by cno
對分組的表進行count
sc表內容如下:
2》GROUP BY子句的作用物件是查詢的中間結果表
分組方法:按指定的一列或多列值分組,值相等的為一組。
使用GROUP BY子句後,SELECT子句的列名列表中只能出現分組屬性(比如:sno)和集函式(比如:count())。
select sno,count(cno) from sc group by sno
3》多個列屬性進行分組舉例:
select cno,grade,count(cno) from sc group by cno,grade
cno為1且成績為66的,有3個
4》使用HAVING短語篩選最終輸出結果
只有滿足HAVING短語指定條件的組才輸出。
HAVING短語與WHERE子句的區別:作用物件不同。
1》WHERE子句作用於基表或檢視,從中選擇滿足條件的元組。
2》HAVING短語作用於組,從中選擇滿足條件的組。
舉例:
查詢選修了3門以上課程的學生學號:
select sno from sc group by sno having count(cno)>3
舉例:
查詢選修了3門以上課程,且所有課程成績都高於60分的學生學號及課程數
-
select sno , count(cno)
-
from sc
-
where grade > 60
-
group by sno having count(cno) > 3