Sql 在标准关系数据库中使用have的规则
我在Google BigQuery中做了一些测试,发现: 我可以在have中使用列别名而不会出错Sql 在标准关系数据库中使用have的规则,sql,google-bigquery,Sql,Google Bigquery,我在Google BigQuery中做了一些测试,发现: 我可以在have中使用列别名而不会出错 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_visito
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子句之前执行的吗?SELECT子句的别名还没有形成?
为什么我们不会收到任何错误
另外,我们可以用have for non-aggregation函数替换where吗
SELECT
geoNetwork_city as total_CITY
FROM
tablename
HAVING
total_CITY not like 'NEW YORK'
2在MS SQL Server中使用别名如何?
我在MS SQL中发现,唯一可以引用别名的地方(我知道)是ORDER BY子句。
这是正确的吗
下面是BigQuery标准SQL
其中
在之前应用,而在之后应用
使用分组依据选择,因此别名对于具有可见-这就是为什么您不会看到任何错误,因为它是正确的
另外,拥有
也适用于使用分组依据
的情况,否则会出现如下错误
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 > 30
下面是BigQuery标准SQL
其中
在之前应用,而在之后应用
使用分组依据选择,因此别名对于具有可见-这就是为什么您不会看到任何错误,因为它是正确的
另外,拥有
也适用于使用分组依据
的情况,否则会出现如下错误
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 > 30
拥有
是在分组依据
之后进行过滤。SQL查询不是逐子句执行的,而是逐子句分析的。对于通用条款,顺序为:
。这定义了表别名来自
。过滤行其中
。定义行分组依据
。定义列别名选择
。存在具有
分组依据时过滤行
。对结果集进行排序订购人
/限制
。限制行数取数
在某些数据库中,可以在
HAVING
子句中引用列别名。这包括BigQuery(以及MySQL和Postgres,可能还有更多)。have
是在groupby
之后进行过滤的。SQL查询不是逐子句执行的,而是逐子句分析的。对于通用条款,顺序为:
。这定义了表别名来自
。过滤行其中
。定义行分组依据
。定义列别名选择
。存在具有
分组依据时过滤行
。对结果集进行排序订购人
/限制
。限制行数取数
在某些数据库中,可以在
HAVING
子句中引用列别名。这包括BigQuery(以及MySQL和Postgres,可能还有更多)。我认为,出于性能方面的原因,您可能可以通过执行计划检查,在非聚合列上进行过滤(在本例中针对“纽约”进行测试)更好地在何处进行,而不是在有。例如,有一些答案表明可能不使用索引。@Gserg谢谢。我已经在Bigquery中测试过了,看起来还可以。自从您提到它,我确实记得我在SQL server中遇到过错误。这就是为什么我对这两个列都做了标记,并想看看它是通用的SQL标准规则还是不同的DBMS案例。我认为,出于性能方面的原因,您可能可以通过执行计划来检查,在非聚合列上进行过滤(在本例中针对“纽约”进行测试)最好在何处进行,而不是在有。例如,有一些答案表明可能不使用索引。@Gserg谢谢。我已经在Bigquery中测试过了,看起来还可以。自从您提到它,我确实记得我在SQL server中遇到过错误。这就是为什么我对两者都进行了标记,并想看看它是通用SQL标准规则还是根据不同的DBMS情况。如果它是一个聚合函数别名,例如,选择userid,sum(transaction_id)作为tid,从usertable组中按tid>30的userid排序,可以吗?可以,应该可以!这正是使用HAVINGThank you@GSerg的一个主要案例-很好的一点-我没有看到sql
和sqlserver
的标签,我的回答是google bigquery
。更新了我的答案-为了澄清您的第二个“#standardSQL”错误,别名total_CITY
不正确declared@Used_By_Already-谢谢-正在复制粘贴问题中的示例以进行修改,并最终将其保留在那里,因此将其删除,因为它是中间文本如果它是聚合函数别名,例如SELECT userid,sum(transaction_id)作为tid,从usertable组按tid>30的userid发送,可以吗?是的,应该可以!这正是HAVINGThank you@GSerg的主要用法之一-Good p