Oracle 等中的 group by与where 子句不能使用别名的原因与解决办法

SQL执行顺序与核心子句原理:从WHERE到GROUP BY的底层逻辑 SQL不是按书写顺序执行的编程语言,而是一种基于关系代数的声明式查询语言。其本质是数据在执行引擎中按固定阶段(FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT)逐层转换的过程。理解这一执行链,是掌握性能优化、避免语法错误和保障结果一致性的前提。例如,WHERE无法使用SELECT别名或聚合函数,正是因其执行早于SELECT和GROUP BY;而HAVING必须紧随GROUP BY之后,才能对分组结果进行过滤。结合真实生产场景中的慢查询、NULL处理、时区陷阱与 阅读详情

下面的语句执行的话会报错:ORA-00904: "CALLT": 标示符无效

select case when ta.call_time = 0 then 0
    when ta.call_time <= 6 and ta.call_time > 0 then 1
    when ta.call_time <= 60 and ta.call_time > 6 then 2
    when ta.call_time <= 3600 and ta.call_time > 60 then 3
    else 4 end as callt,
      count(ta.annoyanceid) as counts 
from t_annoyance ta
group by callt;

Sql语句执行顺序为:

(7)    SELECT

(8)    DISTINCT <select_list>

(1)    FROM <left_table>

(3)    <join_type> JOIN <right_table>

(2)    ON <join_condition>

(4)    WHERE <where_condition>

(5)    GROUP BY <group_by_list>

(6)    HAVING <having_condition>

(9)    ORDER BY <order_by_condition>

(10)   LIMIT <limit_number> 

(7)之后,比如order中,distinct中。

这是因为在SQL执行的时候,WHERE和GROUP语句在字段分类之前就已经执行了,在此期间,别名还没有生效,因此找不到指定别名的字段,报错。

除了聚合函数之外的表达式不仅仅是一个字段,所以用别名代替,这种情况怎么写呢?有三种方法。

方法一,只写表达式中存在的字段

select case when ta.call_time = 0 then 0
    when ta.call_time <= 6 and ta.call_time > 0 then 1
    when ta.call_time <= 60 and ta.call_time > 6 then 2
    when ta.call_time <= 3600 and ta.call_time > 60 then 3
    else 4 end as callt,
      count(ta.annoyanceid) as counts 
from t_annoyance ta
group by ta.call_time;

方法二,将表达式都写入group by子句

select case when ta.call_time = 0 then 0
    when ta.call_time <= 6 and ta.call_time > 0 then 1
    when ta.call_time <= 60 and ta.call_time > 6 then 2
    when ta.call_time <= 3600 and ta.call_time > 60 then 3
    else 4 end as callt,
      count(ta.annoyanceid) as counts 
from t_annoyance ta
group by case when ta.call_time = 0 then 0
    when ta.call_time <= 6 and ta.call_time > 0 then 1
    when ta.call_time <= 60 and ta.call_time > 6 then 2
    when ta.call_time <= 3600 and ta.call_time > 60 then 3
    else 4 end;

方法三,将表达式放入子查询

select t1.callt,
      count(t2.annoyanceid) as counts 
from (<strong>select case when ta.call_time = 0 then 0
    when ta.call_time <= 6 and ta.call_time > 0 then 1
    when ta.call_time <= 60 and ta.call_time > 6 then 2
    when ta.call_time <= 3600 and ta.call_time > 60 then 3
    else 4 end as callt
      , ta.annoyanceid 
      from t_annoyance ta) t1
      , t_annoyance t2
where t1.annoyanceid = t2.annoyanceid
group by t1.callt;

注意:
           在mysql中,group by中可以使用别名;where中不能使用别名;order by中可以使用别名。其余像oracle,hiving中别名的使用都是严格遵循sql执行顺序的,groupby后面不能用别名。mysql特殊是因为mysql中对查询做了加强。

原文参考:https://blog.youkuaiyun.com/qq_26442553/article/details/80867076 
原文参考:https://blog.youkuaiyun.com/crazyultimate/article/details/46778393 

量子计算入门指南:密度算符的核心概念与应用解析 本文深入解析了量子计算中密度算符的核心概念与应用。作为描述量子系统“状态的状态”的关键数学工具,密度算符能有效处理混合态与子系统描述,是理解量子噪声、量子纠错和开放系统演化的基石。文章通过对比纯态与混合态,阐释了密度矩阵的数学定义与物理意义,并结合代码示例演示了其在实际量子计算问题中的强大威力。 阅读详情

