SQL语句执行顺序相关问题

我记得有一次,一个周末的下午,我坐在一家咖啡店里,手里拿着一本厚厚的关于数据库优化的书。
本书介绍了 SQL 语句的执行顺序。
我一边喝咖啡,一边尝试练习使用手机上的数据库模拟器。
我创建了一个包含用户信息的简单表,然后编写了一个查询来查看 SQL 执行顺序。

我输入了这样的 SQL 语句: sql 选择姓名,COUNT() 作为friends_count 来自用户 年龄 > 2 0 岁 按年龄分组 YES_好友数量 > 5 ORDER BY 好友数量 DESC LIMIT 1 0;
然后我运行查询,在屏幕上看到结果,并开始想知道这些操作是如何一步步执行的。
首先,我想实现一个 WHERE 条件来过滤 2 0 岁以上的用户,然后按年龄分组,统计每个年龄段的用户数量,然后过滤结果只保留好友超过 5 个的用户。
最后,按好友数量降序排序,并将结果限制为仅显示前 1 0 个结果。

突然,我想到了一个场景,比如在某个社交平台上,用户会根据年龄和好友数量划分到不同的社区。
如果我们想找到高度活跃的社区,我们需要了解 SQL 执行顺序,以便编写高效的查询。

时间流逝,我合上书,走出咖啡馆。
现在已经晚了。
我仍然想知道为什么我们有时会感觉查询很慢。
是不是因为某个条件没有放在合适的位置。
例如,如果WHERE条件过滤的数据量很大,后续的GROUP BY和HAVING操作就会变得非常慢。

等等,还有一件事。
我突然想到,如果数据量很大,JOIN操作可能会成为瓶颈。
那么在写SQL的时候,我们是应该尽量避免复杂的JOIN还是通过索引来优化查询呢?

SQL查询语句(where、jion、limit、group by、having等等)执行先后顺序

说实话,这个SQL执行顺序确实让人困惑。
我学的时候并没有完全理解。
让我给您一个保证流畅的概述:
---
1 . FROM 和 JOIN
什么时候?当查询开始时,这是第一件事。

该怎么办?确定要检查哪些表。
比如你写FROM Users JOIN Orders ON Users.id = Orders.User_id,SQL会先找到Users和Orders两张表,然后根据ON后面的条件进行合并。

示例:例如,如果您在北京,请检查两张表,一张名为“客户”,另一张名为“订单”。
JOIN是通过customer_id连接的。
然后 SQL 首先根据客户 ID 对齐两个表。

---
第二个地点
什么时候?在 FROM 和 JOIN 合并表后立即执行此工作。

该怎么办?过滤掉您不想看到的记录。
示例:WHEREorders.amount > 1 00,则保留超过1 00的订单,删除不可接受的订单。

示例:例如,合并客户和订单后,您确定只想查看金额大于2 00的订单,然后在WHERE中写入“orders.amount > 2 00”。

---
3 . 分组依据
什么时候?经过WHERE过滤之后,就到了分组的时候了。

该怎么办?将相似的记录分组在一起。
例如,如果使用GROUP BY customer_id,则具有相同customer_id的订单将被分组。

示例:比如查数据后发现需要按用户组统计订单数,所以写GROUP BY customer_id。

---
4 . 有
什么时候?完成 GROUP BY 分组后,继续此工作。

该怎么办?过滤分组结果。
例如,如果 HAVING COUNT(orders) > 1 ,则仅显示订单大于 1 的客户。

示例:完成对统计数据的分组后,您意识到您只想查看订单数量超过 3 个的客户,因此编写 HAVING COUNT(orders) > 3
---
5 . SELECT
什么时候? HAVING 完成过滤后,就可以选择字段了。

该怎么办?指定要显示的列。
示例: SELECT customer_id, COUNT(orders) 显示 customer_id 和订单数。

示例:分组和筛选后,只想查看客户 ID 和每个客户的订单数,只需编写 SELECT customer ID, COUNT(orders)。

---
第 6 个订单之后
什么时候? SELECT 选择字段后,就可以进行排序了。

该怎么办?按指定列排序。
示例:ORDER BYorders.amount DESC,然后将订单数量从大到小排序。

示例:选择字段后,您意识到要从高到低显示订单金额。
因此,输入 ORDER BYorders.amount DESC。

---
7 . 限制
什么时候? ORDER BY排序后就是最后一步了。

该怎么办?限制返回的记录数。
示例:LIMIT 1 0,则仅查看前 1 0 个元素。

例:排序后,只想看前5 个结果,就写LIMIT 5 即可。

---
助记顺口溜: 我的(WHERE)兄弟(GROUP BY)是(SELECT)甚至(ORDER BY)。
(谐音:WHERE-GROUP BY-SELECT-ORDER BY,对应顺序)
---
注:
LIMIT最后执行,但写入时一般放在最后。
所以算了吧不是。

SELECT最早可以在写入时写入,但在执行时写入GROUP BY之后。

---
说实话,顺序一听就清楚了。
不要想太多,记住这个过程就可以了。