加入条件和左加入中的条件

Pra*_*uka 1 join

STUDENT 表包含我学校数据库中的学生列表

LIBRARY_BOOK 表包含当前与任何学生一起使用的每本书的信息。

每个学生一次只允许携带一本书。

我想知道

每位 7 年级学生的图书馆图书。

我使用的是 Microsoft SQL Server 2008 R2

我有几个看起来几乎相似但行为方式不同的查询。

查询 1:

Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
WHERE ST.Class = 7
Run Code Online (Sandbox Code Playgroud)

查询 2:

Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
AND ST.Class = 7
Run Code Online (Sandbox Code Playgroud)

查询 3:

Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
AND ST.Class = 7
WHERE ST.Class = 7
Run Code Online (Sandbox Code Playgroud)

有人可以解释这些查询在输出和性能方面的区别吗?

JNK*_*JNK 7

查询1会告诉你所有的记录从student一个Class值7,然后任何相关的Library_Book,如果它们存在的记录。

查询 2 将显示 中的所有记录student,以及相关Library_Book记录(如果它们存在)并且匹配行中的studentaClass为 7。

查询3会告诉你所有的记录studentClass7个值,以及相关的Library_Book记录,如果存在的话。

我希望查询 1 和查询 3 会给你相同的结果,而查询 2 会给你更多的行。

如果不了解您的表结构、数据分布、索引和 RDBMS,则无法谈论性能。我不希望它们有很大不同,因为你的过滤器都是一样的。

  • @PratyushDhanuka 你自己说过:如果查询 1 和查询 3 总是给出相同的输出,**则连接条件是多余的。** 不需要其他任何东西。 (3认同)