成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫中group by的用法實例

數據庫 MySQL
前段時間面試的時候碰到這樣一個面試題,因為很久沒接觸sql竟然沒寫出來。

前段時間面試的時候碰到這樣一個面試題,因為很久沒接觸sql竟然沒寫出來。

如圖有這樣一張成績表:

首先要理解group by 含義:“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”劃分成若干個“小區域”,然后針對若干個“小區域”進行數據處理。

先來看這樣一條sql語句:select  subject,max(score) from grade GROUP BY subject

結果是:

這樣正確的得出了每一科的最高分以及科目的名稱。那是不是再在后面加個name就可以得出對應的學生的名字呢?我們可以試試:select  subject,max(score),name from grade GROUP BY subject

一看有結果以為成功了,但是對比數據后發現是錯的,學生姓名和分數沒對應上。如果你認為是成功的是因為對group by理解的不夠,我也不知道這樣查詢為什么能出來結果,我使用的mysql數據庫,如果是oracle的話就會報錯。

注意:因為在select指定的字段要么就要包含在Group By語句的后面,作為分組的依據;要么就要被包含在聚合函數中。

所以這樣是錯誤的。

group by語句中select指定的字段必須是“分組依據字段”,其他字段若想出現在select中則必須包含在聚合函數中,常見的聚合函數如下表:

函數 作用 支持性
sum(列名) 求和  
max(列名) 最大值  
min(列名) 最小值  
avg(列名) 平均值  
first(列名) 第一條記錄 僅Access支持
last(列名) 最后一條記錄 僅Access支持
count(列名) 統計記錄數 注意和count(*)的區別

我們還是分析要求,通過要求來寫sql語句。

這里提供幾種方法:

我們已經通過group by分組來獲得每一科的最高分以及科目名稱,把它作為第一句sql,,然后再查詢一下score表,找到學科和分數都相同的記錄:(子sql語句作為主sql語句的一部分)

#a.* 表示a表中所有的字段,b.*表示b表中所有的字段

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

結果如下:

對比發現數據是對的。

拓展問法:用一句SQL查出所有課程成績最高和最低的學生及其分數。

首先,通過分組獲得每個學科的最高分以及最低分:

select  subject,max(score),MIN(score) from grade GROUP BY subject

結果如下:

那我們如何把最高分對應的學生名字和最低分對應的名字放入呢,而且要求的數據展示是最高分一行,最低分一行。所以這樣行不通。

通過上面的第一個問題得出的思路:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

這樣既然能得到每個學科的最高分,學生名字,學科名,那同樣把max(score)改成min(score)不就可以獲得最低分,學生名字,學科名字了嗎?現在重點是如何把兩條sql語句查詢出來的結果整合到一起。

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

此時想到了sql的關鍵字 :    UNION的定義

UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。

請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。另外,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 語句中的列名。

所以得出的sql是這樣的:

select b.* from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score UNION

select b.* from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

得出的結果是:

這樣就ok了。如果還想添加一些東西。例如添加一列說明這個分數是最低分或者最高分。

select b.*,"最高分" from (select subject,max(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score 

UNION

select b.*,"最低分" from (select subject,min(score) m from grade GROUP BY subject) t,grade b where t.subject=b.subject and t.m=b.score

 

 

責任編輯:龐桂玉 來源: 田林家園
相關推薦

2011-07-20 14:57:47

SQLite數據庫ORDER BYGROUP BY

2011-08-03 13:11:10

Oracle數據庫序列

2009-12-31 11:10:01

2009-04-07 13:42:41

OracleStatspack診斷

2011-03-25 09:37:17

2010-04-14 15:45:49

Oracle 數據庫

2010-04-06 11:30:09

Oracle 數據庫

2010-05-12 18:41:34

MySQL數據庫

2020-01-03 08:10:41

MySQL數據庫累積聚合

2011-06-29 14:01:30

多數據庫實例效率

2010-05-11 10:12:50

mysql數據庫sql

2010-07-15 14:46:20

SQL Server數

2011-04-01 12:58:46

ASPACCESS數據庫

2010-04-01 09:45:38

NoSQL

2011-05-19 13:25:14

Oracle數據庫

2011-06-21 15:11:04

QT 數據庫

2010-11-29 11:47:26

連接Sybase數據庫

2011-05-26 15:27:08

Oracle數據庫

2011-08-16 18:55:10

Oracle數據庫構造過程

2011-08-22 12:01:36

SQL Server代碼優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费视频观看视频 | 亚洲精品一区二区三区蜜桃久 | 日本黄色短片 | 在线 丝袜 欧美 日韩 制服 | 国产日韩中文字幕 | 欧美视频在线播放 | v亚洲| 精品一区二区三区免费毛片 | 最新日韩在线 | 精品久久精品 | 特级毛片 | 久久日韩精品一区二区三区 | 午夜免费视频 | 欧美xxxx网站 | 久久久久中文字幕 | 99久久婷婷国产综合精品电影 | 91麻豆精品一区二区三区 | 欧美在线视频一区二区 | 色99视频| 亚洲一区二区在线电影 | 99综合| 中文字幕伊人 | 天天看天天操 | 人人澡人人射 | v片网站| 亚洲第一色站 | 日韩欧美在线观看 | 激情视频一区 | 日韩三级电影一区二区 | 午夜影视免费片在线观看 | 国产精品夜夜夜一区二区三区尤 | 精品自拍视频 | 人人九九精 | 一区二区三区免费在线观看 | 精品久久久久久久久久 | 国产线视频精品免费观看视频 | 一区二区精品 | 日日骚网| 夜夜骚视频 | 涩涩鲁亚洲精品一区二区 | 欧区一欧区二欧区三免费 |