MySQL における EXISTS と IN の使用法の比較

MySQL における EXISTS と IN の使用法の比較

1. 使用法:

(1)EXISTSの使用

ucsc_project_batch a から、存在する場合は a.batchName、a.projectId を選択します (ucsc_project b から、a.projectId = b.id の場合は b.id を選択します) 

上記の SQL は、ucsc_project_batch をメイン テーブルとして使用し、batchName フィールドと projectId フィールドをクエリすることを意味します。ここで、projectId フィールドは ucsc_project テーブルに存在します。

EXISTS は、外部テーブル ucsc_project_batch に対してループ クエリ マッチを実行します。内部テーブル サブクエリの戻り値が何であるかは考慮されず、戻り値があるかどうかのみが考慮されます。戻り値がある場合、条件は true であり、データが正常に一致し、クエリ結果セットに追加されます。戻り値がない場合、条件は false であり、データは破棄されます。

たとえば、最初のクエリのクエリ戻りフィールドを変更しても、外部クエリのクエリ結果には影響しません。

ucsc_project_batch a から、存在する場合は a.batchName、a.projectId を選択します (ucsc_project b から、a.projectId = b.id の場合は b.companyId、b.name を選択します) 

(2)INの使用法

ucsc_project_batch a から a.batchName、a.projectId を選択します。ここで、a.projectId は (ucsc_project b から b.id を選択) です。

上記SQLのクエリ結果は先ほどのEXISTSの結果と同じであり、クエリの意味も同じです。

2. 注意:

(1) EXISTS を書くときは、サブクエリ内の条件文が通常、外部クエリのテーブルに関連付けられている必要があることに注意する必要があります。そうしないと、サブクエリの条件が常に真になるか、常に偽になる可能性があります。外部クエリ テーブルが循環的に一致すると、すべての結果が見つかるか、まったく見つからないかのどちらかになります。

ucsc_project_batch a から a.batchName、a.projectId を選択します (存在する場合) (ucsc_project b から b.id を選択します)

例えば、上記の書き方では、ucsc_project テーブルに値があるため、サブクエリの条件は常に真となります。ucsc_project_batch の各データをループで照合すると、正常に照合され、クエリ結果は ucsc_project_batch テーブル全体のデータになります。

ucsc_project_batch a から、存在する a.batchName、a.projectId を選択します (ucsc_project b から、b.id が null である b.id を選択します)

この方法では、サブクエリは確実に結果を見つけられないため、サブクエリの条件は false となり、外部クエリ内の各データは一致せず、クエリ結果全体が空になります。

(2)MySQLのIN文のパラメータ数には制限はありませんが、MySQLのSQL文には長さ制限があり、文全体の最大長は4Mです。

(3) EXISTSサブクエリステートメントは、クエリの対象を気にせず、結果セットがあるかどうかだけを気にします。結果セットがある場合は、サブクエリ全体が真の条件を持つステートメントと見なすことができます。そうでない場合は、偽の条件を持つステートメントです。

(4) IN文はサブクエリに対して1つのフィールドのみを返すことができ、それ以外の場合はエラーが報告されます。

ucsc_project_batch a から a.batchName、a.projectId を選択します。ここで、a.projectId は (ucsc_project b から b.id、b.companyId を選択) です。

[エラー] 1241 - オペランドには 1 列が必要です

3. シーン選択

外部クエリ テーブルが大きく、サブクエリ テーブルが小さい場合は、IN を選択します。外部クエリ テーブルが小さく、サブクエリ テーブルが大きい場合は、EXISTS を選択します。2 つのテーブルのサイズが同じであれば、それらは類似しています。

(1) IN内のSQLクエリは一度だけ実行され、結果セットは一時ファイルに保存され、その後、外部クエリSQLと照合されます。外部クエリとサブクエリの両方でインデックスを使用できます。

ucsc_project_batch a から a.batchName、a.projectId を選択します。ここで、a.projectId は (ucsc_project b から b.id を選択) です。

は以下と同等です:

