通过考试了解 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,他们被选中了,呸。
我在之前的数据库课程考试中遇到了这个问题。 这个问题应该在考试的 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,他们被选中了,呸。