MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明

MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明

1. サブクエリ

MySQL 4.1以降はサブクエリをサポートしています

サブクエリ:別のクエリ内にネストされたクエリ。

サブクエリの役割:

1. フィルター:

例1: 商品TNT2を注文したすべての顧客のIDを取得する

= +

一般的に、WHERE 句にネストできるサブクエリの数に制限はありません。ただし、実際の使用では、パフォーマンスの制限により、サブクエリをあまり多くネストすることはできません。
注: 列は一致する必要があります。WHERE 句でサブクエリを使用すると (ここに示すように)、SELECT ステートメントの列数が WHERE 句の列数と同じになります。通常、サブクエリは単一の列を返して一致しますが、必要に応じて複数の列を使用することもできます。

例2: 製品TNT2を注文した顧客のリストを返す

この例をより効率的にクエリするには、結合を使用します。

注: 接続に関する詳細は以下にまとめます。

2. 計算フィールドを作成します。

相関サブクエリ: 外部クエリを含むサブクエリ。列名があいまいになる可能性がある場合は、この構文を使用する必要があります。
例: 顧客テーブル内の各顧客の注文合計数を表示する

要約:
サブクエリの最も一般的な使用法は、WHERE 句の IN 演算子で、計算列にデータを入力することです。サブクエリを構築 (およびテスト) する最も信頼性の高い方法は、MySQL がサブクエリを処理するのとほぼ同じ方法で、段階的に実行することです。まず、最も内側のクエリを構築してテストします。次に、ハードコードされたデータを使用して外部クエリを構築およびテストし、機能することを確認した後にのみサブクエリを埋め込みます。この時点で、再度テストします。追加するクエリごとにこれらの手順を繰り返します。これを行うと、クエリの構築にほんの少しだけ時間がかかりますが、後で多くの時間を節約し (クエリが正しく機能しなかった理由を解明する)、クエリが最初から正しく機能する可能性が大幅に高まります。

2. テーブルを結合する

結合テーブルはSQLの最も強力な機能の1つです

1. 関連する基本的な知識の蓄積:

リレーショナル テーブル: 情報が複数のテーブルに分割され、データの種類ごとに 1 つのテーブルが作成されます。テーブルは、いくつかの共通の値(リレーショナル設計ではリレーショナル)を通じて相互に関連付けられます。時間とストレージスペースを節約し、データの変更と更新を容易にします。したがって、リレーショナル データベースのスケーラビリティは、非リレーショナル データベースよりもはるかに優れています。
スケーラビリティ: 障害が発生することなく、増加するワークロードに適応する能力。適切に設計されたデータベースやアプリケーションはスケーラブルであると言われています。
結合: 結合は、SELECT ステートメントでテーブルを関連付けるために使用されるメカニズムです。複数のテーブルを結合して、出力セットを返すことができます。

結合は物理的なエンティティではなく、実際のデータベース テーブルには存在しません。結合は必要に応じて MySQL によって確立され、クエリの実行中は存在します。
リレーショナル テーブルを操作する場合、有効なデータのみをリレーショナル列に挿入することが非常に重要です。これを防ぐには、参照整合性を維持する必要があります。これは、テーブル定義で主キーと外部キーを指定することによって実現されます。

2. 基本接続:

例1:

2 つのテーブルは WHERE 句を使用して正しく結合されます。WHERE 句は、MySQL に vendors テーブルの vend_id を products テーブルの vend_id と一致させるように指示します。注: あいまいになる可能性がある列を参照する場合は、完全修飾列名 (ドットで区切られたテーブル名と列名) を使用する必要があります。
SELECT ステートメントで複数のテーブルを結合すると、対応する関係が即座に構築されます。データベース テーブルの定義には、MySQL にテーブルの結合方法を指示できるものは何もありません。 2 つのテーブルを結合する場合、実際には最初のテーブルの各行と 2 番目のテーブルの各行をペアにします。 WHERE 句はフィルター条件として機能し、指定された条件 (ここでは結合条件) に一致する行のみが含まれます。 WHERE 句がない場合、論理的に一緒になるかどうかに関係なく、最初のテーブルのすべての行が 2 番目のテーブルのすべての行とペアになります。

デカルト積: 結合条件のないテーブル関係によって返される結果。取得される行数は、最初のテーブルの行数に 2 番目のテーブルの行数を掛けた数になります。フォークジャンクションと呼ばれることもあります。

例2: 注文番号20005の商品を表示する

すべての結合に WHERE 句があることを確認する必要があります。そうしないと、MySQL は必要な量よりもはるかに多くのデータを返します。
MySQL は実行時に指定された各テーブルを結合して結合を処理します。この処理はリソースを大量に消費する可能性があるため、不要なテーブルを結合しないように注意する必要があります。結合されるテーブルが増えるほど、パフォーマンスが低下します。

