数据库中为什么需要分组?

  • 作者:村长
  • 发布时间:2020-04-18 19:00
  • 分类:SQL Server
  • 标签: 分组,having,group by

看下这样一种场景:

-- 如果需要对学生表中的年级ID进行分组求每个年级有多少学生,
-- 这时应该怎么实现查询呢?

select * from student;
-- 我想知道每个年级有多少学生,怎么查询?
-- 这么写就没办法分开:一年级有多少?二年级有多少?
select count(gradeId) from student -- 这样写就是求全部年级的总和了

-- 一年级总人数:12
select count(Gradeid) from student where gradeid=1

-- 二年级呢?6
select count(Gradeid) from student where gradeid=2

-- 三年级:3
select count(Gradeid) from student where gradeid=3

-- in(1,2,3):21个 (1年级+2年级+3年级)=》不能区分开每个年级有多少人
select count(Gradeid) from student where gradeid in(1,2,3)

-- 一年级到六年级 ==》是不是写6条才可以查完 (这样写6条SQL 就很麻烦)
select COUNT(*) as '' from student where courseID=1

-- 引入概念:分组  group by 字段(group:组、集团)  by(经、由)  对哪个字段进行分组

-- 分组查询
select gradeId as '年级ID',count(Gradeid) as '年级总人数' 
from student group by gradeId

-- 举个例子:求【每个】同学的平均分
-- 没有分组前求的话:(这么写 =》 太多SQL 改起来麻烦)
select avg(score) from score where studentNo = 1;
select avg(score) from score where studentNo = 2;
select avg(score) from score where studentNo = 3;

-- 分组解决了单个求的麻烦:
select studentNo as '学生编号',avg(score) '平均分' from score group by studentNo

-- 作业:
/*
(1)对成绩表中的学生编号分组,求每个学生的成绩总分是多少
(2)查询学生表,筛选出班级总人数大于3的班级。
(3)查询每门课程的平均分,并且筛选出平均分大于70数据,并按平均分降序排序。

*/
-- (1)对成绩表中的【学生编号】分组,求每个学生的【成绩总分】是多少
select studentNo as '学生编号',sum(score) as '成绩总分' from score group by studentNo

--(2)查询学生表,【筛选】出班级【总人数】【大于3】的年级。
-- count(*) => 求的是查询出来的总记录数
select  gradeId as '年级ID',count(*) as '班级总人数' from student group by gradeId >=3

-- 怎么过滤 班级总人数小于3的记录?
select count(*) from student group by where gradeID >= 3

select gradeId as '年级ID',count(*) as '总人数' 
from student where gradeId >= 3 group by gradeId;

-- 其实给你们挖了个坑 ==》 引出一个东西 叫做 对组过滤(having)【现在的东西解决不了这个问题 就出新的】
-- 为什么不是用where 
select  gradeId as '年级ID',count(*) as '班级总人数' from student group by gradeId
having count(gradeId) > 3;

-- (1)where是对【记录】进行一个过滤; having是对组的过滤
-- (2)where是不能和聚合函数使用的,having是可以和聚合函数使用的
select * from student where studentNo = 1;

-- 那么什么是having? having 

--(3)查询【每门课程】的平均分,并且【筛选】出【平均分】大于70数据,并按【平均分】【降序】排序。
-- where和组 还是可以用的 
select courseId as '课程ID',avg(score) as '平均分' 
from score group by courseId having avg(score) > 70
order by avg(score) desc;


  • php程序员面试笔试宝典
琉忆编程库

手册下载

    暂无手册

编程资料

    暂无资料
TOP
加载中...