关于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的执行语句是非常重要的,尤其是当语句比较复杂和庞大的时候,这样就不会特别的混乱了。

最懒的人就是整天忙得没时间学习、反思、成长的人。
原文地址:https://www.cnblogs.com/jockeyhao/p/12122176.html