SQLINとSQLEXISTS
この記事では、SQLのINおよびEXISTS演算子について詳しく説明します。 。これら2つの演算子の違いは何であるかということは、開発者の間でよくある質問です。違いを知るために、まずこれらの各演算子について詳しく説明しましょう。
IN演算子
IN演算子は、指定された値が一連の値の値と一致する場合、または内部クエリによって返される場合に、結果を取得するために使用されます。 この演算子は、 WHEREでも使用できます。 複数の値を指定する句。 IN演算子は、 SELECT、INSERT、UPDATE、またはDELETEクエリでの複数のOR条件の使用を減らすため、OR演算子の頭字語と呼ばれることがよくあります 。
この演算子では、サブクエリが最初に解決され、次にその結果が外部クエリの解決に使用されます。
IN演算子の一般的な構文は次のとおりです。
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
例:
次のCustomerテーブルについて考えてみましょう。
Cust_id | Cust_name | 都市 | 職業 |
1 | ハリー | コルカタ | ビジネス |
2 | ロン | ムンバイ | 医師 |
3 | アルバス | デリー | エンジニア |
4 | ドビー | プネ | 科学者 |
5 | スネイプ | バンガロール | 学生 |
クエリ:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
上記のクエリは、医師、科学者、またはエンジニアのいずれかであるすべての顧客を返します。
出力:
Cust_id | Cust_name | 都市 | 職業 |
2 | ロン | ムンバイ | 医師 |
3 | アルバス | デリー | エンジニア |
4 | ドビー | プネ | 科学者 |
既存のオペレーター
EXISTS演算子は、IN演算子とは異なり、ブール値を返します。 この演算子は、内部クエリの結果をチェックし、ブール値、つまりtrueまたはfalseを返します。内部クエリが単一または複数のレコードを返す場合、演算子はtrueを返します。それ以外の場合、レコードが見つからない場合はfalseを返します。
この演算子は、最初の真のイベントが検出されるとすぐにそれ以上の処理を停止するため、効率的です。
以下は、EXISTS演算子の構文です。
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
例:
次のCustomerテーブルについて考えてみましょう。
Cust_id | 名前 | 職業 | 年齢 |
101 | ハリー | エンジニア | 32 |
102 | ロン | 開発者 | 30 |
103 | ドビー | リーダー | 28 |
104 | アルバス | 科学者 | 45 |
105 | スネイプ | カーペンター | 26 |
106 | 生姜 | 俳優 | 25 |
107 | NULL | NULL | NULL |
別のテーブルOrdersについて考えてみましょう。
Order_id | Cust_id | Product_name | Order_date |
1 | 101 | ラップトップ | 2021-01-10 |
2 | 103 | デスクトップ | 2021-02-12 |
3 | 106 | iPhone | 2021-02-15 |
4 | 104 | モバイル | 2021-03-05 |
5 | 102 | TV | 2021-03-20 |
クエリ:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
上記のクエリは、少なくとも1つの注文を行ったすべての顧客の名前と職業を返します。
出力:
名前 | 職業 |
ハリー | エンジニア |
ロン | 開発者 |
ドビー | リーダー |
アルバス | 科学者 |
生姜 | 俳優 |
IN演算子とEXISTS演算子の差分テーブル
IN演算子とEXISTS演算子の主な違いを以下に表形式で示します。
IN演算子 | EXISTSオペレーター |
OR条件の使用を最小限に抑えます。 | 内部クエリ内のレコードの存在をチェックします。 |
内部クエリの値を外部クエリの値と比較します。 | 内部クエリとサブクエリの値は比較されません。 |
IN句のブロック内のすべての値をチェックします。 | 最初の真の条件が満たされるとすぐに、それ以上の実行を停止します。 |
TRUE、FALSE、またはNULLを返すことができます。 | TRUEまたはFALSEのいずれかを返します。 |
NULL値をチェックするために使用できます。 | NULL値のチェックには使用できません。 |
サブクエリと値の両方で使用されます。 | サブクエリでのみ使用されます。 |
内部クエリの結果が少ないほど、実行が速くなります。 | 内部クエリの結果が大きい場合でも、実行が高速になります。 IN演算子よりも効率的です。 |
構文 :SELECT column_names FROM table_name WHERE column_name IN(subquery); | 構文 :SELECT column_namesFROM table_nameWHERE [NOT] EXISTS(subquery); |
結論:
このトピックでは、SQLのIN演算子とEXISTS演算子を比較しました。両方のオペレーターは同じ操作を行いますが、内部の動作は異なります。それらは異なる論理的働きをします。要件に応じて、いずれか1つを選択できます。ただし、 データセットが大きい場合は、常にEXISTS演算子を使用することをお勧めします。