=================================================================================
情景再现:
前几天的学校数据库网课中,看到老师的示例代码中关于group by的分组表达式,其中group by的子句中出现多个条件,看的时候一直想不明白是什么原理,后来上网查资料看了很多大佬的代码、结果以及博客,最后终于弄懂了赶紧写篇博客来记录下自己所思考的过程,以便自己以后能回故和帮助遇到相同问题的兄弟。
他的题目是:
查询每门课程的最高分(课程号、课程名、最高成绩)。
首先附上两张表的内容:
—— 第一表是:xscj
——第二张表是:xskc
示例代码:
SELECT
xskc.C_ID, xskc.C_Name, MAX(xscj.S_Performance) AS MAX_Performance --要显示课程号、课程名、最高成绩
FROM
xskc, xscj --获取xskc和xscj两张表的内容
WHERE
xskc.C_ID = xscj.C_ID --匹配两张表中课程号一样的学生信息
GROUP BY
xskc.C_ID, xskc.C_Name --将C_ID与C_Name分成一组
结果:
Attention:这里我对成绩表中有的课程号经行了检索并没有利用外连接的方式对xskc表中的所有课程经行检索
=================================================================================
简单尝试:
首先举个简单的栗子来了解下group by的用法:
我们用的还是xscj这张表,利用以下代码来计算出每位同学所选修的有成绩的课程:
SELECT
S_ID, COUNT(C_ID) AS EC_Count --输出学号及记录其选修课程数
FROM
xscj --学生成绩表
GROUP BY
S_ID --对学生学号经行分组
我用画图的形式来解释一下:
Tip:
1、这里的序号为他的自动编号
2、每个黑色框内部为一个单元格
-
利用FROM语句获得xscj表中的所有信息
-
利用GROUP BY语句把S_ID数据相同的分为一组
利用 GROUP BY 语句将 S_ID 相同的数据分为一组,这里就从8条数据分组后变成了4条,而 S_ID 相同的其它数据就被分别放到了同一个单元格里,就像上图 C_ID、S_Performance 、Credit 所在列单元格所表示的那样。
Tip:因为所输出的一条信息的单元格内只能有一个数据,所以在利用 SELECT * 、SELECT C_ID 、SELECT S_Performance 、SELECT Credit 查询时就会报错。 -
最后利用 SELECT 语句输出 S_ID 和利用 COUNT( ) 聚合函数来或得每个分组中的课程数量
这里利用了COUNT( )聚合函数来得到C_ID单元格内课程的数量,并结合SELECT输出
=================================================================================
拓展使用:
现在根据上面那个简单尝试来对题目经行分析:
题目:查询每门课程的最高分(课程号、课程名、最高成绩)。
Tip:老师的这道题目我这用了高级查询的内连接WHERE写法
再在这把上面的代码粘贴一遍:
SELECT
xskc.C_ID, xskc.C_Name, MAX(xscj.S_Performance) AS MAX_Performance --显示课程号、课程名和每个课程的最高成绩
FROM
xskc, xscj --获取xskc和xscj两张表的内容
WHERE
xskc.C_ID = xscj.C_ID --匹配两张表中课程号一样的信息
GROUP BY
xscj.C_ID, xskc.C_Name --将C_ID与C_Name分成一组
分析:
-
首先我们只看FROM语句和WHERE语句来获取相应的数据,即得到xskc、xscj两张表中 C_ID(课程号) 一样的数据信息并保存在同一张表中。
Tip:图中蓝色框和紫色框中的内容为 xskc表和 xscj表中符合条件筛选下来的数据
-
之后利用GROUP BY语句对xskc中的 C_ID 与 C_Name 进行分组,8条数据就被分成了4条数据,效果如下:(这个表是画的是为了更好展示其内部分组时的样子,在实际显示中无法做到一个单元格里显示多个数据)
Tip:因为题目中要我得到每门课的最高分,并显示他的课程号、课程名、最高成绩,所以我将C_ID(课程号)和 C_Name(课程名)相同的数据分为一组,这样一条数据里就有相同课程号与课程名的成绩,即S_Performance(成绩)的一个单元格里有了所有学生的成绩,这样我就在下一步中利用MAX( )函数求出这个单元格中所有成绩的最大值。 -
最后才根据SELECT语句输出课程号、课程名、最高成绩( MAX(xscj.S_Performance ) ),结果如下:
!!!我这里是对 xskc表中的 C_ID (课程号)和 C_Name(课程名)两个列名进行的分组,如果只对课程号一个列名进行分组就会报错,原因是相同的课程号就一条数据,而课程名的一个单元格里却有好几条数据,SELECT语句输出就会报错,它一次性不能在一个单元格里显示多个数据
=============================================================================
小结:
SQL中的 GROUP BY 语句一般与HAVING、聚合函数MAX( )、MIN( )、AVG( )、COUNT( ) 结合使用更好的查询所需要的数据。
希望自己能够继续潜心学习,安安静静快快乐乐的。