$結果 = [];
$ucsc_project_batch = "ucsc_project_batch a から a.batchName、a.projectId を選択します";
$ucsc_project = "ucsc_project bからb.idを選択";
($i = 0;$i < $ucsc_project_batch .length;$i++){
 ($j = 0;$j < $ucsc_project.length;$j++){
  $ucsc_project_batch[$i].projectId== $ucsc_project[$j].id)の場合{
   $result[] = $ucsc_project_batch[$i];
   壊す;
  }
 }
}

(2)EXISTSは、外部クエリテーブルucsc_project_batchに対してループマッチを実行し、ucsc_project_batch.length回実行します。サブクエリはインデックスを使用でき、外部クエリはテーブル全体をスキャンします。

ucsc_project_batch a から、存在する場合は a.batchName、a.projectId を選択します (ucsc_project b から、a.projectId = b.id の場合は b.id を選択します)

は以下と同等です:

$結果 = [];
$ucsc_project_batch = "ucsc_project_batch a から a.batchName、a.projectId を選択します ";
($i = 0; $i < $ucsc_project_batch . length; $i++) の場合 {
 if (exists($ucsc_project_batch [$i] . projectId)){// 実行 select b.id from ucsc_project b where a.projectId=b.id        
  $result[] = $ucsc_project_batch[$i];
 }
}

2 つの疑似コードを分析すると、サブクエリ テーブルが大きい場合は、EXISTS を使用するとループの総数を効果的に減らして速度を向上でき、外部クエリ テーブルが大きい場合は、IN を使用すると外部クエリ テーブルのループ トラバーサルを効果的に減らして速度を向上できることがわかります。

要約する

MySQL における EXISTS と IN の使用法の比較に関するこの記事はこれで終わりです。MySQL の EXISTS と IN の比較に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL における exists、in、any の基本的な使い方
  • MySQL における in と exists の使い方と違いの紹介
  • MySQL ステートメントにおける IN と Exists の比較分析
  • MySQLの存在と詳細な説明と違い
  • MySQL の in クエリと exists クエリの違いの概要
  • MYSQL IN と EXISTS の最適化の例
  • mysql は、含まれていない、左結合、IS NULL、NOT EXISTS の効率の問題のレコードです
  • MySQL における in と exists の違いの詳細な説明

<<:  jQueryはキャンバスタグを使用して検証コードを描画します

>>:  CSSをインポートする方法に関する詳細な洞察の要約

推薦する

njs モジュールを使用して nginx 構成に js スクリプトを導入する

目次序文1. NJSモジュールをインストールする方法1: NJSモジュールを動的にロードする方法2:...

Windows での自動展開に Jenkins を使用するチュートリアル図

今日は、Jenkins + powershell スクリプトを使用して、.NET CORE スクリプ...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

ReactでuseStateを使用する詳細な例

使用状態useState は、関数コンポーネント内で呼び出すことで、コンポーネントに内部状態を追加し...

vueはEle.me UIを使用してteambitionのフィルタリング機能を模倣します

目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...

Node.jsミドルウェアの仕組みの詳細な説明

目次Express ミドルウェアとは何ですか? Expressミドルウェアを作成するための要件Exp...

Webフロントエンド開発エンジニアが習得すべきコアスキル

Web フロントエンド開発に含まれる内容は、主に W3C 標準の構造、動作、パフォーマンスです。では...

JS addEventListener() およびattachEvent() メソッドは登録イベントを実装します

JavaScript の DOM イベント モデルでは、オブジェクトの addEventListen...

mysql ERROR 1045 (28000) 問題の解決方法

私はmysql ERROR 1045に遭遇し、この問題に長い時間を費やしました。私はそれを自分で書き...

JS での Reduce() メソッドの使用の概要

目次1. 文法2. 例3. その他の関連方法長い間、reduce() メソッドの具体的な使い方を理解...

JavaScriptでポインターの位置を取得する方法を教えます

JavaScript でポインターの位置を取得する方法は、イベント オブジェクトの pageX と ...

MIME エンコーディングの概要 (オンライン情報と実際の経験から統合)

1. MIME: 多目的インターネットメール拡張インペリアル カレッジ オブ コンピュータ オンラ...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

Vue ElementUI は非同期読み込みツリーを実装します

この記事の例では、vue ElementUI の非同期読み込みツリーを実装するための具体的なコードを...