MySQL マルチテーブル結合クエリ例の説明

MySQL マルチテーブル結合クエリ例の説明

実際のプロジェクトでは、複数のテーブル間に関係が存在します。 1 つのテーブル内のすべてのデータを取得することは不可能です。テーブル接続がない場合、多くの操作が必要になります。たとえば、テーブル B からデータを取得するには、テーブル A から制限条件を見つける必要があります。操作には複数のテーブルが必要なだけでなく、効率も高くありません。たとえば、この本では次のように書かれています。

コードは次のとおりです。

FIdを選択
T_Customerより
FName='MIKE' の場合

この SQL ステートメントは 2 を返します。これは、MIKE という名前の顧客の FId 値が 2 であることを意味します。このようにして、T_Order で FCustomerId が 2 であるレコードを取得できます。

コードは次のとおりです。

FNumber、FPrice を選択
T_Orderから
FCustomerId=2の場合

テーブル結合について詳しく見てみましょう。テーブル結合には、クロス結合 (CROSS JOIN)、内部結合 (INNER JOIN)、外部結合 (OUTTER JOIN) など、さまざまな種類があります。

(1)内部結合:内部結合は2つのテーブルを結合し、2つのテーブルの結合条件を満たすデータのみを取得します。

コードは次のとおりです。

o.FId、o.FNumber、o.FPrice を選択、
c.FId、c.FName、c.FAge
T_Order o から T_Customer c に参加
ON o.FCustomerId= c.FId

注: ほとんどのデータベース システムでは、INNER JOIN の INNER はオプションであり、INNER JOIN がデフォルトの接続方法です。

テーブル結合を使用する場合、多くのテーブルを接続する必要があるケースが多いため、2 つのテーブルのみの結合に限定されません。たとえば、T_Order テーブルは、必要な情報を取得するために、T_Customer テーブルと T_OrderType テーブルにも接続する必要があります。次の SQL ステートメントを記述できます。

コードは次のとおりです。

o.FId、o.FNumber、o.FPrice を選択、
c.FId、c.FName、c.FAge
T_Order o から T_Customer c に参加
ON o.FCustomerId= c.FId
内部結合 T_OrderType
T_Order.FTypeId = T_OrderType.FId の場合

(2)クロス結合:クロス結合に関係するすべてのテーブルのすべてのレコードが結果セットに含まれます。クロス結合を定義する方法は、暗黙的と明示的の 2 つがあります。

暗黙的な例を見てみましょう:

コードは次のとおりです。

T_Customer.FId、T_Customer.FName、T_Customer.FAgeを選択します。
T_Order.FId、T_Order.FNumber、T_Order.FPrice
T_Customer、T_Order から

明示的な結合を使用するには、次に示すように CROSS JOIN を使用する必要があります。

コードは次のとおりです。

T_Customer.FId、T_Customer.FName、T_Customer.FAgeを選択します。
T_Order.FId、T_Order.FNumber、T_Order.FPrice
T_Customerより
クロス結合 T_Order

(3)外部結合:内部結合は結合条件を満たすデータのみを取得しますが、外部結合は主にこのようなシナリオを解決するために使用されます。条件を満たすデータが取得されます。これについては疑いの余地はありません。外部接続ではデータの別の部分も取得されます。つまり、条件を満たさないデータは NULL で埋められます。まず、外部結合の分類(LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN)を見てみましょう。

I. LEFT OUTER JOIN: 前述のように、条件を満たさないデータは NULL で埋められます。では、どの項目を NULL で埋める必要がありますか? 左外部結合の場合、条件を満たす左のテーブルのデータに対応する一致が右のテーブルにない場合、対応する右のテーブルのフィールドに NULL 値を埋める必要があります。つまり、左外部結合の本体は左側のテーブルであり、右側のテーブルはそれに連携します。

コードは次のとおりです。

o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
左外部結合 T_Customer c
オン o.FCustomerId=c.FId

注: 左外部結合を使用する場合は、where ステートメントに一致しないデータを除外できます。

コードは次のとおりです。

o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
左外部結合 T_Customer c
オン o.FCustomerId=c.FId
ここで o.FPrice>=150

II. 右外部結合: 右外部結合は左外部結合の逆です。左側のテーブルのフィールドには NULL 値が入ります。つまり、右外部結合の主体は右テーブルであり、左テーブルはそれに連動します。

