控制 SQL 查询中的运算顺序

执行 SQL 查询时,需要了解并管理子句的评估顺序,以便生成您所期望的结果。

以下是同一查询的两个示例。第一个示例不使用子句分组,并且返回的结果与预期不符。在第二个示例中,对子句进行了分组以强制执行正确的运算顺序,从而返回预期结果。

在这种情况下,假设您正在使用全球人口统计数据库,并且希望查找人口数至少为 100,000 的中国城市或者省会城市。

示例 1:不使用分组

您可以使用三个子句来构建此查询,如下图所示。运行此查询后,将首先查找中国的所有城市,然后过滤人口超过 100,000 的中国城市。接下来,将根据 Or 运算符对整个数据集进行评估,以返回省会城市。最终结果为人口超过 100,000 的中国城市以及全球所有的省会城市,这不是我们想要的结果。这是因为 And 运算符的优先级高于 Or 运算符,因此将首先评估 And 运算符。

查询中未分组的三个子句

示例 2:使用分组

在本例中,要返回预期结果,必须首先评估 Or 运算符。您可以对子句进行分组以强制执行运算顺序。将先评估组中的子句,然后再评估组外的子句。

查询中的三个子句,其中对后两个子句进行了分组

要对两个或多个子句进行分组,请按住 Shift 键并单击子句将其选中,然后单击分组子句 分组子句。要取消子句分组,请在组中选择一个子句,然后单击取消子句分组 取消分组子句

应用分组后,查询将首先评估组中的子句,即:城市人口至少为 100,000,或者城市为省会城市。接下来,查询将评估该城市是否为中国城市。然后,And 运算符可以确保查询正确返回同时满足两个条件的城市,即:人口至少为 100,000 的中国城市或者为省会城市。

对子句进行分组等同于将其用括号括起来。在 SQL 模式中,此查询如下所示:

CNTRY_NAME = 'China' And (POP > 100000 Or STATUS = 'Provincial capital')