相关推荐

win10任务栏文件夹设置成竖形列表样式

win10任务栏文件夹设置成竖形列表样式

ftzchina的博客 7073

oracle 用别名分组,SQL – 在Group By中使用别名

SQL按照如下顺序执行查询:FROM子句WHERE子句GROUP BY子句HAVING子句SELECT子句ORDER BY子句对于大多数关系数据库系统来说,这个顺序解释了哪些名称(列或别名)是有效的,因为它们必须在前面的步骤中引入。因此,在Oracle和SQL Server中,不能在SELECT子句中定义的GROUP BY子句中使用一个术语,因为GROUP BY是在SELECT子句之前执行的。但是...

weixin_39782433的博客 2227

RPA机器人技术原理初探

RPA初步

曲折旅程,艰难人生 2136

MySQL和Oracle中别名的使用规则

MySQL和Oracle中别名的使用规则

menglinfan的博客 1446

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

大话西游2单机版V8一键架设教程:5分钟搞定GM权限和仙玉修改(附完整物品代码表)

本文详细讲解了大话西游2单机版V8的一键架设教程,包括5分钟快速配置GM权限、仙玉修改及物品代码使用技巧。通过分步指导和服务端配置详解,帮助玩家轻松掌握游戏管理功能,重温经典回合制体验。附完整物品代码表,助你快速获取稀有道具和神兽。

weixin_42557830的博客 1224

23c 新特性之基于别名的GROUP BY

从Oracle Database 23c开始,Oracle数据库支持基于别名的GROUP BY操作,相较于之前的数据库版本经常遇到在GROUP BY 后面不能跟字段别名的情况,如果是一个比较复杂的表达式,在GROUP BY 后面输入,不太方便,很多时候,认为ORDER BY 后面都可以跟字段别名,或字段顺序号,那GROUP BY 后面也可以,但是实际上是不支持的。因此在23c推出以基于表达式的别名或者它在 SELECT 列表中的位置指定 GROUP BY 和 HAVING 操作,从而简化了SQL写法。

weixin_42329915的博客 454

Windows Server 2019 服务器一天之中内存利用率越来越高直到死机,疑似内存泄漏

环境: 华为桌面云虚拟机 Windows Server 2019 版本1809 OS内部版本17763.107 问题描述: Windows Server 2019服务器 一天之中内存利用率越来越高直到死机,不断扩容内存从10G到16G一重启就正常然后慢慢又循环,连续几天都这样,疑似内存泄漏 内存泄漏是什么? 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 5392

为什么group by后面不能使用列的别名

同事工作中遇到一个问题: select   count(billingdate),to_char(billingdate,'YYYYmm') month from tu_trade where to_char(billingdate,'YYYY') ='2017'and reportstat = 30 group by month;  -----执行报错,can't resolve mo...

涤生大数据 2万+

手把手教你学SOC芯片架构--NoC(片上网络,Network on Chip)全方位解析

​、​。

MHD0815的博客 862

RK3588 ENV 环境配置之 fw_printenv

RK3588 ENV环境配置指南 本文详细介绍了在RK3588平台上配置ENV环境变量的完整流程。首先需要在parameter分区表中划分env分区,然后在U-Boot中配置MMC偏移地址。接着编译fw_printenv工具并部署到目标设备,配置fw_env.config文件指定存储位置。重点解决了内核中读写ENV时遇到的CRC校验问题,通过U-Boot的saveenv命令初始化环境变量存储区域。最后展示了如何使用fw_printenv/fw_setenv工具在内核中读写ENV变量,并建议将配置集成到根文件

501846585_QQAndroid_java 1030

ORA-00904:group by 报错标识符无效

相信很多同学在使用group by时都有遇到提示标识符无效的问题,别急,下面我们来总结一下遇到此类问题的常见解决方法: 例:取每个部门年龄最小的员工信息 我的sql语句如下: select name,min(age),(select deptname from dept d where d.deptid=uif.deptid)deptname from userinfo uif group by name,deptname 点击执行时,系统提示: ORA-00904:"deptname":标识符无效 出

weixin_37962206的博客 2470

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2630

