在标准RDBMS中使用HAVING的规则

时间:2018-12-08 01:14:53

标签: sql google-bigquery

我已经对Haveing In Google BigQuery 做了一些测试,发现: 我可以在HAVING中使用列别名而没有错误

SELECT
  geoNetwork_city as total_CITY,
 sum( totals_transactions) as total_transcations, 
FROM
  tablename
GROUP BY
  geoNetwork_city
  HAVING total_CITY not like 'NEW YORK'
  ORDER by distinct_visitors desc

但是HAVING子句不是在尚未形成别名的SELECT子句之前执行的吗? 为什么我们不会收到任何错误?

此外,我们可以用Have for non-aggregation function替换何处吗?

SELECT
  geoNetwork_city as total_CITY
FROM
  tablename
HAVING 
 total_CITY not like 'NEW YORK'

2如何在 MS SQL Server 中使用别名? 我在MS SQL中发现,可以引用别名的唯一地方(我知道)是在ORDER BY子句中。 这是正确的吗?

2 个答案:

答案 0 :(得分:2)

HAVINGGROUP BY之后过滤。 SQL查询不是执行的子句,而是解析的子句。对于常用子句,顺序为:

  • FROM。 。 。这定义了表别名
  • WHERE。 。 。过滤行
  • GROUP BY。 。 。定义行
  • SELECT。 。 。定义列别名
  • HAVING。 。 。在GROUP BY存在时过滤行
  • ORDER BY。 。 。订购结果集
  • LIMIT / FETCH。 。 。限制行数

此顺序可能因数据库而略有不同(以下内容略有不同)。

在几乎所有数据库中,您都可以按列别名进行排序。在MS SQL和BigQuery中都是如此。这是ISO / ANSI标准的一部分。

在某些数据库中,您可以GROUP BY列别名(这会影响上述顺序)。其中包括BigQuery(以及MySQL和Postgres),但不包括SQL Server。

在某些数据库中,您可以在HAVING子句中引用列别名。其中包括BigQuery(以及MySQL和Postgres,也许还有更多)。

答案 1 :(得分:1)

  

以下是用于BigQuery标准SQL

之前应用

WHERE,但是在之后应用HAVINGSELECT with GROUP BY的别名可见-这就是为什么您看不到任何错误的原因

HAVING也适用于使用HAVING的情况-否则会出现如下错误

GROUP BY

因此,下面将产生错误

The HAVING clause requires GROUP BY or aggregation to be present   

虽然下面可以使用

#standardSQL
SELECT geoNetwork_city as total_CITY
FROM `project.dataset.tablename`
HAVING total_CITY not like 'NEW YORK'