sql advantage 执行sql_SQL的执行顺序

了解一下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

看一下执行结果

74f8f3d08b0d09b38c3d45af173d1a4e.png

结果是正确的。

因为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执行顺序简单了解到此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值