MySQL における exists、in、any の基本的な使い方

MySQL における exists、in、any の基本的な使い方

【1】存在する

ループを使用して外部テーブルを 1 つずつクエリし、各クエリの存在する条件ステートメントをチェックします。

exists の条件文がレコードの行を返すことができる場合 (行の数は関係なく、返される行数であれば)、条件は真となり、現在ループされているレコードが返されます。逆に、exists の条件文がレコード行を返すことができない場合、条件は false となり、現在ループされているレコードは破棄されます。

存在条件はブール条件のようなもので、結果セットを返すことができる場合は 1、結果セットを返すことができない場合は 0 になります。

構文の形式は次のとおりです。

[not] が存在する tables_name から * を選択します (select..);

次に例を示します。

p_user_2から*を選択 
存在する場所(ID=12のp_userから*を選択)

p_user テーブルに ID 12 のレコードがある場合は、p_user_2 テーブルのすべてのレコードが返されます。それ以外の場合は、返されるレコードは空になります。

存在しない場合は、上記の逆の処理が行われます。

一般的に、テーブルAにn個のレコードがある場合、existsクエリはこれらのn個のレコードを1つずつ取り出し、exists条件をn回判断します。

【2】で

構文の形式は次のとおりです。

select * from A where column in (select column from B);

ここで、column は A の列であり、に対応するサブクエリ ステートメントは 1 つの列と複数の行を含む結果セットを返すことに注意してください。

in に対応する select ステートメントによって返される結果は 1 つの列である必要があることに注意してください。複数行にすることもできます。

次に例を示します。

p_user_2 から * を選択、ID は [not] である (p_user から ID を選択)

p_user テーブルの id セットに id が含まれる p_user_2 のレコードを照会します。 not in はその逆です。

【3】existsとinの関係

SQL が変更されると、2 つは同じ目標を達成できます。

p_user_2から*を選択 
where id [not] in (select id from p_user );

p_user_2から*を選択 
存在する[存在しない]場所 (id = p_user_2.id の場合、p_user から id を選択)

では、いつ exists と in を使用すればよいのでしょうか?

** クエリ対象の 2 つのテーブルのサイズが同じである場合、in と exists の使用にほとんど違いはありません。 **

**2 つのテーブルのうち 1 つが小さく、もう 1 つが大きい場合、大きい方のサブクエリ テーブルには が使用され、小さい方のサブクエリ テーブルには が使用されます。**

例: テーブル A (小さいテーブル)、テーブル B (大きいテーブル)

① サブクエリテーブルはテーブルBです。

Aから*を選択 
cc が (B から cc を選択) にある場合 
//効率は低いですが、テーブル A の列 cc のインデックスを使用します。
 
Aから*を選択 
存在する場所(cc=A.cc の場合、B から cc を選択) 
//テーブル B の列 cc のインデックスを使用して、効率を高めます。 

② サブクエリテーブルはテーブルAです。

Bから*を選択 
cc が (A から cc を選択) にある場合 
// テーブル B の列 cc のインデックスを使用すると効率が高くなります。
 
Bから*を選択 
存在する場所(cc=B.cc の場合、A から cc を選択) 
//テーブル A の列 cc のインデックスを使用するため、効率は低くなります。

クエリ ステートメントで not in が使用されている場合、内部テーブルと外部テーブルの両方が完全にスキャンされ、インデックスは使用されません。ただし、not exists のサブクエリでは、引き続きテーブルのインデックスを使用できます。

**したがって、どちらのテーブルが大きいかに関係なく、not exists を使用する方が not in を使用するよりも高速です。 **

【4】いずれか/一部/すべて

① any、in、some、allはそれぞれサブクエリキーワードの1つです

any は、=、>、>=、<、<=、<> と組み合わせて使用​​して、それぞれどのデータとも等しい、より大きい、以上、より小さい、以下、等しくないを表すことができます。

all は、=、>、>=、<、<=、<> と組み合わせて使用​​して、等しい、より大きい、以上、より小さい、以下、等しくないの範囲のすべてのデータを表すことができます。

サブクエリの構文は次のとおりです。

オペランド比較演算子 any (サブクエリ);
オペランド(サブクエリ)
オペランド coparison_operator some (サブクエリ);
オペランド比較演算子 all (サブクエリ);

