当前位置: 首页 > 面试题库 >

别名在何处与具有之间的区别

柴昆杰
2023-03-14
问题内容

如果我在select子句中创建别名,则不能在where子句中使用它,因为根据sql查询的执行顺序位于where前面select

但是我可以在select子句中创建别名,并在子句中使用它,having尽管having它早于select

为什么会这样呢?

前任:

select type, (case when number>25 then 1 else 0 end) inc 
from animals
where inc='1';

这不会工作。但,

select type, (case when number>25 then 1 else 0 end) inc 
from animals
having inc='1';

这行得通。为什么这样?


问题答案:

基本上是因为它们是出于不同目的而定义的。该WHERE子句用于记录过滤,该HAVING子句设计用于通过 聚合函数GROUP BY)进行过滤。在第二个查询中,GROUP BY正在使用隐式过滤,因此,例如,如果将另一列添加到SELECT子句中,最终将得到不同的结果。

编辑 基于马丁·史密斯(Martin Smith)的更正

HAVING创建允许过滤产生的行GROUP BY。如果未GROUP BY指定no ,则将整个结果视为一个组。

如果既未指定a<where clause>也未<group by clause>指定a,则令T为前一个的结果<from clause>

或者

…如果未<group by clause>指定,则该组为整个表格

编辑2 现在关于ALIAS:

有关搜索条件中列引用的WHERE子句的规范说:

<column reference>直接包含在中的每个<search condition>应明确引用T 或作为外部引用。

请参阅:7.6<where clause>,语法规则1。

有关搜索条件中列引用的HAVING子句的规范说:

<column reference>直接包含在中的 每个<search condition>应明确引用T 的分组列 或作为外部引用。

请参阅:7.8<having clause>,语法规则1。

分组列 被定义为:

在a中引用的列<group by clause>是分组列。

因此,总而言之,WHERE必须引用表的一列,而HAVING子句必须引用行组的分组列。

(第二次非正式审核草案)ISO / IEC 9075:1992,数据库语言SQL-
1992年7月30日



 类似资料:
  • C# 最吸引人的地方是它与 Java 的区别而不是它们之间的相似性。下面就来介绍一下 C# 与 Java 之间的区别: 序号 Java C# 1 Java 是 Oracle 开发的一种高级、健壮、安全和面向对象的编程语言 C# 是微软开发的在 .Net Framework 上运行的一种面向对象的编程语言 2 Java 语言需要在 Java 运行环境(JRE)下运行  C# 语言需要在公共语言运行库

  • 本文向大家介绍Where 与 Having之间的区别,包括了Where 与 Having之间的区别的使用技巧和注意事项,需要的朋友参考一下 SQL查询中使用的两个关键字“ Where”和“ Having”都是用于根据给定条件过滤和汇总从数据库中检索到的数据。 根据两个关键字的特征,我们可以区分Where和Have,如下所示: 序号 键 where having 1 定义 SQL查询中的WHERE子

  • Mockito框架中的和有什么区别?

  • 我正在尝试添加菜单在我的应用程序中,我发现,当它工作时,如果它扩展AppCompattivity,但不是如果它扩展Activity。是菜单中没有任何活动可用的东西吗?人们说Activity是基本的,而appcompatition是后来发展起来的东西,有什么好的理由我应该使用Activity而不是appcompatition吗?由于AppCompattivity是默认的,但在我的学习中,建议选择Ac

  • 我现在学硒,遇到了一个问题。 我知道Selenium默认支持旧的Firefox版本,没有驱动程序。对于Firefox的最新版本,我们必须下载驱动程序并使用定义它。 根据此链接,对于Firefox45和46,启动驱动程序代码可能如下所示: 此外,我还看到过这样的代码: 我的第二个问题是和或者和之间有什么区别?