一.sql语句的执行顺序
(7)select
(8)distinct 字段名1,字段名2...
(5)[fun 字段名]
(1)from 表名
(2)inner|left|right|full|cross join on 连接条件
(3)where 筛选条件
(4)group by 分组条件
(6)having 分组后的筛选条件
(9)order by 排序条件
(10)limit <起始偏移量,条目数>
二 having中使用别名
having中可以使用别名,在mysql中使用别名与否可以通过ONLY_FULL_GROUP_BY sql mode设置,5,7,5之前的版本默认不开启,所以不能使用,而之后的版本可以使用。
例如以下语句
select dept_id,avg(sal) a FROM emp GROUP BY dept_id HAVING a>2000;(as可以省略)
即使是中文的也可以(不带引号)
但是如果使用的是中文的别名或者成为字符别名则会存在问题,如下
显示的记录为空,并且提示一个警告信息.
利用show warnings;命令查看警告信息,如下
警告代码为1292,提示信息为 截断错误的double 值.
为什么会出现这个问题?
不知道.使用了的mysql版本是10.3和10.5都是这样,支持中文或者说字符的别名,例如下面的代码
但是字符别名不能在having中使用.
在网上没有找到对应的解释,因此我根据我目前所学的知识猜测原因有两个
1 mysql是支持字符别名的,但是需要在额外的模块中进行设置..就像ONLY_FULL_GROUP_BY sql mode一样.
2 变量存储不一样,"a"与 a的存储形式是不一样的,就跟java中变量的定义类似,"a"是常量而a是变量,它们存储的形式不同,因此调用的形式也不一样,所以不支持.