mysql筆記:5個集函數使用


 

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!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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