order by 和 group by 的區別:sql
1,order by 從英文裏理解就是行的排序方式,默認的爲升序。 order by 後面必須列出排序的字段名,能夠是多個字段名。app
2,group by 從英文裏理解就是分組。必須有「聚合函數」來配合才能使用,使用時至少須要一個分組標誌字段。函數
3,在使用group by的語句中,只能select用於分類的列(表達式),或聚合函數。where條件用於group by以前,having用於group by 以後對結果進行篩選。3d
擴展資料:code
1、order by用法: 排序查詢、asc升序、desc降序blog
示例:排序
1.select * from 學生表 get
2.order by 年齡 it
3.查詢學生表信息、按年齡的升序(默認、可缺省、從低到高)排列顯示也能夠多條件排序、 好比 order by 年齡,成績 desc io
4.按年齡升序排列後、再按成績降序排列。2、group by用法: 分組查詢、having 只能用於group by子句、做用於組內,having條件子句能夠直接跟函數表達式。使用group by 子句的查詢語句須要使用聚合函數。
示例:
1.select 學號,SUM(成績) from 選課表 group by 學號 按學號分組、查詢每一個學號的總成績
2.select 學號,AVG(成績) from 選課表
3.group by 學號
4.having AVG(成績)>(select AVG(成績) from 選課表 where 課程號='001')
5.order by AVG(成績) desc
6.查詢平均成績大於001課程平均成績的學號、並按平均成績的降序排列。
一、解釋不一樣
order by是SQL語句中的關鍵字,用於對查詢結果的排序。ORDER BY 語句用於對結果集進行排序,默認的爲升序。
group by語句從英文的字面意義上理解就是「根據(by)必定的規則進行分組(Group)」。它的做用是經過必定的規則將一個數據集劃分紅若干個小的區域,而後針對若干個小區域進行數據處理。
二、字段不一樣
order by是按字段排序,後面必須列出排序的字段名,能夠是多個字段名。
group by是按字段分類 ,必須有「聚合函數」來配合才能使用,使用時至少須要一個分組標誌字段。
三、sql命令格式優先順序不一樣
group By關鍵字先對指定的分組條件將篩選獲得的視圖進行分組,將分組視圖後不知足條件的記錄篩選掉。
order By語句最後對視圖進行排序,最終的結果就產生了。
擴展資料
order by和group by的用法示例
一、select * from 學生表 order by 年齡
查詢學生表信息、按年齡的升序(默認、可缺省、從低到高)排列顯示。
二、select 學號,SUM(成績) from 選課表 group by 學號
按學號分組、查詢每一個學號的總成績。
三、select 學號,AVG(成績) from 選課表 group by 學號 having AVG(成績)>(select AVG(成績) from 選課表 where 課程號='001') order by AVG(成績) desc
查詢平均成績大於001課程平均成績的學號、並按平均成績的降序排列。
常常見sql語句中order by 1或者order by 2...order by N,有時候很莫名其妙.其實1表示第一個欄位,2表示第二欄位; 依此類推,當表中只有2個欄位時,oder by 3就會出錯,這個跟order by 列名沒有什麼區別,不過在特殊狀況下仍是頗有用的.
例如table1(p_code int,issue_date datetime,issue_num int)
p_code issue_date issue_num
101 2016-12-01 00:00:00.000 45
102 2016-12-01 00:00:00.000 89
102 2016-12-03 00:00:00.000 44
103 2016-12-03 00:00:00.000 44
101 2016-12-02 00:00:00.000 44
101 2016-12-03 00:00:00.000 44
101 2016-12-03 00:00:00.000 45
101 2016-12-03 00:00:00.000 44
101 2016-12-03 00:00:00.000 44
102 2016-12-03 00:00:00.000 47
101 2016-12-03 00:00:00.000 48
104 2016-12-03 00:00:00.000 86
101 2016-12-03 00:00:00.000 56
101 2016-12-03 00:00:00.000 29
101 2016-12-11 00:00:00.000 11
我想獲取某個p_code過去(不含當天)10次的issue_num平均值,
可能咱們會這麼寫
select top 10 p_code, avg(issue_num) as avgissue from table1
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by issue_date desc
可是以上寫法是錯誤,的,會提示 Column "table1.issue_date" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.必需要求issue_date在group by中.
因此咱們改爲
select top 10 p_code, avg(issue_num) as avgissue from table1
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code,issue_date
order by issue_date desc
可是獲得的結果倒是(今天是2016.12.11)
p_code avgissue
101 44
101 44
101 45
顯然以上不是咱們想要的結果.
那麼該如何結果這種問題呢,固然你能夠再次進行avg()聚合運算,可是這裏咱們既然說oder by N,那麼就用這個知識來解決.
語句以下.
select top 10 p_code, avg(issue_num) as avgissue from table1
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by 2 desc
結果以下(今天是2016.12.11)
p_code avgissue
101 44
是否是很神奇呢!
固然做爲碼農,咱們儘可能用列名來解決,以便增長代碼的可讀性和易維護性.