コードは次のとおりです。

o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
右外部結合 T_Customer c
オン o.FCustomerId=c.FId

注: 左外部結合と同様に、where文を使用してフィルタリングすることができます。

III. 完全外部結合: 完全外部結合は、左外部結合と右外部結合の組み合わせです。つまり、左外部結合の結果セットと右外部結合の結果セットの両方が含まれます。

コードは次のとおりです。

o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
完全外部結合 T_Customer c
オン o.FCustomerId=c.FId

結果は次のようになります:

o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
左外部結合 T_Customer c
オン o.FCustomerId=c.FId
連合
o.FNumber、o.FPrice、o.FCustomerId を選択します。
c.FName、c.FAge
T_Orderから
右外部結合 T_Customer c
オン o.FCustomerId=c.FId

複数テーブルクエリ用の複数の SQL ステートメント: (以下は 2 つのテーブルからのクエリです <3 つのテーブルからのクエリとも見ることができます>。v_goods テーブルのすべてのフィールドを表示し、admin2 テーブルの名前フィールドを追加された人物として表示し、admin2 テーブルの名前フィールドを演算子として表示します) 複数テーブルクエリは、次の 3 つの例に従って SQL で記述できます。

SELECT v.*,(SELECT a.name FROM admin2 a WHERE a.adminId=v.loadInId) AS aname,(SELECT a.name FROM admin2 a WHERE a.adminId=v.operatorId) AS uname FROM v_goods v where 1=1;
SELECT v.*,a.name aname,b.name uname FROM v_goods v,admin2 a,admin2 b WHERE a.adminId=v.loadInId AND b.adminId=v.operatorId;
v_goods v から v.*、a.name aname、b.name uname を選択し、 admin2 a を a.adminId=v.loadInId で LEFT JOIN し、 admin2 b を b.adminId=v.operatorId で LEFT JOIN します。

以下もご興味があるかもしれません:
  • MySQL の結合クエリとサブクエリの問題
  • MySQL マルチテーブル結合クエリの詳細な説明
  • どのような種類の MYSQL 接続クエリを知っていますか?
  • MySQL接続クエリの原理と応用
  • MySQL 結合クエリ構文と例
  • MySQLの結合クエリ、ユニオンクエリ、サブクエリの原理と使用例の詳細な説明
  • Mysql 自己結合クエリ例の詳細な説明
  • MySQL接続クエリの詳細な説明

<<:  Javascript における非同期待機の詳細な理解

>>:  Nginx の負荷分散アルゴリズムとフェイルオーバー分析

推薦する

CSSテーマを簡単に切り替える方法の詳細な説明

最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

JDカルーセル効果を実現するための純粋なHTMLとCSS

JD カルーセルは、動的な効果を追加せず、主に位置決めの知識を使用して、純粋な HTML と CS...

Nest.js 環境変数の設定とシリアル化の詳細な説明

環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...

Ubuntuでネットワークルーティングテーブルを表示する方法

Linux におけるルーティングとルーティング テーブルとは何ですか?ルーティングのプロセスとは、ネ...

TypeScript の基本型の紹介

目次1. 基本タイプ2. オブジェクトタイプ2.1 配列2.2 タプル2.3 オブジェクト3. 型推...

CSS (カスケーディング スタイル シート) の一般的な用語の概要

CSS を使用する場合は、DOCTYPE (ドキュメント タイプ定義) を記述することを忘れないでく...

Vue cli開発に基づく外部コンポーネントVantのデフォルトスタイルの変更の詳細な説明

目次序文1. 少ない2. コンポーネントをインポートする3. 設定ファイルを変更するステップ1: l...

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...

Docker Compose を使用して nginx のロード バランシングを実装する方法

Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪...

React 非親子コンポーネントパラメータ渡しのサンプルコード

React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。 ...

node_modulesを削除して再インストールする方法

目次ステップ1: プロジェクトをインストールするディレクトリにnode_modulesをインストール...

a タグにはテキストと画像があります。テキストを非表示にして画像のみを表示するにはどうすればよいでしょうか?

多くの場合、画像を表示する<a>タグのスタイルに遭遇しますが、タグ内にテキストがあり、そ...

dockerログマウントの問題を解決する

重要なのは、ローカルサーバーに書き込み権限がないことですキーはここにあります(アクセス拒否)。私は肯...