inner join where 與 in select from where 的區別

時間 2021-06-04 12:35:49

1樓:黃贇

條件判斷的作用,是一致的,即達到的目的相同,都是用 user id 來過濾 test id .

但返回的結果集有可能就不同了。這一點回答中已經提到了。關鍵一點是兩表關聯查詢與單錶查詢的區別。

兩表查詢的返回結果受制於關聯(Join )條件。單錶查詢的返回僅僅受限於判斷條件 where. 如果在第一句 SELECT 語句上加入 Distinct 那就和第二句沒有區別了(name 和 test_id 是唯一約束的情況下)。

執行計畫方面,兩表關聯查詢與子查詢的最終計畫,都會分解為 inner loop 表與 outer loop 表的關聯遍歷,逃不出 nested loop join, merge join, hash join 演算法,最後選擇哪一種,取決於索引和資料傾斜。

我的回答僅限於 SQL Server .

2樓:Wesley wei

兩個語句是有區別的。

首先如果test_id不是唯一主鍵,兩個語句得到的結果也可能不同。因為inner join是a表和b表進行笛卡兒積,若是b表中同乙個user_id有多條記錄的test_id和a表中的test_id相等,則會產生比in更多的記錄。

再是兩種寫法在資料庫引擎(比如MySQL)的內部實現也有些區別,對於inner join,資料庫引擎會根據on後的結果將兩張表進行笛卡兒積存在一張虛擬表中再對where條件進行過濾。而對於in則會將其轉換成exists對a表進行迴圈過濾。所以對於a表來說,其實是全表掃瞄的。

如果test_id是唯一主鍵的情況,建議用inner join寫法,mysql優化器更擅長此類的優化。

3樓:

其實沒有區別的,一般優化器都會把子查詢改寫為Join的,如果哪個優化器沒有改寫,那效能也會慢的沒誰了。如果子查詢的表特別小,能夠全部載入到記憶體,能夠自動改寫為or,進而改寫為union的話就會更好了。

考研與德勤與CPA

有關係VIP進四大不是分分鐘的事嗎?既然都VIP了,自己又想去德勤,考研無非也就是給自己乙個考CPA的時間吧。三年研究生讀出來第一年基本工資就比本科高300塊,個人感覺本科能去就沒必要拖到研究生了,而且你VIP,我就不信小黑會有敢delay你的。匿了。 我在銀行工作,推薦你去德勤,辛苦了還有結果,銀...

與自己對話 反思與行動

高效人生手冊 人唯一完整擁有,可以完全控制的東西,只有自己!包括自我的身體,意志和行為。我們要承認自己的孤獨,容易走極端。往大處看容易陷入無力,虛無感,人存在沒有意義,到頭來一場空,何必努力。往小處看,盡是芝麻綠豆小事,索然無味,陷入如此平凡之生活中,有何樂趣。所以每個人都會不自覺地尋找存在感,找到...

電子與通訊 資訊與通訊?

Marie 在我的學校 重慶郵電大學 這只是專碩和學碩的區別。在研究生階段,二者只有畢業要求不同和學碩可以讀博的區別。具體做什麼方向只與導師的方向有關。 yan li 乙個偏硬體,乙個偏軟體,搞電子的可以去搞電路,半導體,晶元,搞資訊的可以了解信源編碼,加密解密,協議信令,至於樓上說需要好老師的,我...