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 メモリ監視とストレステストの方法

推薦する

Dockerがコンテナサービスを停止または削除できない問題の解決策

序文今日、開発者から、コンテナ サービスを停止、rm (docker rm -f)、または強制終了で...

Nexus を使用して Docker リポジトリを作成する方法

公式の Docker レジストリを使用して作成されたウェアハウスでは、イメージを削除してもデフォルト...

Linux で NFS のワンクリック展開を実装する方法

サーバー情報管理サーバー: m01 172.16.1.61サーバー: nfs01 172.16.1....

Vueソースコード解析における仮想DOMの詳しい説明

なぜ仮想DOMが必要なのでしょうか?仮想 DOM はブラウザのパフォーマンス問題を解決するために設計...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...

MySQL マルチバージョン同時実行制御 MVCC の詳細な研究

MVCC MVCC (Multi-Version Concurrency Control) は、マル...

Centos7.2 で mysql5.7 データベースをインストールするための詳細な手順

サーバー上の mysql はバージョン 8.0.12 でインストールされており、ローカルのものはバー...

Postman 自動インターフェーステストの実践

目次背景説明GETリクエストの作成事前リクエストスクリプトで署名を作成するスクリプトは環境変数に書き...

Mysql varchar型の合計操作例

友人の中には、データベースについて学習しているときに、テーブル構造を作成するときに誤ってフィールドを...

ページを更新せずにフォームを送信するには iframe を使用します

そこで、この問題を解決するために埋め込みフレームワークを導入します。具体的な原則は、フォームがデータ...

Vueのref属性の詳細な説明

要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....

VMware vCenter 6.7 のインストール プロセス (グラフィック チュートリアル)

背景当初は VMware の公式 Web サイトから 6.7 Vcenter をダウンロードしたかっ...

JavaScriptのonclickとclickの違いの詳細な説明

目次addEventListener が必要な理由は何ですか? addEventListener を...

Dockerを使用してブログサイトを素早く構築する方法の詳細な説明

目次1. 準備2. 展開プロセス3. アクセステストHalo は、ブログに慣れている学生に追加のオプ...

MySQL をインストールするときに初期パスワードを忘れた場合のシンプルで効果的な解決策

MySQL をインストールすると初期パスワードが与えられますが、この初期パスワードは大文字と小文字の...