阅读和理解 SQL 查询的分步指南 - KDnuggets

阅读和理解 SQL 查询的分步指南 – KDnuggets

源节点: 3091384

阅读和理解 SQL 查询的分步指南
图片由 Freepik
 

SQL(即标准查询语言)是一种用于在关系数据库管理系统 (RDBMS) 中管理和操作数据的编程语言。它是许多公司使用的标准语言,可帮助企业顺利访问数据。因为它被广泛使用,所以工作中通常将 SQL 作为必备技能之一。这就是为什么学习 SQL 非常重要。

人们在学习 SQL 时常见的问题之一是理解查询,主要是当另一个人编写查询时。我们在公司中作为一个团队工作,经常需要阅读和理解他们的 SQL 查询。因此,我们需要练习解构 SQL 查询并理解它们。

本文将逐步介绍阅读和理解 SQL 查询的过程。我们该怎么做呢?让我们开始吧。

当遇到SQL查询时,我们要做的第一件事就是了解SQL查询的一般意图。一般意图并不意味着我们完全了解查询的结构;更多的是关于整体流量。

我们应该先了解标准的 SQL 查询,才能了解一般的 SQL 查询。大多数 SQL 查询都以 选择 条款并遵循 条款。从那里继续,查询之后最常见的是 注册, , 通过...分组, 订购依据,HAVING 条款。

上面的子句是我们需要理解的SQL查询中的标准子句。对于每个子句,它们的功能是:

  1. 选择:将从表中取出哪些列
  2. : 数据来自哪个表
  3. 注册:合并具有指定标识符的表
  4. :根据条件过滤数据
  5. 通过...分组:根据列的值组织数据并允许执行聚合功能。
  6. ORDER BY:根据特定列排列数据结果顺序
  7. HAVING:不能指定聚合函数的过滤条件

这些是标准子句,也是您在了解一般 SQL 查询结构时应该首先找到的内容。让我们使用示例代码来进一步学习。

SELECT 
  customers.name, 
  purchases.product, 
  SUM(price) as total_price 
FROM 
  purchases 
  JOIN customers ON purchases.cust_id = customers.id 
WHERE 
  purchases.category = 'kitchen' 
GROUP BY 
  customers.name, 
  purchases.product 
HAVING 
  total_price > 10000 
ORDER BY 
  total_price DESC;

 

当您查看上面的查询时,请尝试识别标准子句。该子句将使您了解选择了哪些数据(选择),它来自(注册),以及条件(, 通过...分组, ORDER BYHAVING). 

例如,阅读上面的查询将使您了解以下内容:

  1. 我们尝试获取三种不同类型的数据:来自名为“customers”的表的名称、来自名为“purchasing”的表的产品以及价格列的聚合,这些价格列不标识该表的来源,并且具有别名total_price(来自子句的信息) 选择). 
  1. 总体数据将来自购买和客户表,这些表使用购买中的 cust_id 列和客户表中的 id 列连接在一起(子句中的信息) 从)注册). 
  1. 我们只会选择购买表中类别列值为“厨房”的数据(来自子句的信息 ), 
  1. 聚合函数的组,其名称和产品列来自相应的表(来自子句的信息 通过...分组), 
  1. 也从聚合函数结果总和中过滤,其中total_price 大于 10000(来自子句的信息 HAVING), 
  1. 根据total_price(来自子句的信息)对数据进行降序排序 ORDER BY).

这就是您需要了解和识别的一般 SQL 查询结构。从那里,我们可以进一步探索高级查询。让我们继续下一步。

有时候你会遇到一个复杂的查询,其中有很多 选择 子句存在于同一查询中。在这种情况下,我们应该了解查询的最终结果或最终(第一个) 选择 你在查询中看到。关键是要知道查询输出想要什么。

让我们使用更复杂的代码,如下所示。

