我已经对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子句中。 这是正确的吗?
答案 0 :(得分:2)
HAVING
在GROUP 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
,但是在之后应用HAVING
,SELECT 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'