龙空技术网

SQL的执行顺序

程序学习笔记 2217

前言:

当前姐妹们对“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顺序