我们写mysql 会为表达式列 增加别名,但这个别名 在什么时候才能使用呢?
举例
select goodsid,total/qty as price from bill where price >1000
这条语句肯定会报错的。我们就可以得到 select 部份的执行顺序是在where 后面的
一个SQL 语句的执行顺序是咋样的,对我们写SQL有哪些影响?
下面列出select 语句的执行顺序。
(7) SELECT (5)?
(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) ?
(6) HAVING <having_condition> (7)?
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
但我们在实际使用my sql 中发现 在 group by 与having的时候 是可以使用列的别名的。
但在sql server 中你会发现,是严格按照上面的顺序来的 group by 与having中 是不能使用列的别名的
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
官网上找到答案
是mysql 单独对 group by 与having子句进行了扩展,可以使用别名。
了解了select 的执行顺序,对我们开发有什么影响呢?
1、不会出现开头的语法错误
2、了解了执行顺序,可以用伪列 做一些小技巧
CREATE TABLE `NewTable` (
`id` int NOT NULL ,
`a` int NOT NULL ,
`b` int NOT NULL ,
`c` int NOT NULL ,
`d` int NOT NULL ,
PRIMARY KEY (`id`)
)
;
drop procedure if exists idata;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=100;
while(i<=100000)do
insert into NewTable values(i,i, i,i,i);
set i=i+1;
end while;
end;;
delimiter ;
call idata();
-- 生成自定义序号
select id,(@a := @a + 1) as xh from newtable,(select @a :=0 ) as t;
了解了 select 执行顺序,就能利用执行顺序写出漂亮的SQL 比如这道传说中的鹅厂面试题
传送门 https://www.jianshu.com/p/8e452e18a8fc