Sql 在标准关系数据库中使用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

我在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_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查询不是逐子句执行的,而是逐子句分析的。对于通用条款,顺序为:

  • 来自
    。这定义了表别名
  • 其中
    。过滤行
  • 分组依据
    。定义行
  • 选择
    。定义列别名
  • 具有
    。存在
    分组依据时过滤行
  • 订购人
    。对结果集进行排序
  • 限制
    /
    取数
    。限制行数
此顺序可能会因数据库的不同而略有不同(下面将详细介绍)

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

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


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

have
是在
groupby
之后进行过滤的。SQL查询不是逐子句执行的,而是逐子句分析的。对于通用条款,顺序为:

  • 来自
    。这定义了表别名
  • 其中
    。过滤行
  • 分组依据
    。定义行
  • 选择
    。定义列别名
  • 具有
    。存在
    分组依据时过滤行
  • 订购人
    。对结果集进行排序
  • 限制
    /
    取数
    。限制行数
此顺序可能会因数据库的不同而略有不同(下面将详细介绍)

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

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


在某些数据库中,可以在
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