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

推薦する

node.js で Web サーバーを作成する手順の詳細な説明

序文node.js でサーバーを作成するのは非常に簡単です。小さいながらも完全な Web サーバーを...

nginx を使用した負荷分散モジュールの解釈

目次負荷分散に nginx を使用するための 2 つのモジュール:アップストリームはロードノードプー...

Dockerでコンテナを作成するときにコンテナIPを指定する実装例

Docker はコンテナを作成するときに、デフォルトでブリッジ ネットワークを使用し、IP アドレス...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...

DOCTYPEタイプの詳細な紹介

<br />通常、HTML では次の方法で DOCTYPE を宣言します。 <!D...

Dockerイメージを構築する2つの方法

目次既存のイメージからイメージを更新します。イメージを最初から構築する: Docker イメージ リ...

MySQL がエラーを報告: ファイルが見つかりません: './mysql/plugin.frm' 解決策

問題を見つける最近、仕事中に問題が見つかりました。問題は、MySQL ディスクがいっぱいだったことで...

CSS3 フィルターを使用して PNG 画像の色を変更するサンプル コード

この方法は、CSS3のdrop-shadow filterを使用して、png画像の不透明部分に任意の...

MySQL インデックスの知識の要約

MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...

Vue+echart で 2 列チャートを実現

この記事では、vue+echart を使って二重列チャートを実現するための具体的なコードを参考までに...

HTML ボディタグと HTML でよく使われる制御タグの詳細な説明

1. <body> タグ: Web ページの本体をマークするために使用されます。body...

カルーセル効果を実現するためのネイティブJavaScript+CSS

この記事では、参考までに、カルーセル効果の具体的なコードをJavaScript+CSSを使用して実装...

MySQLでグローバル変数とセッション変数を設定する2つの方法の詳細な説明

1. MySQL でグローバル変数を変更するには 2 つの方法があります。方法 1: my.ini ...

MySQL で URL タイムゾーンの罠を回避する方法

序文最近、MySQL 6.0.x 以降の jar を使用する場合、コード URL リンクで serv...