SQL 简化:使用 CTE 制作模块化且易于理解的查询 - KDnuggets

SQL 简化:使用 CTE 制作模块化且易于理解的查询 – KDnuggets

源节点: 3084928

SQL 简化:使用 CTE 制作模块化且易于理解的查询
图片作者 
 

在数据世界中,SQL 仍然是与数据库交互的通用语言。 

时至今日,它仍然是处理数据最常用的语言之一,并且仍然被认为是任何优秀数据专业人员的必备语言。 

然而,任何使用过复杂 SQL 查询的人都知道它们很快就会变成笨重的野兽——难以阅读、维护或重用。 

这就是为什么今天仅仅了解 SQL 还不够,我们需要善于设计查询。这实际上是一种艺术。 

这就是通用表表达式 (CTE) 发挥作用的地方,它将查询编写的艺术转变为更加结构化且易于理解的技术。

因此,让我们一起探索如何编写可读且可重用的查询代码。

如果您想知道什么是 CTE,那么您就读对了文章。 

公共表表达式 (CTE) 是在单个 SQL 语句的执行范围内定义的临时结果集。 

 

它们是可以在单个查询中多次引用的时态表,通常用于简化复杂的联接和子查询,最终目标是提高 SQL 代码的可读性和组织性。

因此,它们是将复杂查询分解为更简单部分的强大工具。

以下是您应该考虑使用 CTE 的原因:

  • 模块化: 您可以将复杂的逻辑分解为可读的块。
  • 可读性: 它使理解 SQL 查询的流程变得更容易。
  • 可重用性: CTE 可以在单个查询中多次引用,从而避免重复。

神奇之处始于WITH 子句,该子句位于主查询之前,并使用别名定义不同的时态表(CTE)。

因此,我们总是需要使用“WITH”命令来开始查询,以开始定义自己的 CTE。通过使用 CTE,我们可以将任何复杂的 SQL 查询分解为: 

– 计算相关变量的小型时态表。 

– 最终表仅采用我们想要的那些变量作为输出。

这正是我们在任何代码中想要的模块化方法!

 

SQL 简化:使用 CTE 制作模块化且易于理解的查询
图片作者
 

因此,在查询中使用 CTE 使我们能够:

– 执行一次临时表并多次引用它。

– 提高可读性并简化复杂逻辑。

– 促进代码可重用性和模块化设计。

为了更好地理解这一点,我们可以举一个巴塞罗那 Airbnb 房源的实际例子。 

想象一下,我们想要分析街区列表的表现,并将其与城市的整体表现进行比较。您需要收集有关社区、单个公寓、房东和价格的信息。

为了举例说明这一点,我们将使用 Airbnb内部 巴塞罗那表,如下所示: 

 

SQL 简化:使用 CTE 制作模块化且易于理解的查询
 

一种幼稚的方法可能会导致您创建嵌套子查询,这很快就会成为维护噩梦,如下所示:

作者代码

相反,我们可以利用 CTE 将查询划分为逻辑部分,每个部分定义拼图的一部分。

  • 邻里数据: 创建 CTE 以按邻域汇总数据。
  • 公寓和房东信息: 定义 CTE 以获取有关公寓和房东的详细信息。
  • 全市指标: 另一个收集城市级统计数据以进行比较的 CTE。
  • 最后组装: 将 CTE 合并到最终的 SELECT 语句中以紧密地呈现数据。

 

SQL 简化:使用 CTE 制作模块化且易于理解的查询
图片作者
 

我们最终会得到以下查询:

作者代码

通过使用 CTE,我们将可能巨大的单个查询转变为一组有组织的数据模块。这种模块化方法使 SQL 代码更加直观并且能够适应变化。 

如果出现新需求,您可以调整或添加 CTE,而无需彻底修改整个查询。

建立 CTE 后,您可以重复使用它们来执行比较分析。例如,如果您想将社区数据与全市指标进行比较,您可以在一系列 JOIN 操作中引用您的 CTE。 

这不仅节省时间,还可以保持代码高效,因为您不必重复相同的查询两次!

CTE 证明了“小结构在编程中大有帮助”这一原则。通过采用 CTE,您可以编写更清晰、更易于维护且可重用的 SQL 查询。 

它简化了查询开发过程,并使与其他人交流复杂的数据检索逻辑变得更加容易。

请记住,下次当您发现自己要开始编写一个多连接、嵌套子查询的怪物时,请考虑使用 CTE 将其分解。 

未来的你以及任何可能阅读你的代码的人都会感谢你。
 
 

约瑟夫·费雷尔 是来自巴塞罗那的分析工程师。 他毕业于物理工程专业,目前从事应用于人类移动的数据科学领域。 他是一名专注于数据科学和技术的兼职内容创作者。 你可以联系他 LinkedIn, Twitter or .

时间戳记:

更多来自 掘金队