group by的作用,經典錯題例題有哪些!!!!!!!
總而言之,統計有學生選修的課程門數,統計有選修課程的學生人數這樣的統計查詢語句中,
''統計有學生選修的課程門數''中,課程是互不重復的;''統計有選修課程的學生人數"中,學生是互不重復的;
故而都要都因該哉在要統計的字段前加上distinct關鍵字以實現去重,格式如:select count(distinct 字段) .........
先放出4個練習題2333
這些問題中我們可以使用集函數也就是相關的統計類函數
導入:
- 如果我們想知道總用戶數怎么辦?
- 查詢誰是數據表里的首富怎么辦?
- 如果我們想知道用戶的平均金額怎么辦?
- 如果我們想知道所有用戶的總金額怎么辦?
統計類函數最常用的我們有5個:
1.查詢各門課程的選課人數
/*查詢各門課程的選課人數*/ select cno,count(*) from sc group by cno; select cno,count(sno) from sc group by cno; select cno,count(all cno)/*dbms默認情況下不去重復2333*/ from sc group by cno;
2.查詢選修了2門課程以上的學生的學號
3.
4.
select sno,count(*) as 課程數 from sc where sno between '1' and '4' group by sno having count(*)>=2 order by count(*) desc; /*單表查詢,以上*/
在這兒又有一個總結吶:
...
分組 group by
結果再過濾having
整體使用SQL,
我們現在將語句進行整合后,配合使用一次。整體的SQL語句配合使用的語法結構如下:
最終的語法總結如下:
5.
統計有學生選修的課程門數。
要統計的課程是互不重復的課程,因此要加去重關鍵字distinct修飾之,2333!
可能就是1個課程被選多次,所以我們要加一個去重關鍵字distinct
相關資料:
查詢單個字段不重復記錄 distinct
經過對比,distinct的作用很顯然的看出來嘍,2333!
統計選修課程的所有人數。
同理,每個人都是互不重復的,distinct因此就顯得必不可少了哉,2333!
/*統計有學生選修的課程門數*/ select count(distinct cno) from sc; /*統計有選課的人數*/ select count(distinct sno) from sc;
總而言之,統計有學生選修的課程門數,統計有選修課程的學生人數這樣的統計查詢語句中,
''統計有學生選修的課程門數''中,課程是互不重復的;''統計有選修課程的學生人數"中,學生是互不重復的;
故而都要都因該哉在要統計的字段前加上distinct關鍵字以實現去重,格式如:select count(distinct 字段) .........
6.
求選修1號課程的學生的平均年齡
這道題需要認認真真的細品一下和琢磨哦!我第一次做的時候忘記寫這個條件了:
這就是選修所自然對應的等值連接,也就是一定程度下的自然連接!!!!!!!!!!
要是不加的話,就成為笛卡爾積了
7.留下一道思考題:
后續再來研究這道題,溜溜溜啦!!!!!!
-----------------------
7.參考分析:
好吧,我完美中了這個查詢語句編寫的陷阱qwq!我對group by的使用還不是還不是還不是很清晰,這是我知識體系中的弱點和盲點軟肋!!!!!!!!!!!
因為查詢語句中有“每門的”這個修飾詞,如果沒有group by字段進行分組的話,它只會顯示一行,實現的效果也就只是“求學分為3的所有課程的學生平均成績”,很明顯,
這是沒有多大意義的!
“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行數據處理。
/*求學分為3的每門課程的學生平均成績*/
select avg(grade)
from sc,c
where sc.cno=c.cno and ccredit='3'
group by sc.cno;/*fail twice*/
這個查詢為社么會這么坑呀23333!
再簡化放松一下查詢的約束條件,look->查詢每門課程的學生平均成績,也許吧這個group by是很自然的
/*求每門課程的學生平均成績*/ select avg(grade) from sc group by cno;
再來一些擴展,記牢!奮斗!積累!思考實踐!沖鴨2333!
/*求每門課程的選課人數*/ select count(sno) from sc group by cno; /*求每門課程的選修學生中的最高分*/ select max(grade) from sc group by cno;
8.查詢年齡大於女學生平均年齡的男學生姓名和成績
/*查詢年齡大於女學生平均年齡的男學生姓名和年齡*/ select sname,sage from student where ssex='男' and sage>(select avg(sage) from sc where ssex='女');
比較運算符后面都是1個單一的值!
9.
/*檢索選修2號課程的學生中成績最高的學生的學號*/ select sno from sc where cno='2' and grade=(select max(grade) from sc where cno='2');
一些參考2333
好想我記得老師所得這個是什么相關子查詢啦嘞,回頭再來回顧一下哦2333!
10.
/*查詢選修4門以上課程的學生總成績(不統計不及格的課程),並要求按總成績的降序排列出來*/ select sno,sum(grade) from sc where grade>=60 and sno in (select sno from sc group by sno having count(sno)>4) group by sno order by sum(grade) desc;
這個題目查詢好cool呀,愛了愛了,2333!