等価結合: 2 つのテーブル間の等価性テストに基づきます。内部結合とも呼ばれます。 (最も一般的に使用される接続方法)

例:

ANSI SQL 仕様では、INNER JOIN 構文が推奨されます。さらに、WHERE 句を使用して結合を定義する方が確かに簡単ですが、明示的な結合構文を使用すると、パフォーマンスに影響を与える可能性のある結合条件を忘れることがなくなります。

3. 高度な接続:

例1: テーブルに別名を付ける(列に別名を付けるのと同じ)

注: テーブル別名はクエリ実行時にのみ使用されます。列エイリアスとは異なり、テーブルエイリアスはクライアントに返されません。

テーブルエイリアスを使用する主な理由の1つは、単一のSELECTステートメントで同じテーブルを複数回参照できるようにすることです。例2:生産ID DTNTRのアイテムのサプライヤーによって生産された他のアイテムを照会します。

上記のソリューションは自己結合であり、通常は同じテーブルからデータを取得するときに使用されるサブクエリ ステートメントを置き換える外部ステートメントとして使用されます。この例はサブクエリを使用して解決することもできます。最終結果は同じですが、結合はサブクエリよりもはるかに高速に処理できる場合があります。問題を解決するときに、2 つのアプローチを試して、どちらがより効果的かを判断することができます。

自然結合:複数の出現を排除して、各列が 1 回だけ返されるようにします。一般的に、私たちが使用する内部接続は自然な接続です。

例3: 自然なつながり

自然結合は通常、1 つのテーブルに対してワイルドカード (SELECT *) を使用し、他のすべてのテーブルの列の明示的なサブセットを使用して実行されます。

外部結合:結合には、関連テーブルに関連付けられた行がない行が含まれます。

例4: 注文のない顧客も含め、すべての顧客を取得する

使用方法は内部結合と似ており、結合の種類を指定するためにキーワード OUTER JOIN が使用されます。ただし、2 つのテーブルの行を関連付ける内部結合とは異なり、外部結合には関連する行がない行も含まれます。

外部結合には、左外部結合と右外部結合という 2 つの基本的な形式があります。 OUTER JOIN 構文を使用する場合は、RIGHT または LEFT キーワードを使用して、すべての行を含むテーブルを指定する必要があります (RIGHT は OUTER JOIN の右側のテーブルを参照し、LEFT は OUTER JOIN の左側のテーブルを参照します)。上記の例では、LEFT OUTER JOIN を使用して、FROM 句の左側のテーブル (customers テーブル) からすべての行を選択します。
注意: MySQL では省略文字 *= と =* の使用はサポートされていませんが、これら 2 つの演算子は他の DBMS ではよく使用されます。

例 5: すべての顧客と各顧客の注文数を取得する (注文していない顧客も含む)

集計関数は、さまざまな結合タイプで便利に使用できます。

結合と結合条件の使用:

  1. 1. 使用する接続の種類に注意してください。一般的には内部結合を使用しますが、外部結合も効果的です。
  2. 2. 正しい結合条件が使用されていることを確認します。そうでない場合、誤ったデータが返されます。
  3. 3. 結合条件は常に指定する必要があります。そうしないと、直積の結果になります。
  4. 4. 結合には複数のテーブルを含めることができ、結合ごとに異なる結合タイプを使用することもできます。これは合法であり、一般的には有用ですが、一緒にテストする前に各接続を個別にテストする必要があります。これによりトラブルシューティングが容易になります。

3. 複合クエリ

複合クエリ: 複数のクエリ (複数の SELECT ステートメント) を実行し、結果を単一のクエリ結果セットとして返します。これらの結合クエリは、多くの場合、ユニオン クエリまたは複合クエリと呼ばれます。

複合クエリが必要なのはなぜですか?

  1. 単一のクエリで異なるテーブルから同様に構造化されたデータを返します。
  2. 単一のテーブルに対して複数のクエリを実行し、単一のクエリとしてデータを返します。
  3. 複合クエリを使用すると、複雑な WHERE 句が大幅に簡素化され、複数のテーブルからデータを取得するタスクが簡素化されます。

1. 複合クエリを作成する

キーワード: UNION 演算子

例 1: 価格が 5 以下のすべてのアイテムのリストを取得し、サプライヤー 1001 および 1002 によって製造されたすべてのアイテムを含めます (価格に関係なく)。

