我是否正确地说明大多数嵌套子查询可以与union
,intersect
等集合运算符互换,因为它们会给出相同的结果。问我发现集合运算符更容易使用,并且更愿意在我即将开始的考试中使用嵌套子查询。
E.g。
SELECT DISTINCT course id
FROM section
WHERE semester = ’Fall’
AND year = 2009
AND courseid IN (SELECT course id
FROM section
WHERE semester = ’Spring’ AND year = 2010);
得到的结果如下:
(SELECT course id
FROM section
WHERE semester = ’Fall’ AND year = 2009)
INTERSECT
(SELECT course id
FROM section
WHERE semester = ’Spring’ AND year = 2010);
答案 0 :(得分:0)
选择编码方法完全取决于组织中遵循的编码实践。虽然他们中的大多数已经定义了关于编码的指导方针,但他们通常会根据个人喜好让开发人员选择您的案例。因此,只要查询给出正确的结果,没有人会打扰你是否使用了集合运算符或子查询。
还有一种编写代码的方法,您似乎忽略或忘记了这些方法。您可以使用连接并进一步最小化代码行。它将如下:
SELECT DISTINCT s1.course_id
FROM section s1 INNER JOIN section s2 ON s1.courseid = s2.courseid
WHERE s1.semester = 'Fall'
AND s2.semester = 'Spring'
AND s1.year = 2009
AND s2.year = 2010;
此外,正如Szymon在上面的评论中提到的,子查询具有更广泛的用途。其中一个是相关子查询。子查询的另一个很好用途是内联视图。谷歌他们两个并尝试在你的工作中应用这些概念(如果你不是仅仅为大学作业而是为了学习编码)。
答案 1 :(得分:0)
我对我自己的一些数据进行了快速检查,只是为了验证和使用你的两个例子,我得到了相同的结果,至少在这些例子的范围内,确认它们是相同的。
为了考试,我认为你没事。
然而,在现实世界中,这两个陈述通常会产生不同的执行计划。编写关于这些的具体建议有点困难,因为表格设计和数据大小在所有系统之间都是不同的。但是,虽然您可能会觉得这些结果返回相同的结果,但它有点类似于:
SELECT * FROM mytable
VS
Select column1, column2, column3 FROM mytable
对于第一个那里,性能(和执行计划)对于数据量很少的小表可能是相同的,但随着它的增长,你将开始通过写短手来节省几秒钟的成本代码。
如果你四处搜索,你会发现有INTERSECT性能问题的人;我没有看到任何人在INTERSECT上表现出比使用子查询替代品更好的表现。