一、分组查询:用于统计时经常使用分组查询
1、group by分组
01.例如查询每个年级的总人数
--一旦通过group by分组,那么我们只能获取组相关的信息,而不能获取组中成员的信息
--在select后只能跟聚合函数和group by后面的列,其他列不允许
1 select gradeid as 年级编号,COUNT(studentno) as 总人数 2 from student 3 group by gradeid
聚合函数:
sum()--count()--max() min()--avg()
2、多列分组
01.每个年级的男生总人数,,以及女生总人数
1 select gradeid as 年级编号,gender as 性别,COUNT(studentno) as 总人数 2 from student 3 group by GradeId,Gender 4 order by GradeId,Gender
3、Having的使用
01.如何查询每门课程的平均分和执行顺序
1 select SubjectId as 课程编号,AVG(studentresult) as 平均分 --05.投影结果 2 from Result --01。定位到表 3 where SubjectId<3 --, --02.分组前第一道过滤 4 group by SubjectId --03.分组 5 having COUNT(studentno)>3 --04.分组后第二道过滤 6 order by 课程编号 desc --06.最后排序
02获取总人数超过3人的年级编号及人数
1 select gradeid as 年级编号,COUNT(studentno) as 总人数 2 from student 3 group by GradeId 4 having COUNT(studentno)>3
注意:
having是对分组后的数据进行第二次筛选或者过滤,也就是说没有group by就没having
where之后不能有聚合函数
二、连接查询
连接分三种:内连接,外连接,交叉连接
1、内联结
--A和B两张表,A和B必须有公共字段
--输出每个学员的姓名和成绩
--实现方式二:where
1 select studentname as 姓名,studentresult as 成绩,subjectname as 科目,Gradename as 年级 2 from student,Result,Subject,Grade 3 where student.StudentNo=Result.StudentNo 4 and Result.SubjectId=Subject.SubjectId 5 and student.GradeId=Grade.GradeId
--实现方式一:inner join on
1 select studentname as 姓名,studentresult as 成绩,subjectname as 科目 2 from Result inner join student 3 on student.StudentNo=Result.StudentNo 4 inner join Subject 5 on Result.SubjectId=Subject.SubjectId
2、外联结
--外连接特点
--对于左外连接:左边的表叫主表,查询结果会显示左表和右表中公共字段相匹配的
--结果(内连接)外,还会将左表中在右表中找不到匹配项的记录用null值填充
--检索所有学员的成绩,如果某个学员没有参加考试,课程及成绩用NULL值代替
1 select studentName,studentresult,subjectname 2 from student inner join result 3 on student.studentNo=result.studentNo 4 inner join subject 5 on result.subjectid=subject.subjectid 6 where subjectname='走进Java编程世界'