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をインポートする方法に関する詳細な洞察の要約

推薦する

Docker を使用した MySQL のデプロイの詳細説明 (データ永続化)

この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...

実用的な MySQL + PostgreSQL バッチ挿入更新 insertOrUpdate

目次1. 百度百科事典1. MySQL 2. PostgreSQL 3. MySQL に対する Po...

Node.jsがES6モジュールを処理する方法の詳細な説明

目次1. 2つのモジュールの違い2. Node.jsとの違い3. CommonJSモジュールの読み込...

React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)

最近、古い RN プロジェクトを Xcode で実行すると、次のコード エラーが報告されました。 &...

MySQLログに関する知識のまとめ

目次SQL実行順序ビンログ何ですかいつ生産されるのか何の役に立つんだディスクはいつドロップされますか...

MySQL での SQL モードの表示と設定の詳細な説明

MySQL での SQL モードの表示と設定MySQL はさまざまなモードで実行でき、さまざまなシナ...

MYSQL ログとバックアップおよび復元の問題の詳細な説明

この記事では、参考までにMYSQLログとバックアップとリストアについて紹介します。具体的な内容は以下...

変換を使用して純粋な CSS ポップアップ メニューを実装するためのサンプル コード

序文トップメニューを作成する場合、ポップアップのセカンダリメニューを作成する必要があります。 以前の...

nginxリバースプロキシのマルチポートマッピングの実装

コードの説明1.1 http:www.baidu.test.com のデフォルトは 80 で、リバー...

HTML チュートリアル: よく使われる HTML タグのコレクション (5)

関連記事:初心者が学ぶ HTML タグ (4)導入された HTML タグは、必ずしも XHTML 仕...

Vueログイン機能の実装

目次前面に書かれたログインの概要ログインビジネスプロセスログインサービスの関連技術ポイントログイント...

Reactでレシピシステムを実装する方法を解説した記事

目次1. レシピ集1.1 プロジェクトの背景1.2 テクノロジースタック1.3 開発環境1.4. プ...

Javascriptジェネレータの紹介と使用

ジェネレータとは何ですか?ジェネレーターは関数内で実行されるコードです。値を返した後、一時停止し、呼...

12個のJavascriptテーブルコントロール(DataGrid)が整理されています

DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...

Alibaba Cloud Centos6.X でメールを送信する際に発生するさまざまな問題

序文: Webサービスを提供するために、Alibabaクラウドホストを新しくインストールしました。す...