通过考试了解 SQL 代码

Understanding SQL code from an exam

我在之前的数据库课程考试中遇到了这个问题。 这个问题应该在考试的 10 分钟内回答。 我知道规则和 material,但有人可以向我解释如何处理这个问题吗?好像很深,不知道怎么拆分,搞得这么乱。

非常感谢。

问题是:这段代码的输出是什么? (答案:(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;

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

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

现在去找它的父...你没看错吧?????不错。

"not exists ..." 是一个 correlated subquery 并且对外部 select:

结果集中的每一行进行评估
select T1.a, T1.b, count(*)
from T T1, T T2
where T1.b = T2.b 
--------------------
group by T1.a, T1.b;

其中 return 个:

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

以上结果的每一行都根据子查询进行评估。最里面select:

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

returns 一个 T.b 的列表,其中 b >= 上述结果集的 b。如果 T1.b = 2 returned 列表是 (2,2,3,4) 而 T1.b = 3 returns (3,4) and T1.b = 4 returns (4).

现在,如果 "middle" 查询:

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

外部查询结果中的特定行没有 return 值,该行将显示在最终结果集中。

因为当T1.b = 2时最内层的查询只有return所有的b值,当T1.b = 2时中间的查询只有return的null。只有( 1,2,2) 和 (3,2,2) 有 T1.b = 2,他们被选中了,呸。