
首先详细讲一下group by :
概述:“group by” 就是根据“by”指定的规则对数据进行分组,所谓分组就是将一个“数据集”划分成若个个“小区域”,然后针对若干个“小区域”进行数据处理
group by 与聚合函数 使用的比较多
group by 语句中SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包括在聚合函数中,常见的聚合函数如下表:

-- 当表的数据量大的时候,
后面是练习题:
我们要用到4张表
- --1.学⽣表
- Student(SId,Sname,Sage,Ssex)
- --SId 学⽣编号,Sname 学⽣姓名,Sage 出⽣年⽉,Ssex 学⽣性别
- --2.课程表
- Course(CId,Cname,TId)
- --CId 课程编号,Cname 课程名称,TId 教师编号
- --3.教师表
- Teacher(TId,Tname)
- --TId 教师编号,Tname 教师姓名
- --4.成绩表
- SC(SId,CId,score)
- --SId 学⽣编号,CId 课程编号,score 分数
- -- 数据SQL
- -- 学⽣表 Student
- create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex
- varchar(10));
- insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
- insert into Student values('02' , '钱电' , '1990-12-21' , '男');
- insert into Student values('03' , '孙⻛' , '1990-12-20' , '男');
- insert into Student values('04' , '李云' , '1990-12-06' , '男');
- insert into Student values('05' , '周梅' , '1991-12-01' , '⼥');
- insert into Student values('06' , '吴兰' , '1992-01-01' , '⼥');
- insert into Student values('07' , '郑⽵' , '1989-01-01' , '⼥');
- insert into Student values('09' , '张三' , '2017-12-20' , '⼥');
- insert into Student values('10' , '李四' , '2017-12-25' , '⼥');
- insert into Student values('11' , '李四' , '2012-06-06' , '⼥');
- insert into Student values('12' , '赵六' , '2013-06-13' , '⼥');
- insert into Student values('13' , '孙七' , '2014-06-01' , '⼥');
- -- 科⽬表 Course
- create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
- insert into Course values('01' , '语⽂' , '02');
- insert into Course values('02' , '数学' , '01');
- insert into Course values('03' , '英语' , '03');
- -- 教师表 Teacher
- create table Teacher(TId varchar(10),Tname varchar(10));
- insert into Teacher values('01' , '张三');
- insert into Teacher values('02' , '李四');
- insert into Teacher values('03' , '王五');
- -- 成绩表 SC
- create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
- insert into SC values('01' , '01' , 80);
- insert into SC values('01' , '02' , 90);
- insert into SC values('01' , '03' , 99);
- insert into SC values('02' , '01' , 70);
- insert into SC values('02' , '02' , 60);
- insert into SC values('02' , '03' , 80);
- insert into SC values('03' , '01' , 80);
- insert into SC values('03' , '02' , 80);
- insert into SC values('03' , '03' , 80);
- insert into SC values('04' , '01' , 50);
- insert into SC values('04' , '02' , 30);
- insert into SC values('04' , '03' , 20);
- insert into SC values('05' , '01' , 76);
- insert into SC values('05' , '02' , 87);
- insert into SC values('06' , '01' , 31);
- insert into SC values('06' , '03' , 34);
- insert into SC values('07' , '02' , 89);
- insert into SC values('07' , '03' , 98);
- #. 查询报物理课程的学生人数
-
- SELECT count(*) from student as stu right JOIN
- (SELECT studentNo from result where subjectNo=1 )t ON stu.studentNo = t.studentNo;
-
- #.查询男生、女生人数
- SELECT count(1) from student where sex ='男'
- union
- SELECT count(1) from student where sex ='女'
-
- #. 查询至少有一门课与"袋鼠"同学所学相同的同学的信息
-
- SELECT * from student where studentNo in (
- SELECT DISTINCT studentNo from result where subjectNo = (SELECT DISTINCT subjectNo from result where result.studentNo =(
- SELECT stu.studentNo from student stu where stu.studentName ='袋鼠'
- )));
-
- #.查询每个科目最高分的学生(无最高分的并列情况)
-
- SELECT * from student RIGHT JOIN(
- SELECT subjectNo,max(res.studentResule) from result res GROUP BY subjectNo)t ON student.studentNo = t.subjectNo;
注意:因为在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中,常见的聚合函数如下表:
| 函数 | 作用 | 支持性 |
|---|---|---|
| sum(列名) | 求和 | |
| max(列名) | 最大值 | |
| min(列名) | 最小值 | |
| avg(列名) | 平均值 | |
| first(列名) | 第一条记录 | 仅Access支持 |
| last(列名) | 最后一条记录 | 仅Access支持 |
| count(列名) | 统计记录数 | 注意和count(*)的区别 |
文章存在不足的地方 欢迎指出。