[英]What' the difference between these 2 sql commands?
select * from StudySQL.dbo.id_name n
inner join StudySQL.dbo.id_sex s
on n.id=s.id
and s.sex='f'
select * from StudySQL.dbo.id_name n
inner join StudySQL.dbo.id_sex s
on n.id=s.id
where s.sex='f'
結果是相同的。 那么他們之間有什么區別嗎?
我做了一些更有趣的嘗試。
select * from StudySQL.dbo.id_name n
1 | baby
3 | alice
select * from StudySQL.dbo.id_class c
1 | math
3 | physics
3 | english
4 | chinese
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name='alice'
name id id class
baby 1 NULL NULL
alice 3 1 math
alice 3 3 physics
alice 3 3 english
alice 3 4 chinese
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name='baby'
name id id class
baby 1 1 math
baby 1 3 physics
baby 1 3 english
baby 1 4 chinese
alice 3 NULL NULL
select * from StudySQL.dbo.id_name n
left join StudySQL.dbo.id_class c
on n.name<>''
name id id class
baby 1 1 math
baby 1 3 physics
baby 1 3 english
baby 1 4 chinese
alice 3 1 math
alice 3 3 physics
alice 3 3 english
alice 3 4 chinese
因此,我想說合理的是,on子句確定應連接的行 。 而where子句決定應返回哪些行 。
如果是這樣, 我認為最好在on子句中編寫詳細的限制,以便需要連接的行更少。 因為加入是一項昂貴的操作。
這是一個INNER JOIN
沒有什么區別,但是如果使用OUTER JOIN
,結果將大不相同。 與LEFT OUTER JOIN
,第二個查詢將隱式成為INNER JOIN
。
通過使用AND
,謂詞可以確定s中的行何時應連接到n。 在內部聯接中,此處的否定結果將防止同時省略n和s面。
ON子句用於指定表之間的關系,WHERE子句用於指定過濾條件。 在這種情況下,可能是結果/性能問題更多是概念上的問題。
在此可以找到有關此主題的一些有趣的討論:
它們應始終返回相同的結果,但由於刪除過濾后的行時,它們可能會導致查詢計划和性能略有不同。 此行為將完全取決於您所使用的服務器。
就像Marc Romero所說的那樣,ON子句用於指定表之間的關系,WHERE子句用於指定過濾條件。 在此特定查詢中,您將看到相同的結果,但在其他查詢中,如果您不了解它們之間的差異,則可能會得到意外的結果。 考慮以下查詢(您使用LEFT JOINS而不是INNER的查詢):
SELECT *
FROM StudySQL.dbo.id_name n
LEFT JOIN StudySQL.dbo.id_sex s ON n.id=s.id AND s.sex='f'
SELECT *
FROM StudySQL.dbo.id_name n
LEFT JOIN StudySQL.dbo.id_sex s on n.id=s.id
WHERE s.sex='f'
第一個將返回來自StudySQL.dbo.id_name的信息以及來自StudySQL.dbo.id_sex表的信息,該表與具有性別'f'的任何記錄相關聯。 第二個將返回所有名稱,但是只有性別為“ f”的名稱才會填充來自StudySQL.dbo.id_sex的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.