前言:
当前姐妹们对“mysqlsql顺序”大约比较关切,同学们都需要知道一些“mysqlsql顺序”的相关知识。那么小编也在网上汇集了一些关于“mysqlsql顺序””的相关知识,希望看官们能喜欢,咱们一起来学习一下吧!了解一下MySQL中SQL的执行顺序。
我们写sql一般这样写:
SELECT <select_list>FROM <left_table> <join_type>JOIN <right_table> ON <join_condition>where <where_condition>group by <group_by_list>HAVING <having_condition>ORDER BY <ordery_by_condition>LIMIT <limit number>
但是MySQL是这样读的:
FROM <left_table>ON <join_condition><join_type> JOIN <right_table>WHERE <where_condition>group by <group_by_list>HAVING <having_condition>SELECT <select_list>ORDER BY <ordery_by_condition>LIMIT <limit number>
看关键词,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执行顺序简单了解到此。
标签: #mysqlsql顺序