sql分组查询

Posted 胡八一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql分组查询相关的知识,希望对你有一定的参考价值。

一、根据班级分类对不同的学生的各科成绩与总成绩进行校验。

首先数据表信息如下:

这里有三个学生,语文,数学,英语的成绩都是100,所以他们的总成绩是300,这里我们就是要根据班级分组然后验学科总成绩各学科成绩累加是否相等

首先按照学号与班级号进行分组,然后sum各科分数与去重的总分数求和

SELECT
	s_no,
	course_no,
	sum( score ) score,
	sum( DISTINCT total_score ) total_score 
FROM
	`stu` 
GROUP BY
	s_no,
	course_no

然后得到

根据观察得到班级号还要重复,然后再进行分组求和

SELECT
	sum( score ) score,
	sum( total_score ) total_score,
	course_no 
FROM
	( SELECT s_no, course_no, sum( score ) score, sum( DISTINCT total_score ) total_score FROM `stu` GROUP BY s_no, course_no ) t 
GROUP BY
	course_no

就会得到:

各科分数(score)与总分数(total_score)都是一样的说明是正确的。
现在修改王五的分数。

再执行


2班的各科分数(score)与总分数(total_score)不一样,说明2班的成绩有问题。

二、按专业成绩进行校验

如图所示,要校验专业总成绩和班级总成绩。

数据库表数据

首先对专业总成绩根据班级和学号,专业进行分组,然后去重总成绩,而班级总成绩按照班级号和专业分组然后去重即可。
求专业总成绩。

 SELECT sum( DISTINCT major_score ) major_score, major FROM stu GROUP BY major

然后分组求班级总成绩。

SELECT
		sum( class_score ) class_score,
		major 
	FROM
		( SELECT sum( DISTINCT class_score ) class_score, major, class_no FROM stu GROUP BY major, class_no ) tmp 
	GROUP BY
		major 

然后再进行连表。

SELECT
	t1.major_score,
	t2.class_score,
	t1.major 
FROM
	( SELECT sum( DISTINCT major_score ) major_score, major FROM stu GROUP BY major ) t1,
	(
	SELECT
		sum( class_score ) class_score,
		major 
	FROM
		( SELECT sum( DISTINCT class_score ) class_score, major, class_no FROM stu GROUP BY major, class_no ) tmp 
	GROUP BY
		major 
	) t2 
WHERE
	t1.major = t2.major


专业分数和班级分数和一致,说明数据没问题。

sql连接查询和分组查询

分组查询

分组查询语句:

SELECT …… FROM <表名> WHERE …… GROUP BY ……

eg:

SELECT COUNT(*) AS 人数, SGrade AS 年级 FROM Students GROUP BY SGrade

多列分组:

SELECT COUNT(*)........FROM 表名  COUNT BY 列名 ORDER BY   想要按照排列的列名

eg:

SELECT COUNT(*) AS 人数,SGrade AS 年级,SSex AS 性别 FROM StudentS GROUP BY SGrade,SSex ORDER BY SGrade

分组筛选语句:

语法:

SELECT …… FROM <表名> WHERE …… GROUP BY …… HAVING……

eg:

SELECT COUNT(*) AS 人数,SGrade AS 年级 FROM Students GROUP BY SGrade HAVING COUNT(*)>15

WHERE与HAVING对比:

WHERE子句 用来筛选 FROM 子句中指定的操作所产生的行 GROUP BY子句 用来分组 WHERE 子句的输出 HAVING子句 用来从分组的结果中筛选行

内连接(INNER  JOIN)

内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行

内连接语句:

SELECT …… FROM 表1 INNER JOIN 表2 ON ……

等价于

SELECT …… FROM 表1,表2 WHERE ……

eg:

SELECT Students.SName, Score.CourseID, Score.Score FROM Students,Score WHERE Students.SCode = Score.StudentID

左连接:(LEFT   JOIN)

eg:

SELECT S.SName,C.CourseID,C.Score FROM Students AS S LEFT JOIN Score AS C ON C.StudentID = S.SCode

右连接:(RIGHT  JOIN )

eg:

SELECT 图书编号,图书名称,出版社名称 FROM 图书表 RIGHT JOIN 出版社表 ON 图书表.出版社编号 = 出版社表.出版社编号

 

以上是关于sql分组查询的主要内容,如果未能解决你的问题,请参考以下文章

sql多表分组查询并排序的问题

sql 怎么先分组再查询每组中前三天数据?

SQL基础下(基于MySQL)

sql多条件分组查询,求sql语句。

mysql分组排序,取每组第一条数据

SQL学习笔记 ----Mysql数据库的条件查询