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!