前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >执行 SQL select 语句的 6 个步骤

执行 SQL select 语句的 6 个步骤

作者头像
dys
发布2020-07-02 10:18:30
1.3K0
发布2020-07-02 10:18:30
举报
文章被收录于专栏:性能与架构性能与架构

用简单的例子详细解释查询语句的执行顺序。

介绍

本文会一步一步的说明关系数据库中一条查询语句执行时的处理过程。

2个示例表:CitizenCity

Citizen 表中包含了公民的名字和所在城市的ID。

City 表中包含城市的名字和ID。

下面是2张表中的数据:

现在有一个查询的需求:想要知道除了 "San Bruno" 之外的 2 个城市名称,这 2 个城市要满足一个条件,就是居住的公民数量大于等于(>=)2,对于查询结果呢要按名字升序排序。

对于这个需求,可以使用下面的 SQL 语句:

查询处理步骤

  1. 获取数据(From, Join)
  2. 记录过滤(Where)
  3. 分组(Group by)
  4. 组内记录过滤(Having)
  5. 返回表达式(Select)
  6. 排序 & 分页(Order by & Limit / Offset)

步骤1:获取数据(From, Join)

代码语言:javascript
复制
FROM citizen
JOIN city 

执行 FromJoin 子句。

对 2 张表进行组合,形成此次查询所需要的记录集合。

FromJoin 子句执行之后,处理器会根据 On 指定的条件从记录集合中挑出符合条件的记录:

代码语言:javascript
复制
ON citizen.city_id = city.city_id

步骤2:记录过滤(Where)

拿到了记录集合之后,开始执行 Where 子句。

使用指定的条件过滤记录集合,如果计算结果不为 true,就会从记录集合中移除。

代码语言:javascript
复制
WHERE city.city_name != 'San Bruno'

步骤3:分组(Group by)

执行 Group by 子句,对记录集合分组,把 city_name 相同的放到一组。

代码语言:javascript
复制
GROUP BY city.city_name

在分组之后,select 子句就是对每个组来操作,而不是每条记录了。

步骤4:组内记录过滤(Having)

Having 子句在 Group by 之后执行,其中包含了一个逻辑断言。

需要注意,其针对的是记录组,而不是单独的记录。

代码语言:javascript
复制
HAVING COUNT(*) >= 2

在这个例子中,这步执行之后的结果和上一步是一样的,因为每组都符合条件。

步骤5:返回表达式(Select)

在这步中, 需要计算出打印什么,以及如何打印,例如包含一些函数的话(Distinct, Max, Sqrt, Date, Lower ...),就需要执行。

在这个示例中,只需要打印出 city_name 这一列,以及别名 "City"。

步骤6:排序 & 分页(Order by & Limit / Offset)

最后一步处理结果集的展示顺序,还有限制结果集的数量。

这个示例中,记录是按字母排序的,显示的记录数量最多为 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 查询处理步骤
    • 步骤1:获取数据(From, Join)
    • 步骤2:记录过滤(Where)
    • 步骤3:分组(Group by)
    • 步骤4:组内记录过滤(Having)
    • 步骤5:返回表达式(Select)
    • 步骤6:排序 & 分页(Order by & Limit / Offset)
    • 小结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档