oracle 别名执行不了,Oracle 等中的 group by与where 子句不能使用别名的原因与解决办法...

下面的语句执行的话会报错:ORA-00904: "CALLT": 标示符无效select case when ta.call_time = 0 then 0when ta.call_time <= 6 and ta.call_time > 0 then 1when ta.call_time <= 60 and ta.call_time > 6 then 2when ta.c...

weixin_36382556的博客 1388

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Oracle pl/sql中的group by子句不能使用别名,应该这样写。

下面的语句执行的话会报错:ORA-00904: "CALLT": 标示符无效 select case when ta.call_time = 0 then 0 when ta.call_time 0 then 1 when ta.call_time 6 then 2 when ta.call_time 60 then 3 else 4 end as call

JCrazyUltimate的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

sql语句中where、group by、having、order by 是否可以使用别名

sql中关于别名的使用

weixin_57129977的博客 4152

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

sql的执行顺序 & 为什么group by后面不能使用列的别名

Sql语句执行顺序 (1)FROM <left_table> (2)ON <join_condition> (3)<join_type> JOIN <right_table> (4)WHERE <where_condition> (5)GROUP BY <group_by_list&...

littlecarton的博客 1630

Oracle分组查询关于where、group by 、having的使用

--分组查询 --查询出每个部门的平均工资 --分组查询中,出现在group by 后面的原始列,才能出现在select后面 --没有出现在group by后面的列,想在select 后面出现必须加上聚合函数。 --聚合函数有一个特性,可以把多行记录变成一个值 select e.deptno,avg(e.sal) from emp e group by e.deptno; --查询出平均工...

qq_34721292的博客 8742

mysql where为什么不能使用别名_SQL语句Where中不能使用别名作为判断条件

当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件.例如下面的SQL语句:selectid,(c1+c2)assfromt1wheres>100SQL Server 报错:"列名 s 无效"当然,写成selectid,(c1+c2)assfromt1where(c1+c2)>100就没问题了....

weixin_28007513的博客 6757

Oracle之group by及order by详解

group by XXX :以XXX进行分组 order by  YYY:以YYY进行排序 一,如果一个查询中使用了分组函数,任何不在分组函数中的列或表达式必须要在group by中, 且group by语句中不能使用别名否则出错。               注:在having,where,group by子句中不能使用别名,但在order by 字句中可使用别名  oracle ...

qq_41675254的博客 2万+

sql中group by为什么无法使用别名

目录sql执行顺序sql中group by为什么不能使用别名 sql执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_

weixin_44158741的博客 1639

ORACLE Group by 总结

许多人在刚开始使用GROUP BY语句的时候经常都会碰到一些错误。刚刚在网上看到一篇关于GROUP BY的文章,觉得不错,转过来学习学习,下面再加上一些自己的看法。 ================================================================================== Oracle Group By 用法之 —— Hav

朝着梦想 渐行前进 2970

查询语句中select from where group by having order by的执行顺序

查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select–from–where–group by–having–order by 其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from–where–group by–having–select–order by, from:需要从哪个数据表检索数

yechengchao的博客 3584

SQL语句中,为什么where子句不能使用列别名,而order by却可以?

转自:http://www.cnblogs.com/dwfbenben/archive/2013/09/07/3307941.html当我们使用某个表达式作为输出的一列时,我们无法在Where条件中直接使用该列作判断条件. 例如下面的SQL语句: select id, (c1 + c2) as s from t1 where s > 100 运行会报错: “列名 s 无效”

Paranoidyang的博客 8670

mysql group by 别名_为什么group by后面不能使用别名(除MySQL)

同事工作中遇到一个问题:select count(billingdate),to_char(billingdate,'YYYYmm') monthfrom tu_tradewhereto_char(billingdate,'YYYY') ='2017'and reportstat = 30group by month;-----执行报错,can't resolve month...........

weixin_42373103的博客 2762

[转]为什么group by后面不能使用别名(除MySQL)

同事工作中遇到一个问题: select count(billingdate),to_char(billingdate,'YYYYmm') month from tu_trade whereto_char(billingdate,'YYYY') ='2017'and reportstat = 30 group by month; -----执行报错,can't resol...

weixin_30835933的博客 985
上一篇: Java 最常见的 208 道面试题(含答案)之五
下一篇: Javascript 严格模式详解
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值