1. 程式人生 > >group by和order by的用法和區別

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:

  1. select * from s

  2. order by sname desc, sage desc

首先按照sname降序排序,然後出現了xx一樣的,在按照sage降序排序。(預設sage是升序)。

如果最開始使用sno排序,

  1. select * from s

  2. 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分的學生學號及課程數

  1. select sno , count(cno)

  2. from sc

  3. where grade > 60

  4. group by sno having count(cno) > 3