当前位置: 首页 > news >正文

01-SQL 语句的关键字顺序

目录

1. 先有个小表,方便脑补画面

2. 目标:查出“总销售额 > 1000 的销售人员”

3. 执行顺序到底是怎么走的?

3.1 WHERE 到底在干嘛?——“挑行”

3.2 GROUP BY 在干嘛?——“把行捏成组”

3.3 HAVING 在干嘛?——“挑组”

4. 为什么 HAVING 里可以用 SUM(),而 WHERE 里不行?

5. 再用一句特别土但好记的话总结一下


WHERE 针对“行”,在分组前过滤;
HAVING 针对“组”,在 GROUP BY 之后过滤。

拆成两句:

  • WHERE:先从原始表里挑行。

  • HAVING:再从分好组后的“每一组结果”里挑组。


1. 先有个小表,方便脑补画面

假设有一张表 sales(订单表):

idselleramount
1A100
2A900
3B500
4B600
5C-50

含义:

  • seller:销售人员

  • amount:订单金额(有可能是负的,比如退款)


2. 目标:查出“总销售额 > 1000 的销售人员”

我们想写一条 SQL:

找到每个销售 seller总销售额
然后只保留“总额 > 1000 的人”。

这时候,一般会这样写:

SELECT seller, SUM(amount) AS total
FROM sales
WHERE amount > 0
GROUP BY seller
HAVING SUM(amount) > 1000
ORDER BY total DESC;

这条 SQL 里就包含了你说的那些关键字:
SELECT + FROM + WHERE + GROUP BY + HAVING + ORDER BY


3. 执行顺序到底是怎么走的?

虽然你是“从上往下写”,
但数据库执行的逻辑顺序大概是这样(简化版):

  1. FROM:拿到原始表 sales

  2. WHERE:在 原始行 上进行过滤

  3. GROUP BY:把剩下的行按 seller 分组

  4. HAVING:在 每一组 上过滤

  5. SELECT:算出你要的列(比如 SUM(amount)

  6. ORDER BY:对结果排序

  7. LIMIT:截取前几条(如果有)

3.1 WHERE 到底在干嘛?——“挑行”

看这一句:

WHERE amount > 0

它的意思就是:

只保留 amount > 0 的行,其他行先丢掉。

对我们的 sales 表来说:

原始数据:

idselleramount
1A100
2A900
3B500
4B600
5C-50

经过 WHERE amount > 0 之后,“逐行检查”:

  • 行 1:100 > 0 ✅ 留

  • 行 2:900 > 0 ✅ 留

  • 行 3:500 > 0 ✅ 留

  • 行 4:600 > 0 ✅ 留

  • 行 5:-50 > 0 ❌ 丢

过滤之后只剩:

idselleramount
1A100
2A900
3B500
4B600

这里你注意:还没有分组,只有行
所以说:WHERE 是“针对行”过滤,在分组之前。


3.2 GROUP BY 在干嘛?——“把行捏成组”

然后来到:

GROUP BY seller

现在把剩下的行按 seller 分组:

  • 组 A:行 1(100)、行 2(900)

  • 组 B:行 3(500)、行 4(600)

每个组里有好几行,接下来我们就可以对“组”做统计,比如 SUM(amount)


3.3 HAVING 在干嘛?——“挑组”

HAVING SUM(amount) > 1000

这就不是在看“单独某一行”了,而是在看“一个组的汇总结果”。

  • 对 A 组:

    • SUM(amount) = 100 + 900 = 1000 → 不大于 1000 ❌ 丢掉

  • 对 B 组:

    • SUM(amount) = 500 + 600 = 1100 → > 1000 ✅ 保留

所以最后只剩下 B 组(seller = 'B')。

这就解释了那句关键话:

WHERE 针对行,在分组前过滤;
HAVING 针对组,在 GROUP BY 之后过滤。

  • WHERE 看的是:原始表中的每一行

  • HAVING 看的是:每个分组(GROUP BY 后)的统计结果


4. 为什么 HAVING 里可以用 SUM(),而 WHERE 里不行?

试想一下,如果你写:

WHERE SUM(amount) > 1000   -- ❌ 这是错误写法

问题来了:
在分组之前,是没有“组”的概念的,也没有“sum 出来的结果”。

  • WHERE 执行时:只有原始行
    → 它不知道一个组里一共有几行,更没法算总和

  • 所以:

    • WHERE 里 不能直接用 SUM(count...) 等聚合函数来过滤

    • 这些只能放到 HAVING 里,因为 HAVING 是在 GROUP BY 之后

所以正确写法是:

GROUP BY seller
HAVING SUM(amount) > 1000;  -- ✅

5. 再用一句特别土但好记的话总结一下

你可以这么记(非常口语):

  • WHERE:先挑人,再分组。
    比如:先把“负数金额的订单”删掉,再按销售分组。

  • HAVING:先分组,再挑组。
    比如:按销售分完组,再看哪些销售“总金额 > 1000”,把组扔掉或保留。

或者一口气说出来(面试版):

SQL 的执行顺序大致是:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

其中:

  • WHERE 在分组前,对行进行过滤;

  • HAVING 在分组后,对每个组的汇总结果进行过滤;
    所以 HAVING 中可以使用 SUM/COUNT 这样的聚合函数,而 WHERE 不行。

http://www.dtcms.com/a/593007.html

相关文章:

  • 树莓派Raspberry Pi 5的汉化
  • 小红书推荐系统(牛客)
  • 做网站的猫腻网站的链接结构怎么做
  • 【强化学习】DQN 算法
  • 大模型-详解 Vision Transformer (ViT) (2
  • 学习react第一天
  • 2025年电子会计档案管理软件深度介绍及厂商推荐
  • io_uring 避坑指南
  • (附源码)基于Spring boot的校园志愿服务管理系统的设计与实现
  • deepseek回答 如何用deepseek训练出一个我的思路
  • 3ds Max材质高清参数设置:10分钟提升渲染真实感
  • MyBatis 插件
  • 甘肃省城乡住房建设厅网站首页微商软件自助商城
  • 一文掌握,kanass安装与配置
  • C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
  • 工信部 网站 邮箱内容管理系统做网站
  • arcgis用累计值进行分级
  • 生理学实验系统 生理学实验系统软件 集成化生物信号采集与处理系统生物信号采集处理系统 生理机能实验处理系统
  • 环境变量与程序地址空间
  • Node.js的主要应用场景和简单例子
  • 做视频解析网站是犯法的么360优化大师
  • 大网站cn域名淘宝店铺装修模板免费下载
  • VBA即用型代码手册:利用函数保存为PDF文件UseFunctionSaveAsPDF
  • JPA 的说明和使用
  • MyBatis使用LocalDateTime会报错
  • web网页开发,在线财务管理系统,基于Idea,html,css,jQuery,java,ssm,mysql。
  • 2025汉化idea创建JSP项目
  • 如何高效处理日常 PDF 文档?
  • LeetCode 2342.数位和相等数对的最大和
  • 企业网站建设需了解什么软文投放平台有哪些?