SQL关键字执行顺序&MySQL的HAVING

起因是学习群里有朋友提了一个问题,大概意思是这样子的:

 

首先用时间函数对于表中的ARRIVE_TIME进行相减操作,然后再获得需要的与之对应的数据

比如,我想查找表中ARRIVE_TIME距离今天2天的数据

我的第一反应就是

select *,DATEDIFF(now(),bbd.ARRIVE_TIME  ) days from mappertest.bs_business_details bbd where bbd.days  = 2

很遗憾的是反馈出来的是Unknown column

那么这是为什么呢?不是已经查出了days嘛?为什么不能用where去判断?

随后我去百度了一下sql关键字的执行顺序,似乎就有了答案。(引用:https://blog.csdn.net/qq_36381855/article/details/80051265

原来where是在select之前执行的,意思就是where后面的条件,那些字段必须是前面表中已经有的字段,或者是联表中的字段,而不能是通过某些函数、方法计算出来的字段,where是查找不到的;

如果非要使用where进行查询那么我个人的理解是先将查询到的数据搭建为一张临时表,再在临时表中进行查找,代码如下:

select
	*
from
	(
	select
		*, DATEDIFF(now(), bbd.ARRIVE_TIME ) days
	from
		mappertest.bs_business_details bbd ) t
where
	t.days = 628

结果:

但是这种方法看起来难免有点笨重,群友提供了一种新的解决办法:

select
	*,
	DATEDIFF(now(), bbd.ARRIVE_TIME ) days
from
	mappertest.bs_business_details bbd
having
	days = 628


结果又正常了,但是由上图我们可知having的执行顺序也是在select之前的,按理来说会跟where关键字一样报找不到对应列的错误,那么为什么可以呢?

MySQL额外提供了这种场景的解决方案,详细方案可以看官方文档:https://dev.mysql.com/doc/refman/5.7/en/select.html

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值