分组查询group by和having的使用作用

  • 作者:村长
  • 发布时间:2020-04-18 19:00
  • 分类:SQL Server
  • 标签: group by,having
-- 问:如果需要对学生表中的年级ID进行分组求每个年级有多少学生,
-- 这时应该怎么实现查询呢?

-- 如何求每个年级有多少人?
-- 如果没有分组的话? -- 就只能够下面这样写:
-- 12人
select count(*) as '一年级总人数' from student where gradeId = 1;
-- 6人
select count(*) as '二年级总人数' from student where gradeId = 2;
-- 3人
select count(*) as '三年级总人数' from student where gradeId = 3;
-- 21个人 (把三个年级的人数 都算一起) 单个年级求 (这个求的是1,2,3年级的总人数 ×)
select count(*) as '三年级总人数' from student where gradeId in(1,2,3)

-- 直接一条SQL出来,就知道每个年级有多少人? =》 就需要用到分组了 
-- 分组:group by 字段 (group:组、集团) by (经、由)
select gradeId as '年级',count(*) as '总人数' from student group by gradeId;

-- 再演示一个给你们看 :
select * from score

-- 如何对每个科目求【平均分】?
select courseID as '课程ID',avg(score) as '平均分' from score group by courseID
order by avg(score) asc;
-- 学校教务系统 成绩排分的时候,就是用到的分组(我以前教务系统有这个功能)

-- 如果没有分组的时候,就只能单条单条的SQL 查
select courseID as '课程ID',avg(score) as '平均分' from score where courseID = 1;


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

-- (2)如果我想筛选出 总分大于200分的同学有哪些,怎么写?  
-- 对【分组过滤】的时候,只能使用having 不能使用 where 
where score > 200 -- 这样写的意思是说,对列的值大于200的才算进来求总分
-- 如果是对列的条件过滤,就使用where ; 如果是对聚合函数的结果分组过滤,就需要用到having
select studentNo as '学生编号',sum(score) as '总分' from score 
 group by studentNo having sum(score) > 200
 
-- 查询【每门课程】的【平均分】,并且【筛选出】【平均分】大于50数据
-- 能理解吗?
select courseID as '课程ID',avg(score) as '平均分' from score group by courseID
having avg(score) > 50 order by avg(score) desc;

-- (3)查询学生表,筛选出班级总人数大于3的【班级】。
-- 空格取别名 (写完就还给我了)
select gradeId '班级',count(*) as '班级总人数' from student group by gradeId 
having count(*) > 3

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


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

手册下载

    暂无手册

编程资料

    暂无资料
TOP
加载中...