MySQL中ANG用法详解mysql中ang用法

说实话,你贴的关于如何使用ANG的详细说明看起来有点像教科书的副本。
它看起来很官方,但在实际使用中可能并不那么直观。
刚接触MySQL聚合分组的时候,有一段时间被类似的文档搞糊涂了。
让我用我的方式向你解释一下,也许会让你感觉好一点。

你说的ANG,其实MySQL官方文档中并不存在这样的概念。
我假设您选择“WITH ROLLUP”功能作为 ANG?该功能在SQL标准中称为“结果集增强”,其功能是自动对分组结果的行进行求和。
例如,分组后,会在末尾为您添加“总计”行。
这招确实很实用,但用多了也容易陷入陷阱。

以你的订单表为例,最经典的应用场景可能就是统计报表。
例如,电子商务企业希望了解每个客户购买了什么并计算总销售额。
写: SQL 选择客户、产品、SUM(数量) 来自订单 GROUP BY Customer, Product WITH ROLLUP;
这个查询可以返回每个客户购买的每种产品的数量,最后为您添加一个汇总行。
但请注意,如果表中存在空值,例如客户没有购买某种产品,WITH ROLLUP 就会包含这些空值统计,结果可能会比较混乱。
我曾经踩过这个陷阱。
有一位顾客没有购买任何产品。
WITH ROLLUP只是为其添加了一条“0”销量行。

更常见的做法是使用“GROUP BY...WITH ROLLUP”与“GROUP BY...HAVING”结合使用,例如选择销售额极高的客户: SQL 选择客户,SUM(数量)AS 总计 来自订单 按客户分组 总计 > 1 000 WITH ROLLUP;
这将首先计算每个客户的总销售额,然后选择超过 1 000 的客户,最后为您添加总计。
这种嵌套使用起来很灵活,但是条件写错了很容易出错。
我以前写了很长时间的HAVING条件,但发现WHERE写得不好。

至于你说的“分组列和聚合列应该一一匹配”,说实话,有点夸张了。
例如,您可以仅对非聚合列进行分组,如下所示: SQL 选择客户,SUM(数量) 来自订单 GROUP BY Customer;
这里没有对产品进行分组,但是对客户进行了划分,没有问题。
但如果写“GROUP BY Customer, Product, SUM (Quantity)”,数据库就会报错。
我尝试过,但它无法将聚合函数识别为分组列。

最实用的技巧其实就是WITH ROLLUP和子查询结合起来,比如季度统计,最后计算出每年的总计: SQL 选择季度,SUM(销售额) 来自( SELECT DATE_FORMAT(日期, '%Y-Q%q') AS 季度, SUM(数量) AS 销售额 来自订单 按季度分组 ) AS 下 GROUP BY QUARTER WITH ROLLUP;
这种嵌套的写法在解析报表时特别有用,但需要注意的是,子查询中的GROUP BY列也必须拆分到外层。
当我报道的时候当时我是按季度,外层用了年和月,内层只用了季度。
结果完全乱了。
我调试了好久才搞明白。

其实WITH ROLLUP的主要功能就只有一个:自动添加行总计。
如果您发现它有用,请更多地使用它,但不要忘记处理空值和子查询兼容性。
当我现在写报告时,几乎所有组统计数据都将通过WITH ROLLUP 添加。
无论如何,最后总得有个总数吧?

SQL语句执行顺序相关问题

上周朋友问我SQL语句的执行顺序,我向他解释:
写法的顺序是:select...from...join...on...where...groupby...having...orderby...limit...
但是执行的顺序是:from->join->on->where->groupby->having->select->orderby->limit。

为什么它们不一致?由于SQL设计受到关系代数和元组演算的影响,数学理论没有考虑运算的顺序,以及名称顺序、日期格式等文化差异。

执行流程逻辑是:先定义运算的对象,然后链接表,过滤数据,分类汇总,最后决定返回哪些列并排序。

例如,为什么不先分组,然后在哪里?因为先分组再过滤会浪费处理能力和内存。
先过滤再分组的效率要高得多。

再举个例子:为什么要先选后下单?由于orderby中可以使用select字段别名,如果先order的话,别名可能无法识别。

MySQL的where比有它更有效率,因为where是在查询开始时执行的,减少了后续处理的数据量。

聚合函数只能用于使用usage参与过滤条件,因为聚合函数必须在分组后进行计算。

使用聚合函数时,分组是必须的,因为它是对一个数据集的汇总计算。

字段别名不能在键中使用,因为where语句是在选择之前执行的,并且别名尚未定义。

groupby 和 优先于 select,但可以使用别名。
这可能是因为 MySQL 扩展了标准 SQL。

总而言之,了解 SQL 执行顺序有助于您编写有效的 SQL 语句并进行调试。
只要你明白了,你就会明白。

说点心里话 | 零基础学习 Python 系列大汇总。

上周,朋友开始学习Python,他选择了《从零基础开始学习Python》系列。
这个系列的内容相当广泛,从环境配置到文件操作,还有类和面向对象,还有错误处理和模块库。
这简直就是一个巨大的宝藏。

首先要配置环境,比如安装Python,然后进行编号和操作。
你应该学习整数和浮点数。
字符串操作也很重要,例如串联和索引。
您还需要了解 UTF-8 等字符编码。

列表和元组是基础,字典和集合也是不可或缺的。
您需要了解复制对象时使用的深复制和浅复制。

然后是Python的基本语句,运算符、条件语句、循环语句和派生表达式,这些都是编写代码所需要的。

你需要学习文件操作,比如读写文件,还需要了解迭代器。
函数是编程的核心。
定义、调用、参数类型和装饰器都是高级用法。

类和面向对象是重点。
必须清楚地理解类的定义、实例化、继承和多态性。
还有生成器和迭代器,它们是延迟加载的好方法。

您还需要学习错误和异常处理,并且需要能够使用 try- except 等结构。
您需要了解如何使用模块和标准库,例如 sys 和 os,以及 datetime 和 json。

最后是数据操作。
文件存储和数据库操作非常实用。
必须能够操作MySQL、MongoDB和SQLite等数据库。

我的朋友还处于基础阶段。
他说挺有趣的,但有时显得有点复杂。
我告诉他慢慢来,重要的是练习。
你弄清楚了,也许你能从中学到一些东西。