2012-01-26 16 views
7

次の2つのコマンドの違いは何ですか?WHEREのINとORのSQLの違い

SELECT * FROM table WHERE id IN (id1, id2, ..., idn) 

SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn 

どちらが速いのですか? idが別のタイプの場合、それは異なるでしょうか?

+0

私たちがここでどのようなSQL実装を行っているか知っているとよいでしょう。 – JNK

答えて

10

彼らは意味的に同じです。

INは、2番目の例のような等価文の文字列の省略形です。パフォーマンスも同じでなければなりません。

タイプは重要ではありません。常に等価の文字列に評価されます。あなたがNULLすることができNOT INとデータを使用している違いがある

、しかし - NULLNOT IN比較のために偽評価しませんので、あなたは、あなたが結果セットに期待していなかった行を取得することがあります。一例として、

:額面でNULLがどちらも'foo'または'bar'であっても上記のクエリが行を返さない

SELECT 'Passed!' WHERE NULL NOT IN ('foo', 'bar')

からNULLが不明な状態であるため、これは、およびSQLは言うことができません未知の値がではなく、であることが確かにINの値の1つです。

+0

'NOT INを使用しているときに違いがあります - - どうして? 'NOT IN' ===' f!= 1 AND f!= 2'。そして、両方の式は同じ(恐ろしい)方法で最適化されます。 – zerkms

+0

@zerkms - 少なくともSQL Serverでは、NULLではありません。 'SELECT 1 '(foo '、' bar ') ' - ' 'NULL'はfooまたはbarでないので、あなたは行を取得しませんが、あなたは期待しています – JNK

+0

ああ、 'NOT IN'を使用するとき、かっこの中に' NULL'があるときは – zerkms

-3

私は、サーバーが処理できるより簡単なクエリを提供するため、INは純粋に高速であると思います。 ちょっと考えました。

この記事のフェルナンド・Giovaniniことで、次のコメントを参照してください、彼はINが速く、それをより読みだけでなく、作ることに言及:http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries#comment-325677194

+1

'%8:0% 'またはsecmatrix LIKE'%8:0% 'またはsecmatrix LIKE'%4:0% 'またはsecmatrix LIKE'のような' secmatrix 'を使用すると、 %2:0% ''を照会してください。それは少なくとも面白い(またはstuid)のように見える;-) – zerkms

+0

個人的に私はあなたが何の証拠も(特にそれが完全に間違っている)ステートメントで未知の人々を参照することはありませんアドバイスをしたい – zerkms

+0

私は、私が言ったことは真実だと言いましたか?私がしたのは私の考えを伝え、記事を参照することでした。だから、複数の人が答えを出し、誰もが自分の意見や経験を持っているのです。概要を見ると、どちら側が勝っているのかが分かります。 –

1

これは、特定のDBMSオプティマイザの実装とエンジン自体に依存します。

しかし、それらが意味的に似ており、同様の方法で最適化されていると考えても問題ありません。

最適化は、両方とも同じ実行計画を与える

1

少なくとものSQLServerにフィールドタイプに依存していないでしょう!

+0

私は、チューニングの面で質問していると思います。 – blong

+0

@Brianは私のアンサー不完全ですか?どのような言葉でも、クエリーは同じですが、可読性を除いては同じです。 –

+0

@Brian L .: "どちらが速いのですか?" ---これははっきりした質問であり、この答えは明らかに部分的に答えます(私はそれが好きではありませんが;-)とにかく+1 – zerkms

0

十分な信頼性を持つすべてのDBMSは、データ構造のためにIN演算子の方がずっと優れています。 さらに、dbがsqlプランを計算するとき、OR演算子が異なる条件を完全に組み合わせる可能性があるため、必ずしもOR形式をIN形式に変換するとは限りません。 論理的な観点からは全く同じです。