我在Google BigQuery中做了一些测试,发现:我可以在没有错误的情况下使用列别名。
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但是在SELECT子句之前没有执行子句吗,别名还没有形成呢?为什么我们不会收到任何错误?
另外,我们是否可以用非聚集函数代替where呢?
SELECT
geoNetwork_city as total_CITY
FROM
tablename
HAVING
total_CITY not like 'NEW YORK'2在MS Server中使用别名如何?我在MS中发现,惟一可以引用别名的地方(我知道)是ORDER子句。这是正确的吗?
发布于 2018-12-08 13:16:44
HAVING在GROUP BY之后进行过滤。SQL查询不是逐个子句执行的,而是逐个子句解析的.对于常见条款,排序如下:
FROM。。。这定义了表别名。WHERE。。。过滤行GROUP BY。。。定义行SELECT。。。定义列别名HAVING。。。在出现GROUP BY时过滤行ORDER BY。。。排序结果集LIMIT/FETCH .。。限制行数这个顺序可能会因数据库的不同而略有变化(下面更多)。
在几乎所有的数据库中,您都可以按列排序别名。这在MS和BigQuery中是正确的。这是ISO/ANSI标准的一部分。
在某些数据库中,可以使用GROUP BY列别名(这会影响上述排序)。这包括BigQuery (以及MySQL和Postgres),但不包括Server。
在某些数据库中,可以引用HAVING子句中的列别名。这包括BigQuery (以及MySQL和Postgres,也许还有其他几个)。
发布于 2018-12-08 01:19:02
下面是用于BigQuery标准SQL的
WHERE是在之前应用HAVING,而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'在下面工作的时候
#standardSQL
SELECT geoNetwork_city,
SUM( totals_transactions) as total_transcations
FROM `project.dataset.tablename`
WHERE geoNetwork_city NOT LIKE 'NEW YORK'
GROUP BY geoNetwork_city
HAVING total_transcations > 30https://stackoverflow.com/questions/53678643
复制相似问题