sql中order by和group by的區別


order by 和 group by 的區別:

1,order by 從英文里理解就是行的排序方式,默認的為升序。 order by 后面必須列出排序的字段名,可以是多個字段名。

2,group by 從英文里理解就是分組。必須有“聚合函數”來配合才能使用,使用時至少需要一個分組標志字段。

3,在使用group by的語句中,只能select用於分類的列(表達式),或聚合函數。where條件用於group by之前,having用於group by 之后對結果進行篩選。

 

擴展資料:

一、order by用法: 排序查詢、asc升序、desc降序

示例:

1.select * from 學生表 

2.order by 年齡    

3.查詢學生表信息、按年齡的升序(默認、可缺省、從低到高)排列顯示也可以多條件排序、 比如 order by 年齡,成績 desc    

4.按年齡升序排列后、再按成績降序排列。二、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課程平均成績的學號、並按平均成績的降序排列。

 

1、解釋不同

order by是SQL語句中的關鍵字,用於對查詢結果的排序。ORDER BY 語句用於對結果集進行排序,默認的為升序。

group by語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個數據集划分成若干個小的區域,然后針對若干個小區域進行數據處理。

2、字段不同

order by是按字段排序,后面必須列出排序的字段名,可以是多個字段名。

group by是按字段分類 ,必須有“聚合函數”來配合才能使用,使用時至少需要一個分組標志字段。 

3、sql命令格式優先順序不同

group By關鍵字先對指定的分組條件將篩選得到的視圖進行分組,將分組視圖后不滿足條件的記錄篩選掉。

order By語句最后對視圖進行排序,最終的結果就產生了。

擴展資料

order by和group by的用法示例

1、select * from 學生表 order by 年齡    

查詢學生表信息、按年齡的升序(默認、可缺省、從低到高)排列顯示。

2、select 學號,SUM(成績) from 選課表 group by 學號  

按學號分組、查詢每個學號的總成績。

3、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


是不是很神奇呢!

當然作為碼農,我們盡量用列名來解決,以便增加代碼的可讀性和易維護性.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM