用简单的例子详细解释查询语句的执行顺序。
本文会一步一步的说明关系数据库中一条查询语句执行时的处理过程。
2个示例表:Citizen 和 City
Citizen 表中包含了公民的名字和所在城市的ID。
City 表中包含城市的名字和ID。
下面是2张表中的数据:
现在有一个查询的需求:想要知道除了 "San Bruno" 之外的 2 个城市名称,这 2 个城市要满足一个条件,就是居住的公民数量大于等于(>=)2,对于查询结果呢要按名字升序排序。
对于这个需求,可以使用下面的 SQL 语句:
FROM citizen
JOIN city
执行 From 和 Join 子句。
对 2 张表进行组合,形成此次查询所需要的记录集合。
From 和 Join 子句执行之后,处理器会根据 On 指定的条件从记录集合中挑出符合条件的记录:
ON citizen.city_id = city.city_id
拿到了记录集合之后,开始执行 Where 子句。
使用指定的条件过滤记录集合,如果计算结果不为 true,就会从记录集合中移除。
WHERE city.city_name != 'San Bruno'
执行 Group by 子句,对记录集合分组,把 city_name 相同的放到一组。
GROUP BY city.city_name
在分组之后,select 子句就是对每个组来操作,而不是每条记录了。
Having 子句在 Group by 之后执行,其中包含了一个逻辑断言。
需要注意,其针对的是记录组,而不是单独的记录。
HAVING COUNT(*) >= 2
在这个例子中,这步执行之后的结果和上一步是一样的,因为每组都符合条件。
在这步中, 需要计算出打印什么,以及如何打印,例如包含一些函数的话(Distinct, Max, Sqrt, Date, Lower ...),就需要执行。
在这个示例中,只需要打印出 city_name 这一列,以及别名 "City"。
最后一步处理结果集的展示顺序,还有限制结果集的数量。
这个示例中,记录是按字母排序的,显示的记录数量最多为 2 个。
查询语句的执行步骤:
![image-20200629115308863](/Users/a/Library/Application Support/typora-user-images/image-20200629115308863.png)
感谢阅读,希望能对你有帮助。
内容翻译整理自: https://towardsdatascience.com/the-6-steps-of-a-sql-select-statement-process-b3696a49a642