sql语句执行顺序是什么

等等,昨天在帮助同事调试 SQL 时,我遇到了一些非常有趣的事情。
他写了一个查询,但结果总是错误,而他自己却没有意识到。
我看了一下,发现WHERE条件中直接使用了MAX(salary)。
那不会是一个错误吗?他当时还很困惑,说在WHERE中写1 =1 总是正确的。
我告诉他,分组之前先过滤WHERE,聚合函数应该放在后面。
他突然意识到这一点,赶紧改成HAVING。
这时我才明白,SQL的执行顺序确实不是随机的,必须一步一步来。

记得有一次,我在公司会议室改SQL。
我在投影仪前写了很多FROM、WHERE和GROUP BY,却发现少了JOIN条件。
我急得满头大汗。
幸好同事提醒我,连接条件一定要写在FROM中。
这让我想起写SQL就像做饭一样。
需要先放基本的食材,然后炒配菜,最后调味。
如果顺序颠倒了,味道就会被破坏。
就像昨天的MAX函数一样,如果提前使用,聚合还没有开始,聚合对象会从哪里来呢?
等等,还有一件事。
上次使用EXPLAIN分析查询计划时,我发现一个查询导致了全表扫描,因为GROUP BY写得不正确。
优化后,执行时间从3 秒直接下降到0.5 秒。
这突然让我觉得优化数据库真的不是盲目修改。
您需要了解如何逐步执行它。
例如HAVING,虽然总是写在GROUP BY之后,但实际上是在分组之后才生效的。
目前,数据量要少得多。
如果提前过滤的话,可以节省多少资源。

今天整理笔记后,我发现有一个细节特别重要。
例如,如果非聚合字段写入 SELECT 但未在 GROUP BY 中列出,数据库将如何处理?您必须首先按 GROUP BY 进行分组,然后检查 SELECT 中的字段。
如果发现自己不属于该组,则会报告错误。
如果将此字段添加到GROUP BY中或者使用聚合函数处理,例如COUNT(1 ),则可以正常工作。
这让我想起SQL的严谨性有时可以帮助我们避免错误。
如果写得太随意,结果可能不正确。

我突然想到,如果数据库能像Excel一样就好了,让我们可以看到数据透视后的样子,然后决定使用哪些条件进行过滤。
但关系数据库必须遵循逻辑顺序:首先连接,然后分组,然后聚合。
每一步都必须清晰。
这也提醒我们,在写SQL的时候,不仅要检查是否顺利,更要想清楚每一步到底在做什么。
就像昨天同事一样,我就是分不清WHERE和HAVING的区别,所以纠结了好久。

顺便说一下,我在屏幕上贴出了这个执行序列表支持。
有时,当我编写复杂的查询时,我会将它们拿出来进行比较。
例如,一个查询持续了很长时间。
使用EXPLAIN查看后发现WHERE条件写错了位置,导致过滤的数据过多。
编辑后,几秒钟后即可获得结果。
这给我的感觉是,如果工具用得好,效率是可以显着提高的。
但最终,你还是需要充分理解SQL的执行逻辑。
如何简单地使用工具编写高性能查询?
最后,在写SQL的时候,你是不是总觉得GROUP BY和HAVING没什么用,但是一旦用了,性能就会提升?这是你必须练习才能知道的事情。

图解 SQL 的执行顺序

记得有一次,在数据库课上,老师给我们展示了一个SQL查询优化的小案例。
那天,阳光透过教室窗户照在黑板上,老师写了一条看似简单的SQL查询:
sql 从年龄 > 1 8 的学生中选择姓名、年龄;
他说:“你看,这个查询看起来很简单,但里面的执行顺序其实很复杂。
” 然后他在黑板上画了一个流程图,从FROM开始,到LIMIT结束。
我当时就在想,这个查询真的会按照这个顺序执行吗? 等等,还有一件事,我突然想到,如果我使用JOIN和GROUP BY来重写这个查询,它会如何执行?