WITH customerspending AS (
  SELECT 
    customers.id, 
    SUM(purchases.price) as total_spending 
  FROM 
    purchases 
    JOIN customers ON purchases.cust_id = customers.id 
  GROUP BY 
    customers.id
) 
SELECT 
  c.name, 
  pd.product, 
  pd.total_product_price, 
  cs.total_spending 
FROM 
  (
    SELECT 
      purchases.cust_id, 
      purchases.product, 
      SUM(purchases.price) as total_product_price 
    FROM 
      purchases 
    WHERE 
      purchases.category = 'kitchen' 
    GROUP BY 
      purchases.cust_id, 
      purchases.product 
    HAVING 
      SUM(purchases.price) > 10000
  ) AS pd 
  JOIN customers c ON pd.cust_id = c.id 
  JOIN customerspending cs ON c.id = cs.id 
ORDER BY 
  pd.total_product_price DESC;

 

现在查询看起来更复杂、更长,但最初的重点应该是最终的 选择, 这似乎试图产生客户的总支出和购买历史记录。尝试评估最终结果并从那里分解它。

我们对结果的洞察应该来自于查询。接下来就是看看最终的条件是什么 选择 是。条件条款,包括 , 通过...分组, ORDER BYHAVING 是控制总体数据结果的人。 

尝试阅读并理解我们的查询条件,我们将更好地理解查询的最终结果。例如,在我们之前的 SQL 查询中,最终条件只是 ORDER BY。这意味着最终结果将按照产品总价降序排列。 

了解最终条件将有助于您理解查询的重要部分和整体查询意图。

最后,我们需要了解数据来自哪里。了解了要选择的数据以及获取数据的条件后,我们需要了解数据的来源。决赛 注册 子句将使我们了解表如何交互和数据流。

例如,前面的复杂查询显示我们执行了两次 Join。这意味着我们至少使用了三个数据源来获得最终结果。在后续步骤中,需要此信息来进一步了解每个数据源的来源,尤其是当数据源来自子查询时。

在了解了最终结果应该如何以及它从何而来之后,我们需要仔细查看细节。从这里,我们将回溯到每个子查询并理解为什么它们是这样的结构。

然而,我们并不试图以自上而下的结构来看待它们。相反,我们应该尝试查看更接近最终结果的子查询,然后向上移动到距最终结果最远的子查询。从上面的代码示例中,我们应该首先尝试理解这段代码:

SELECT 
  purchases.cust_id, 
  purchases.product, 
  SUM(purchases.price) as total_product_price 
FROM 
  purchases 
WHERE 
  purchases.category = 'kitchen' 
GROUP BY 
  purchases.cust_id, 
  purchases.product 
HAVING 
  SUM(purchases.price) > 10000

 

然后,我们转向最远的代码,即:

WITH customerspending AS (
  SELECT 
    customers.id, 
    SUM(purchases.price) as total_spending 
  FROM 
    purchases 
    JOIN customers ON purchases.cust_id = customers.id 
  GROUP BY 
    customers.id
)

 

当我们将每个子查询从距离结果较近的子查询到最远的子查询分解时,我们可以清楚地追踪作者的思维过程。 

如果您需要帮助理解每个子查询,请尝试重复上述过程。通过一些练习,您将在阅读和理解查询方面获得更好的体验。

阅读和理解 SQL 查询是现代每个人都应该具备的技能,因为每个公司都会处理它们。通过使用以下分步指南,您将有更好的时间来理解复杂的 SQL 查询。步骤包括:

  1. 了解一般 SQL 查询结构
  2. 了解最终选择
  3. 了解最终条件条款
  4. 了解最终连接
  5. 倒序阅读并重复

 
 

科尼利厄斯·尤达·维贾亚 是一名数据科学助理经理和数据作家。 在 Allianz Indonesia 全职工作期间,他喜欢通过社交媒体和写作媒体分享 Python 和数据技巧。

时间戳记:

更多来自 掘金队