了解考试中的SQL代码

时间:2015-03-30 09:28:51

标签: sql database aggregate-functions

我在数学课程的前一次考试中有这个问题。 这个问题应该在考试的10分钟内得到解答。 我知道规则和材料,但有人可以向我解释如何处理这个问题吗?它看起来如此之深,我不知道如何将它分成几部分而且事情变得如此困惑。

非常感谢。

问题是:这段代码的输出是什么? (答案:(1,2,2)(3,2,2))

create table T(a int, b int);

insert into T values(1,2);
insert into T values(1,3);
insert into T values(2,4);
insert into T values(3,2);

select T1.a, T1.b, count(*)
from T T1, T T2
where T1.b = T2.b and 
    not exists (select a 
                  from T T3
                  where b not in(select b 
                                 from T T4
                                 where b >= T1.b))
group by T1.a, T1.b;

2 个答案:

答案 0 :(得分:1)

“not exists ...”是correlated subquery,并且会对外部选择的结果集中的每一行进行评估:

select T1.a, T1.b, count(*)
from T T1, T T2
where T1.b = T2.b 
--------------------
group by T1.a, T1.b;

返回:

Outer query resut

因为值2在T.b中出现两次,所以当b = 2时,该列上的连接会生成两行,但对于唯一值3和4,只有一行。因此计数结果。

针对子查询评估上述结果的每一行。最里面的选择:

select b 
from T T4
where b >= T1.b

返回T.b的列表,其中b> =上述结果集的b。如果T1.b = 2,则返回的列表为(2,2,3,4),而T1.b = 3则返回(3,4),T1.b = 4返回(4)。

现在,如果是“中间”查询:

select a 
from T T3
where b not in (...)

不会在外部查询的结果中返回该特定行的值,该行将显示在最终结果集中。

因为最内层查询仅在T1.b = 2时返回所有b值,所以中间查询仅在T1.b = 2时返回null。仅(1,2,2)和(3,2,2)具有T1 .b = 2并且他们被选中,phew。

答案 1 :(得分:-1)

从内到外开始。 在执行(在您的脑海中)其父查询之前,具有内部查询的结果集。 在你的问题中尝试理解和解决

        select b
        from T T4
        where b >= T1.b

现在转到它的父母......你明白了吗?????好。