嵌套SQL我有一個SQL,看起來像這樣:MySQL的:使用
SELECT * FROM foo WHERE foo.bar IN (SELECT foobar.bar FROM foobar)
這是不好的,對不對?嵌套的SELECT會導致事情變慢?我應該如何查詢這樣的內容?
嵌套SQL我有一個SQL,看起來像這樣:MySQL的:使用
SELECT * FROM foo WHERE foo.bar IN (SELECT foobar.bar FROM foobar)
這是不好的,對不對?嵌套的SELECT會導致事情變慢?我應該如何查詢這樣的內容?
IN子句是完全有效的SQL,但並不總是首選的方法。我經常發現MySQL的性能很差,即使foo.bar
被索引。
如果將其更改爲連接,那麼如果第二個表的多個行與第一個表的每行的連接條件相匹配,則必須小心,因爲連接將生成多個結果行。如果這是可能的,連接應該是:
SELECT f.*
FROM foo f
INNER JOIN (SELECT DISTINCT bar FROM foobar) fb USING (bar);
最終的答案是,你應該使用EXPLAIN來看看不同形式的查詢將被執行。但是,如果您一開始沒有遇到性能問題,請不要冒汗。
如果你希望所有的地方f.bar
不不在foobar
存在行,NOT IN
通常是把它寫的最簡潔的方式。但它也可以使用LEFT OUTER JOIN
這樣寫:
SELECT f.*
FROM foo f
LEFT OUTER JOIN foobar fb USING (bar)
WHERE fb.bar IS NULL
你不需要在這種情況下,子查詢,因爲你只報告不匹配行,所以顯然不能在多場比賽結果。
我可能會將它切換到'SELECT DISTINCT f。* FROM foo f JOIN foobar fb USING(bar)'使它更容易閱讀。這種方式沒有嵌套查詢。 –
偉大的一點。我只是在考慮它的一面。 –
如果我想'foo'中的所有記錄'foo.bar'在'foobar.bar'中不存在? – StackOverflowNewbie
您也可以重寫此爲
Select
*
From
foo f
Where
Exists (-- If you want the opposite, put Not in front here
Select 'x'
From foobar fb
Where f.bar = fb.bar
);
多年來,不同的DBMS已經在不同形式的一個處理的查詢更好,即使他們都是等價的。我嘗試過的大部分功能都可以爲兩者生成相同的計劃。不過我沒有嘗試過使用mysql。
雖然嵌套SQL不相關。您可以查看LEFT JOIN並過濾右欄的NULL記錄。 –