有一张shop比表  3个字段分别是物品 , 经销商,价格.然后手册中给了一个这样的例子和解答这是按它给的SQL语句得到的查询结果.
问题:这个结果是怎么产生的?试了一下,这里的where字句用IN得到的查询也是一样的,那么怎么能用=呢,怎么解释?

解决方案 »

  1.   

    in 后面可以跟多个数值,也可以只跟一个值。本例子中,max 函数已经限定了返回值,只有一个,所以用in 也可以。
      

  2.   

    这个查询SQL是一个包含子查询的模式,select * from a where a.XXX ...(select max(b.xxx) from b...)。因为子查询返回的是一个max的结果,即一个值,所以可以使用“a.XXX=”,也可以用“a.XXX in”。当然使用等号查询更快点。
      

  3.   

    关于这个例子我还是没有懂,如果子查询只返回一个值,只返回一个max的结果,那整个查询也只会返回一行记录啊,显然这里返回了4行记录,不就是说明返回了4个max值吗?
      

  4.   

    可我怎么看都觉得是返回个4个max值呢,不然怎么查出4行记录的呢?
      

  5.   

    用in是不对的,比如A商品最高价是10块,B商品的次高价也是10块,用in就会把那个低的10块也取出来
    这种语句想理解它没什么别的好办法,就只能多做多想,时间长了就会了。
    日常工作中,如果没有把握,那就测试,通过结果检查写的对不对
    或者避免写复杂sql,利用外部语言分解复杂的需求,使用简单sql解决复杂问题
      

  6.   

    我想你还是没理解子查询的含义,子查询与主表逐一按照article字段进行比对,取该article对应的最大值,不是整个表的最大值。
    count(distinct article),有几个值,查询结果就会出现几条记录。理解?
      

  7.   

    因为子查询的max和where确定通过dealer分组来获取每组dealer不同的最大值,max的值每次获取的时候肯定是只有一条的,所以可以用=,因为子查询相当于分组功能,所以每组都会有一个最大值。查询结果就会有这么几条
      

  8.   

    可我怎么看都觉得是返回个4个max值呢,不然怎么查出4行记录的呢?在子查询中,有一个条件 是 s1.xx = s2.xx ,这就是说 s1 表中每一行,都全这样计算一下,每次返回一个值。 所以结果可能是 4 行数据。
      

  9.   

    可我怎么看都觉得是返回个4个max值呢,不然怎么查出4行记录的呢?在子查询中,有一个条件 是 s1.xx = s2.xx ,这就是说 s1 表中每一行,都全这样计算一下,每次返回一个值。 所以结果可能是 4 行数据。
    那既然是这样,但为何可以用=呢?
      

  10.   

    可我怎么看都觉得是返回个4个max值呢,不然怎么查出4行记录的呢?在子查询中,有一个条件 是 s1.xx = s2.xx ,这就是说 s1 表中每一行,都全这样计算一下,每次返回一个值。 所以结果可能是 4 行数据。
    而且这个条件  s1.xx = s2.xx ,s1和s2都是指的同一个表shop啊,这个表达式怎么理解?
      

  11.   

    s1 表中有 4 。首先,取出第 1 行,  xx 列的值也就有了,price 也有了,到子查询中,做一个查询,取到了  max(price) ,再拿这个值 和 s1.price 做比较,条件成立,留下这行,不成立,直接放弃 。  再取 第 2 行。再取 第 3 行。
    4
    5
    610000
      

  12.   


    我无法理解的几点:
    1.在有子查询的情况下,这比如这条例子,它的执行顺序?比如:先from(两个from一起?),where(哪个先?),最后select(哪个先),这个执行顺序?
    2.就按你们所说的,子查询的那句是有4个返回值,是不是相当于把shop表对自身做了一次笛卡尔积,那后面那个where条件变成了两个shop表的联接条件?那max()的分组条件在哪呢?
    3.=和in ,如果子查询有4个返回值,怎么么能用=呢?不该是只能用in吗?
      

  13.   

    我想你还是没理解子查询的含义,子查询与主表逐一按照article字段进行比对,取该article对应的最大值,不是整个表的最大值。
    count(distinct article),有几个值,查询结果就会出现几条记录。理解?
    还是没懂,大佬过来帮忙看下我的新回复,可能是我没把我想问的描述清楚
      

  14.   

    我想你还是没理解子查询的含义,子查询与主表逐一按照article字段进行比对,取该article对应的最大值,不是整个表的最大值。
    count(distinct article),有几个值,查询结果就会出现几条记录。理解?
    还是没懂,大佬过来帮忙看下我的新回复,可能是我没把我想问的描述清楚指出一点,对于这个疑问,你不理解的根本原因在于你是用一个静态的思维去分析这个sql,建议先看看执行计划(explain 你的sql)。
      

  15.   

    我想你还是没理解子查询的含义,子查询与主表逐一按照article字段进行比对,取该article对应的最大值,不是整个表的最大值。
    count(distinct article),有几个值,查询结果就会出现几条记录。理解?
    还是没懂,大佬过来帮忙看下我的新回复,可能是我没把我想问的描述清楚指出一点,对于这个疑问,你不理解的根本原因在于你是用一个静态的思维去分析这个sql,建议先看看执行计划(explain 你的sql)。
    谢谢各位,找到了一点眉目,略懂了,原来嵌套查询的子查询分相关和非相关的,这条是相关子查询,子查询需要跟据主查询而不断的执行而返回结果供主查询使用,而不像我想的都是非相关的,子查询只执行一次.
    其他博客的原话
    1.:非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,并且它是优先于外部查询先执行的,他执行了再执行外部。
    2.相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。并且是外部先查询一次,然后再执行一次内部查询!
    这些我能理解了
    那么我的问题来了:
    1.是不是这样理解:那我说的这个例子中,就意味着主查询和子查询都执行了7次,主查询每查询一次,获得一个结果集,然后按子查询的where条件筛选,返回一个max(),那总共返回了7个max值,另外3个有重复值是自动被过滤了吗