any、all キーワードは比較演算子と一緒に使用する必要があります。

② any キーワードは、「サブクエリによって返される列の任意の値について、比較結果が true の場合は true を返す」という意味です。

例えば:

t_user から age を選択 (age > any の場合) (t_user_copy から age を選択)。

テーブル t_user に (10) を含む行があり、t_user_copy に (21,14,6) が含まれている場合、式は true になります。t_user_copy に (20,10) が含まれているか、テーブル t_user_copy が空の場合、式は false になります。テーブル t_user_copy に (null, null, null) が含まれている場合、式は不明です。

all は「サブクエリによって返される列のすべての値について、比較が true と評価された場合は true を返す」という意味です。

例えば:

t_user から age を選択します (age > all の場合) (t_user_copy から age を選択)。

テーブルt_userに(10)を含む行があると仮定します。テーブル t_user_copy に (-5, 0, +5) が含まれている場合、10 は t_user_copy にある 3 つの値すべてより大きいため、式は true になります。テーブル t_user_copy に (12, 6, null, -100) が含まれている場合、t_user_copy には 10 より大きい値 12 があるため、式は false になります。テーブル t_user_copy に (0, null, 1) が含まれている場合、式は不明です。 t_user_copy が空のテーブルの場合、結果は true になります。

③ ない/in

not in は "<>all" の別名であり、使用方法も同じです。

のステートメントは「=any」と同じです。

例えば:

s1 = any の場合、t1 から s1 を選択する (t2 から s1 を選択する)。
s1 が (t2 から s1 を選択) 内にある場合、t1 から s1 を選択。

ステートメント some は any のエイリアスであり、同じように使用されます。

例えば:

s1 <> any の場合、t1 から s1 を選択 (t2 から s1 を選択)。
s1 <> some の場合、t1 から s1 を選択 (t2 から s1 を選択)。

上記のクエリでは、some は「テーブル t1 の some s1 はテーブル t2 の s1 と等しくない」と簡単に理解できます。このステートメントは、any として解釈すると誤りになります。

要約する

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

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

<<:  純粋な CSS で中空効果を実現するためのサンプルコード

>>:  Docker メモリ監視とストレステストの方法

推薦する

Ubuntu環境でのPHP関連のパスと変更方法

Ubuntu環境におけるPHP関連パスPHP パス /usr/bin/php phpize5 /us...

httpsウェブサイトにリファラーhttpsとhttpジャンプリファラーを送信させる方法

この記事では、HTTP プロトコルのリファラーのメタデータ パラメータの提案について説明します。この...

MySQL 5.6.22 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL5.6.22のインストールと設定方法の具体的なコードを参考までに共...

MySQL sql_modeクエリと設定の詳細な説明

1. SQLを実行して表示する @@session.sql_mode を選択します。 グローバルレベ...

Mysql Workbench クエリ mysql データベース メソッド

Mysql Workbench はオープンソースのデータベース クライアントです。このオープンソース...

Vueでaxiosをカプセル化する方法

目次1. インストール1. はじめに3. インターフェースルートアドレス4. 使用例4.1 ダウンロ...

VMware vSAN 入門概要

1. 背景1. vSphere の共有ストレージの背景を簡単に紹介するvSphere の重要な機能は...

CSS3でアニメーションを実装する3つの方法

これは、面接者の CSS に関する基本的な知識をテストするものです。 CSSでアニメーションを実装す...

HTML 要素の高さ、offsetHeight、clientHeight、scrollTop などの詳細な説明。

要素に関するいくつかの属性フロントエンドの日常的な開発では、一部のページのプロパティを取得または監視...

シェルスクリプトは、Docker の半自動コンパイル、パッケージ化、およびリリースアプリケーション操作を構築します。

Docker 公開方法は、DevOps (送信、コンパイル、パッケージ化、リリースなどの一連のイベ...

OpenShift のクイックインストールの詳細な手順

OpenShift 3.9 の最新バージョンを体験する最も早い方法。準備 [root@host ~]...

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

HTML内のフレームセットタグが正常に表示されない原因の解析と解決方法

<frameset></frameset>は皆さんもよくご存知のものです。こ...

Linux で Jenkins プロジェクトを構築するプロセス (CentOS 7 を例に)

https://gitee.com/tengge1/ShadowEditor のデプロイメントを例...