本章內容和大家分享的是數據當中的分組查詢。分組查詢復雜一點的是建立在多張表的查詢的基礎之上,(我們在上一節課的學習中已經給大家分享了多表查詢的使用技巧,大家可以自行訪問:多表查詢1 多表查詢2)而在實際項目中的分組查詢的使用也是比較多的,作為初學者來說,學好分組查詢的姿勢是十分有必要的!
分組查詢概念
什么是分組查詢:分組查詢是按照一定的規則進行分組,分組以后數據會聚合,需要使用聚合函數,但是使用聚合函數不一定要分組,分組的關鍵字是group by。
首先,我們先來思考一下下面的sql語句的正確性:
---1.select * from t_student group by sex;
---按照性別分組 男或者女 但是實際顯示的是所有性別,*是所有 所以會報錯,因為這種方式不是group by 表達式
查看結果:
---2.select sex from t_student; ---這種方式最后顯示的是所有的男女,也不是分組我們想要的 男 女 數據
查看結果:
---3.select t.studentid,t.sex from t_student t group by sex; --6條id數據對應2條數據 不是group by表達式
查詢結果:
---4.select sex from t_student group by sex; ---按照性別分組,只顯示性別沒有任何毛病--成功
查看結果:
我們看一下聚合函數的使用,聚合函數有count() sum() max() min() avg() round()
--聚合函數 count() ---統計 sum() ---求和 max() ---最大值 min() ---最小值 avg() ---平均值 round() ---四舍五入函數
下面小編給大家演示一下關於這些聚合函數的基礎操作,有助於我們后面的分組使用:
select max(age) from t_student; --求年齡的最大值 select count(studentid) from t_student; --求學生總數 select sum(studentid) from t_student; --所有學生id的和 select min(studentid) from t_student; --求學生id中的最小值 select avg(studentid) from t_student; --求學生id的平均值
再議聚合函數:
select sex,sum(age) from t_student group by sex; --以性別分組,顯示性別中的男女年齡的之和
查看結果:
select sex,count(studentid) from t_student group by sex; --以學生性別分組,顯示男生和女生分別有多少?
查看結果:
select sex,max(age) from t_student group by sex; --以性別分組,顯示男生中年齡最大的和女生中年齡最大的。
查看結果:
ok,我們通過上面的例子來繼續練習一下分組查詢。
--統計706班男生,女生人數?
select sex,count(t2.studentid) from t_class t1,t_student t2 where t1.classid=t2.classid and t1.classid=1 group by sex;
查詢結果:
--查詢826班男生、女生年齡的總和
select sex,sum(t2.age) from t_class t1,t_student t2 where t1.classid=t1.classid and t1.classid=3 group by sex;
查看結果:
--查詢每門課程的總分、最高分、最低分、平均分
--查詢每門課程的總分、最高分、最低分、平均分 select t1.coursename 課程名字,max(t2.score)最高分,min(t2.score)最低分,avg(t2.score)平均分 from t_course t1,t_score t2 where t1.courseid=t2.courseid group by t1.coursename;
查看結果:
--查詢826班每位學生每門課程的總分、平均分、最高分、最低分
select t3.coursename 課程名字,t2.name 學生姓名, sum(t4.score) 總分, avg(t4.score) 平均分, max(t4.score) 最高分, min(t4.score) 最低分 from t_class t1, t_student t2, t_course t3, t_score t4 where t1.classid = t2.classid and t2.studentid = t4.studentid and t4.courseid = t3.courseid and t1.classid = 3 group by t3.coursename,t2.name;
查看結果:
--查詢每個學員的總分、平均分、最高分、最低分,只顯示總分在250分以上的學員
敲筆記了哈:
1.where 使用在分組查詢之前,where后面不能使用聚合函數
2.having 分組之后的過濾,having 緊跟group by ,有having 一定有group by ,但是有group by 不一定有having
3.having 后面可以使用聚合函數
--顯示姓名
select t1.name 學生姓名, sum(t2.score) 總分, avg(t2.score) 平均分, max(t2.score) 最高分, min(t2.score) 最低分 from t_student t1, t_score t2 where t1.studentid = t2.studentid group by t1.name having sum(t2.score)>250;
查看結果:
另外的一種展示結果:
--不顯示性名 select sum(t2.score) 總分, avg(t2.score) 平均分, max(t2.score) 最高分, min(t2.score) 最低分 from t_student t1, t_score t2 where t1.studentid = t2.studentid group by t1.studentid having sum(t2.score) > 250;
查詢結果:
到此,分組查詢我們就介紹到這里了。。。