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

推薦する

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

MySql テーブル、データベース、シャーディング、パーティショニングの知識の詳細な説明

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...

CSSスタイルとセレクターの使い方

HTML で CSS を使用する 3 つの方法: 1. インラインスタイル: 要素のスタイル属性を通...

Docker Tomcat のアクセス インターフェイスが表示されないのはなぜですか?

質問:オリジン サーバーはターゲット リソースの表現を見つけることができないか、既存の表現を公開した...

vscode で Prettier Code プラグインを使用する詳細なチュートリアル

なぜprettierを使うのですか?大企業では、フロントエンド開発コードに独自のコード標準がある場合...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

Firefox または IE でスパン幅が決定されない場合の解決策

コードをコピーコードは次のとおりです。 <html xmlns="http://ww...

Linux での MySQL データベースのマスター スレーブ同期レプリケーション構成

Linux での MySQL データベースのマスター/スレーブ同期構成の利点は、この方法をバックアッ...

Flex レイアウトで適応型ページを作成する (構文と例)

Flex レイアウトの紹介英語の Flex はフレキシブル ボックス、つまり伸縮性のあるボックスを...

ウェブデザイン実践者必読のキャリアプラン

原文記事、転載の際は著者と出典を明記してください! Web デザインは間違いなくテクノロジーであり、...

div 内の img と span の垂直方向の中央揃えの問題について

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...

Vue での親子コンポーネント通信と、sync を使用して親子コンポーネント データを同期する

目次序文子コンポーネントは親コンポーネントにデータを渡す1. 親コンポーネントから子コンポーネントに...

vsCodeはワンクリックでvueテンプレートを生成します

1. ショートカットCtrl + Shift + Pを使用してコンソールを呼び出します 2、「スニペ...

Ubuntu 19にTheanoをインストールする際の問題を解決する

解決: pythearn2 パッケージをダウンロードしたディレクトリで、setup.py ファイルを...