UNION は、MySQL に 2 つの SELECT ステートメントを実行し、出力を 1 つのクエリ結果セットに結合するように指示します。このソリューションは、where prod_price<=5 OR vend_id in(1001,1002); と同等であり、注意すべきルールは次のとおりです。

  1. 1. UNION は、キーワード UNION で区切られた 2 つ以上の SELECT ステートメントで構成されている必要があります (したがって、4 つの SELECT ステートメントを組み合わせる場合は、3 つの UNION キーワードを使用します)。
  2. 2. UNION 内の各クエリには、同じ列、式、または集計関数が含まれている必要があります (ただし、列が同じ順序でリストされている必要はありません)。
  3. 3. 列のデータ型は互換性がなければなりません。型は完全に同じである必要はありませんが、DBMS が暗黙的に変換できる型である必要があります (たとえば、異なる数値型や異なる日付型など)。
  4. 4. UNIONを使用した複合クエリは異なるテーブルを適用できる

単純なケースでは、UNION を使用する方が WHERE 句を使用するよりも複雑になる場合があります。 ただし、より複雑なフィルタリング条件の場合、または複数のテーブル (単一のテーブルではなく) からデータを取得する場合は、UNION を使用するとプロセスが簡単になる場合があります。
デフォルトでは、UNION はクエリ結果セットから重複行を自動的に削除します。一致するすべての行を返す場合は、UNION ではなく UNION ALL を使用します。

注: UNION は、ほとんどの場合、複数の WHERE 条件と同じ機能を実現します。 UNION ALL は、WHERE 句で完了できない作業を完了する UNION の形式です。各条件に一致するすべての行(重複行を含む)を表示する必要がある場合は、WHERE ではなく UNION ALL を使用する必要があります。

例2: 結合されたクエリ結果を並べ替える

UNION を使用してクエリを結合する場合、使用できる ORDER BY 句は 1 つだけであり、最後の SELECT ステートメントの後に表示される必要があります。結果セットでは、ある部分が 1 つの方法でソートされ、別の部分が別の方法でソートされる状況はないため、複数の ORDER BY 句は許可されません。 ORDER BY 句は、すべての SELECT ステートメントによって返されるすべての結果をソートします。

上記は、エディターが紹介したMySQLサブクエリ(ネストされたクエリ)、結合テーブル、複合クエリの詳細な統合です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。エディターがすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL のサブクエリの例
  • MySQL IN ステートメントにおける低速クエリの効率を最適化する手法の例
  • MySQL の最適化: サブクエリの代わりに結合を使用する
  • MySQL のテーブル サブクエリと相関サブクエリの基本学習チュートリアル
  • MySQL ノート: サブクエリの使用法の紹介
  • MySQL サブクエリの一般的な形式をいくつか紹介します
  • MySQL ネストクエリでサブクエリを実装する方法

<<:  Centos6.5 でのスーパーバイザーのアップグレード、インストール、および構成に関するチュートリアル

>>:  Vue Notepadの例の詳細な説明

推薦する

CSS の位​​置属性 (absolute|relative|static|fixed) の概要と応用

まず、CSS3 Api の position 属性の定義を見てみましょう。 static: 特別な配...

JavaScript ジグソーパズルゲーム

この記事の例では、ジグソーパズルゲームを実装するためのJavaScriptの具体的なコードを参考まで...

MySQL の general_log ログの知識ポイントの紹介

以下の操作デモンストレーションはすべて MySQL バージョン 5.6.36 に基づいています。仕事...

React における ref の一般的な使用法の概要

目次Refsとは何か1. 文字列型参照2. コールバック参照React.createRef() 4....

Windows Server のインストール後にワイヤレスとオーディオが機能しない問題を解決する

1. ワイヤレスPowerShell を実行し、次のコマンドを入力します。 install-wind...

ウェブデザイン経験

<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...

Docker と Intellij IDEA の融合により、Java 開発の生産性が 10 倍向上

目次1. 開発前の準備2. 新しいプロジェクトIdea は Java 開発のための強力なツールであり...

Vueはシンプルな計算機能を実装します

この記事では、参考までに、簡単な計算機機能を実現するためのVueの具体的なコードを紹介します。具体的...

Linux で so または実行可能プログラムの依存ライブラリを表示します

Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...

Windows システムで MySQL が起動しない場合の一般的な解決策

MySQL 起動エラーWindows 10 に MySQL をインストールする前は、net star...

初心者向けのMySQLデータベースとテーブルDDLの作成と操作の学習

目次1. データベースを操作する1.1 データベースを作成する1.2 データベースをクエリする1.3...

ビジネス HTML メール作成に関する提案

許可ベースの電子メール マーケティングにより、マーケティングとプロモーションのコストを大幅に削減でき...

ミニプログラムは、カスタムのマルチレベル単一選択と複数選択を実装します

この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...

Vueはスクロールバースタイルを実装します

最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...

ウェブのさまざまなフロントエンド印刷方法: CSS はウェブページの印刷スタイルを制御します

CSS は Web ページの印刷スタイルを制御します。 CSS を使用して印刷スタイルを制御します。...