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!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-03-11 12:31  龙龙666666  阅读(1207)  评论(5编辑  收藏  举报