首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标准关系型数据库管理系统的使用规则

标准关系型数据库管理系统的使用规则
EN

Stack Overflow用户
提问于 2018-12-08 01:14:53
回答 2查看 81关注 0票数 0

我在Google BigQuery中做了一些测试,发现:我可以在没有错误的情况下使用列别名。

代码语言:javascript
复制
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呢?

代码语言:javascript
复制
SELECT
  geoNetwork_city as total_CITY
FROM
  tablename
HAVING 
 total_CITY not like 'NEW YORK'

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-08 13:16:44

HAVINGGROUP 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,也许还有其他几个)。

票数 2
EN

Stack Overflow用户

发布于 2018-12-08 01:19:02

下面是用于BigQuery标准SQL的

WHERE是在之前应用HAVING,而HAVING是在 SELECT with GROUP BY之后应用,所以别名对于HAVING是可见的-这就是为什么您看不到任何错误,因为它是正确的。

此外,HAVING也适用于使用GROUP BY的情况,否则您将得到如下所示的错误

代码语言:javascript
复制
The HAVING clause requires GROUP BY or aggregation to be present   

所以,下面会产生错误

代码语言:javascript
复制
#standardSQL
SELECT geoNetwork_city as total_CITY
FROM `project.dataset.tablename`
HAVING total_CITY not like 'NEW YORK'

在下面工作的时候

代码语言:javascript
复制
#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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53678643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档