关于SQL子查询的一个问题
今天在翻看工具书的时候,发现了一个sql语句:
select cust_name, cust_state, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;
在子查询中居然可以直接使用外部的customers表中的cust_id字段进行where条件限制,感觉到好像哪里不对劲。
根据自己之前的理解,子查询中的语句不是应该先执行,然后再执行子查询外部的语句吗?
后来自己试着跑了一下,果然是可以执行的。
然后经过查找和分析之后,得出了原因:
一般来说,子查询是作为限制条件语句放在from 或者 where后面的,也就是说整条sql代码是按照一定的执行顺序的,在上面的这段sql里面,子查询却是作为select的检索内容出现的,因此在执行到子查询语句的时候,from后面的语句已经执行到了,因此可以直接拿customers.cust_id来使用,并不是有子查询就一定先执行子查询中的语句的。
select语句的编写顺序一般为:
select......from......where......group by......having......order by
但是执行顺序为:
from......where......group by......having......select......order by
sql的执行语句是非常重要的,尤其是当语句比较复杂和庞大的时候,这样就不会特别的混乱了。
最懒的人就是整天忙得没时间学习、反思、成长的人。