了解一下MySQL中SQL的执行顺序。
我们写sql一般这样写:
SELECT FROM JOIN ON where group by HAVING ORDER BY LIMIT
但是MySQL是这样读的:
FROM ON JOIN WHERE group by HAVING SELECT ORDER BY LIMIT
看关键词,FROM子句在WHERE子句之前执行,而WHERE子句在SELECT子句之前执行。
做一个简单测试,在where子句引用使用了别名的列。
先看一条sql语句
select ename as name, sal as salary from emp where salary > 3000;
sal字段使用了别名salary,where子句中引用了它,看一下执行效果。
mysql> select ename as name , sal as salary from emp where salary > 3000;ERROR 1054 (42S22): Unknown column 'salary' in 'where clause'
报错了,emp表没有salary这个字段。
因为WHERE子句是在SELECT之前进行处理的,这样在处理WHERE子句之前,salary和name都不存在,要等WHERE处理完成之后,别名才生效。
这个问题可以使用内联视图解决:
select * from ( select ename as name,sal as salary from emp)x where salary > 3000
看一下执行结果
结果是正确的。
因为FROM子句是在WHEE之前处理的,将原查询放在FROM子句中,那么在最外层的WHERE执行之前,别名已经生效,而且,其实此时已经生成了查询结果。
以上SQL中内联视图也要有别名,可能不是所有的数据库都需要,但 MySQL是必须的,否则会报错。
将SQL中内联视图别名x去掉测试一下:
mysql> select * from ( -> select ename as name,sal as salary from emp -> ) -> where salary > 3000;ERROR 1248 (42000): Every derived table must have its own alias
好了,关于SQL执行顺序简单了解到此。