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のインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

序文MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる...

Vue3 (V) HTTPライブラリaxiosの統合の詳細

目次1. axiosをインストールする2. アクシオスの使用1.ホームページでaxiosを参照する2...

コンテンツウェブページの画像プレビューのデザイン

<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...

Linuxの同時実行は簡単です。このようにするだけです

並行処理関数 i の `grep server /etc/hosts | awk '{pri...

Linux ファイル操作でよく使われるコマンドのまとめ

0. 新しい操作: mkdir abc #新しいフォルダを作成 touch abc.sh #新しいフ...

CSS3 3Dクールキューブ変形アニメーションの実装

私はコーディングが大好きです。コーディングすると幸せになります!みなさんこんにちは、Counterで...

今日と昨日の 0:00 タイムスタンプを取得する MySQL の例

以下のように表示されます。昨日: UNIX_TIMESTAMP(CAST(SYSDATE() AS ...

MySQLがデータの削除を推奨しない理由

目次序文InnoDB ストレージ アーキテクチャInnodb テーブルスペースインドストレージディス...

HTML の marquee 属性の詳細な説明

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルでのみサポートされているため、IEカ...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

Dockerイメージストレージoverlayfsの使用

1. 概要Docker のイメージはレイヤーで設計されています。各レイヤーは「レイヤー」と呼ばれます...

MySQL binlog_ignore_dbパラメータの具体的な使用法

序文:前の記事を読んだ後、binlog はデータベースで実行されたすべての DDL および DML ...

Mysqlはフィールドスプライシングのための3つの関数を実装している

データをオペレーションにエクスポートする場合、フィールドの結合は避けられません。MySQL でこれが...

MySQL ルートパスワードを変更する複数の方法 (推奨)

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...