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

    最懒的人就是整天忙得没时间学习、反思、成长的人。
  • 相关阅读:
    无向图判断三元环
    POJ 2785 4 Values whose Sum is 0
    lower_bound和upper_bound
    2153: 2018湖南多校第二场-20180407(网络同步赛)
    前缀和、前缀积
    hdu 4686 Arc of Dream
    UVA Recurrences 矩阵相乘+快速幂
    UVA 11149 Power of Matrix 构造矩阵
    poj 1258 Agri-Net prim模板 prim与dijkstra的区别
    poj 1182 食物链 (并查集)
  • 原文地址:https://www.cnblogs.com/jockeyhao/p/12122176.html
Copyright © 2020-2023  润新知