【SQL】通俗易懂透过GROUP BY,理解SQL子句优先级

1. 引言

在学习GROUP BY子句时,可能难理解它到底在干嘛,仅仅知道是对数据分组,想深入思考时又觉得迷迷糊糊,它如何影响查询结果?它和SELECT的关系是什么?这里需要引入sql子句的优先级。每经过一级,会产生新的虚拟表,为最终SELECT筛选提供数据

2. 英语复合句与SQL查询语句

sql语法与英语复合句的语法及其相似,对句子结构的理解影响对整句句意的理解

(值得一提的是,我们称group by"子句",英语的复合句里有各种“从句”。但是在湾湾地区的英语文法里,他们就把“从句”称为“子句”,像主词子句、受词子句等,这与sql“子句”的称呼不谋而合)

3. 优先级

使用中不难发现,SQL查询语句的优先级应该是这样的:

FROM, WHERE > GROUP BY, HAVING > ORDER BY > SELECT

查询时,每经过一级,原表受到各种限定后,新表总是越来越小,数据越来越接近我们想要的结果

3.1 第一级 FROM, WHERE

虽然FROM和WHERE是两个独立的关键字,但是他们应同属于第一级

FROM是主语,WHERE是形容词

FROM

为整个查询语句提供了原数据,数据量在这里是最大的,还没有经历过修剪✂️

WHERE

为原数据提供了简单的处理,涉及到

  1. 比较:=, >, <, >=, <=, !=, <>, !>, !<, NOT+
  2. 范围确定:BETWEEN AND, NOT BETWEEN AND
  3. 确定集合:IN, NOT IN
  4. 字符匹配:LIKE, NOT LIKE
  5. 空值:IS NULL, IS NNOT NULL
  6. 逻辑运算:AND, OR, NOT

经过WHERE处理后,数据量有所减少,以便进行下一步操作

3.2 第二级 GROUP BY, HAVING

GROUP BY与HAVING的关系,同FROM与WHERE的关系

FROM是主词,WHERE是形容词

GROUP BY使SQL可以批量处理上一步得到的数据,再经HAVING进行简单处理

GROUP BY

GROUP BY xxx使在xxx属性上,相同值的元组聚集在一起

FROM Students GROUP by Major

将各相同专业的学生分成一组(如:计科一组、生物一组、化学一组等)

方便之后对数据更准确的批量处理,如:获取各专业的人数(COUNT(*))、获取专业平均分(AVG(Grade))等

HAVING

HAVING同WHERE,处理分组后的数据,使数据再精确化,得到查询结果最优解

3.3 第三级 ORDER BY

数据的筛选在第二阶段完成时结束了,ORDER BY更多的是整理数据

当然整理结果也能作为之后操作(如果后面还要手动处理 或 嵌套查询还有外层等的话)的源

3.4 第四级 SELECT

终于到了末尾,SELECT接收到的源,是筛选整理后的最终表

这个表,已经比最开始FROM从库中获取的表要小很多,精简很多了

SELECT会控制哪些数据被显示出来,例如

// 显示全部属性
SELECT *

// 显示学号、学生姓名
SELECT Sno, Sname

4. 总结

  1. 经过整理各子句优先级,发现GROUP BY的意义在于,使初步筛选的数据,再按指定属性,相同的绑在一起,方便更准确的批量操作(通过HAVING)

  2. 以及读写SQL语句最好的顺序是,以优先级从高到低进行读写为主,再稍考虑细节

  3. 通过SELECT显示的属性,在有GROUP BY子句时,以执行GROUP BY子句后得到的表的属性含义一致!!不是FROM那里的!!!

❌而我之前搞不清GROUP BY的地方,可能是我潜意识把最熟悉的SELECT, FROM, WHERE先放在一起计算,再讲结果带到GROUP BY中分组,(逃

5. 示例

题目:查询平均成绩大于等于90分的学生学号和平均成绩

/* 表结构为
 * 学生课程成绩表(学号, 姓名, 课程名, 成绩)
 * 阅读从1开始
 */
SELECT 学号, AVG(成绩) // 4. 将学号、再次计算出的平均分显示出来,且这里的”学号“”成绩“属性是经过GROUP BY, HAVING子句得到的表里的
FROM 学生课程成绩表 // 1. 先看FROM,这里获取源表
GROUP BY 学号 // 2. 学号相同为一组,含义:一个学生上的所有课程的成绩跟随学号放在一起
HAVING AVG(成绩)> = 90; // 3. 仅留下平均成绩大于90的学生的相关项

正确读法已经标记在源码上,❌我以前的想法可能是1423

发布了10 篇原创文章 · 获赞 34 · 访问量 606

猜你喜欢

转载自blog.csdn.net/qq_33973359/article/details/105420603