了解 SQL 查询执行顺序

前言

SQL 是一种标准化的结构化查询语言,涉及结构化查询时,高效地检索数据至关重要。SQL 在关系关系数据库交互至关重要,掌握其复杂性可以提高我们的数据查询技能。

了解SQL查询子句的执行顺序,对于编写正确高效的 SQL 语句至关重要。本文一起探讨 SQL 查询子句的典型执行顺序及了解在查询中的交互方式。

查询字句

1、FROM

FROM 子句是查询的起点,它指定要从中检索数据的表或视图。在此阶段,将处理链接、子查询和表引用。本质上此子句是为数据检索设置上下文。

FROM Customers a

2、JOIN

JOIN 子句是在FROM子句之后,根据相关列合并两个或多个表中的行,它决定了如何匹配不同表中的行。

此步骤包括各种类型的连接,如内部连接(inner join)、外部连接(left join、right join)和交叉连接(cross join)

JOIN Orders b ON a.CustomerID = b.CustomerID

3、WHERE

WHERE 子句根据指定条件筛选行。它在表联接后但在任何分组或聚合发生之前对行应用条件。此步骤对于将数据集缩小到仅相关行至关重要。

WHERE b.CreateDate >='2024-06-01'

4、GROUP BY

GROUP BY 子句将具有相同值的行分组。这通常与聚合函数(COUNT、SUM、AVG等)一起使用,以对分组数据执行计算。该子句是根据指定的列将数据组织到群组中。

GROUP BY a.CustomerID

5、HAVING

HAVING 子句与 WHERE 子句类似,根据指定的条件过滤组。但它是在分组完成后应用的。该子句可用于过滤聚合后不符合某些条件的组。

HAVING sum(b.OrderAmount)> 1000

6、SELECT

SELECT 子句指定要包含在结果集中的列或表达式。您可以在此处定义查询的输出,包括任何计算、表达式和别名。该子句确定将从查询中返回哪些数据。

SELECT TOP 10
    a.CustomerID,
    sum(b.OrderAmount) AS SumOrderAmount

7、DISTINCT

DISTINCT 关键字从结果集中删除重复的行。它在子句之后应用,以确保输出仅包含唯一行。

SELECT DISTINCT a.CustomerName

8、ORDER BY

ORDER BY 子句根据一个或多个列对结果集进行排序。应用此语句,可以将结果集按所需顺序显示。还可以根据需要指定升序或降序排序来组织数据。

ORDER BY SumOrderAmount DESC

9、LIMIT 或 TOP

LIMIT(MySQL)或 TOP(SQL Server)子句限制了查询返回的行数,并选择性地跳过指定的行数。

TOP 10

查询示例

通过下面一个查询说明其执行顺序:

SELECT TOP 10
    a.CustomerID,
    sum(b.OrderAmount) AS SumOrderAmount
FROM
    Customers a
JOIN
    Orders b
ON
    a.CustomerID = b.CustomerID
WHERE
    b.CreateDate > '2024-06-01'
GROUP BY
    a.CustomerID
HAVING
    sum(b.OrderAmount)  > 1000
ORDER BY
    SumOrderAmount DESC

执行顺序按下面步步进行

1、From: 指定Customers和Orders表。

2、Join: 根据CustomerID合并Customers和Orders表。

3、Where: 筛选出以Orders表CreateDate仅包含2024-06-01日期之后的订单。

4、Group by: 按CustomerID对结果进行分组。

5、Having:筛选出仅包含具有订单金额大于1000以上的订单组。

6、SELECT:指定要包含在结果集中的列CustomerID和sum(b.OrderAmount) AS SumOrderAmount。

7、DISTINCT:示例查询语句中未使用,如果使用则在此处应用。

8、ORDER BY: 按SumOrderAmount降序(或升序)对结果进行排序。

9、LIMIT或TOP: 将结果集限制为前几行。

小结

通过了解 SQL 查询子句的执行顺序与每个子句的处理方式以及它们如何交互,可以帮助我们编写较优化的查询。如有不到之处,请多多包涵。

猜你喜欢

转载自blog.csdn.net/Funniyuan/article/details/143270369