因为我是在书上看到的,所以不多说直接贴图看吧!
好,最终的问题就是下面这张图中的sql语句的写法,请注意!!
我想问的问题就是里面那个:
select min(a)-1 from g as c where c.a > a.a )
这句是什么时候执行的?
而且像这种把子查询直接放到一个要输出的列的位置上,那么他的执行顺序是怎么样的??

解决方案 »

  1.   

    这个是查询出的结果:
    这个结果虽然不是太好,但是前两条结果已经出来了。现在问题不在这里所以就不讨论了,问题是:
    ( select min(a)-1 from g as c where c.a > a.a )as end_range
    这条语句放在那个位置的时候它的执行顺序,就是他是什么时候执行??
      

  2.   

    你可以直接 explain select ... 然后查看MYSQL的执行计划。
      

  3.   

    这条语句放在那个位置的时候它的执行顺序,就是他是什么时候执行??详细说明,SQL语句的执行顺序?
    就这条语句
    FROM->WHERE->SELECT 列表
      

  4.   

    这个是执行计划:
    从这个里面可以看出:
     ( select min(a)-1 from g as c where c.a > a.a )as end_range
    是在第二步中执行的是吧?
    然后它每次是要取出 min(a) ,而且他是要执行9行查询,那么这条语句是怎么执行的?因为第一步查询的时候从a表中选择了9行数据出来,那么这步的话就是首先从a表中拿出一条数据然后和g表中的每一行进行比对,但是这里又使用了min这个函数,那么这句:min(a) 他是怎么取的值呢?取最小的?但是从g表中取最小的每次都是1啊!!
    这个怎么解释啊??
      

  5.   

    不是,先从G中取数据,条件是满足WHERE not exists...., ( select min(a)-1 from g as c where c.a > a.a )as end_range
    是从 满足WHERE not exists.... 条件记录集中取值,条件是满足c.a > a.a 你可以先运行 WHERE not exists....,不运行子查询,看看结果是什么
      

  6.   

    我把那个子查询的条件改成 c.a>=a.a之后的结果:
      

  7.   

    START_RANGE=4举例
     A+1为START_RANGE,A为3,在子查询中,
    c.a >3的记录为100 101 103-106,MIN为100,-1为99( select min(a)-1 from g as c where c.a > a.a )as end_range