簡體   English   中英

這2條sql命令之間有什么區別?

[英]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子句用於指定過濾條件。 在這種情況下,可能是結果/性能問題更多是概念上的問題。

在此可以找到有關此主題的一些有趣的討論:

INNER JOIN 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM