MySQL ジョイントテーブルクエリの簡単な例

MySQL ジョイントテーブルクエリの簡単な例

MySql は結合テーブルクエリを使用しますが、初心者には理解しにくい場合があります。以下の記事では、MySQL ジョイント テーブル クエリの関連内容を詳しく紹介し、参考と学習のために共有します。一緒に詳しい紹介を見てみましょう。

リレーショナル データベースでは、テーブル間にさまざまな参照や関連付けが存在することは避けられません。これらの関連付けは、主キーと外部キーを組み合わせることによって形成されます。したがって、データを取得する場合、ほとんどの場合、単一のテーブルではニーズを満たすことができず、追加のデータにはクエリに他のテーブルを追加する必要があります。これが、JOIN キーワードによって完了する操作です。

  • MySQL では、JOIN、CROSS JOIN、INNER JOIN は同じ構文と機能を持ち、互換性があります。ただし、SQL 標準では、INNER JOIN は ON ステートメントと一緒に使用する必要があります。

複数のテーブルをクエリする場合は、JOIN キーワードを省略し、複数のテーブルをカンマで区切ることができます。この場合、デフォルトで INNER JOIN として扱われます。例えば、

テーブル1を選択します。*、 
  表2.* 
テーブル1から、 
  テーブル2;

は以下と同等です:

テーブル1を選択します。*、 
  表2.* 
テーブル1から 
  テーブル2の内部結合;
  • ただし、コンマによって暗黙的に指定されるこの形式の結合テーブルは、キーワード (INNER JOIN、CROSS JOIN、LEFT JOIN) によって直接指定される形式よりも優先順位が低くなります。したがって、t1、t2 JOIN t3は、((t1、t2) JOIN t3)ではなく(t1、(t2 JOIN t3))として解析されます。

コンマ形式を他の結合テーブル キーワードと組み合わせると、ON 条件などを通じて結合テーブル条件が指定されたときにエラーが報告されることに注意してください

  • ON で指定する結合テーブル条件の構文は WHERE の構文と同じです。後者で許容されるすべての式は ON でも使用できます。これら 2 つの機能は似ているようです。ON は通常、結合条件、つまりテーブルを結合する方法を指定するために使用され、WHERE は結果をフィルタリングするために使用されます。
  • LEFT JOIN では、右側のテーブルが ON または USING で指定された条件を満たしていない場合、結果には NULL として表示されます。
left_tblを選択します。*
 left_tbl から right_tbl を左結合し、 left_tbl.id = right_tbl.id にします。
 right_tbl.id が NULL の場合;

この方法を使用すると、条件を満たさない右側のテーブル内のレコードを簡単に除外できます。

  • 結合テーブルをクエリする場合、他の式での参照を容易にするために、参加する各テーブルの別名を指定できます。方法は 2 つあります。1 つは AS キーワード tbl_name AS alias_name を使用する方法で、もう 1 つはテーブル名の後にエイリアス tbl_name alias_name を直接続ける方法です。
t1.名前、t2.給与を選択します
 従業員 AS t1 から info AS t2 に内部結合し、 t1.name = t2.name にします。

t1.名前、t2.給与を選択します
 従業員 t1 から、情報 t2 を t1.name = t2.name に内部結合します。
  • クエリ ステートメント内のサブクエリには、他の式で参照できるようにエイリアスが必要です。
SELECT * FROM (SELECT 1, 2, 3) AS t1;
  • USING(join_column_list) ステートメントは、両方のテーブルに含まれる列を指定します。ここで指定された列のみがクエリ中に比較されます。
a LEFT JOIN b USING (c1, c2, c3)
  • NATURAL [LEFT] JOIN は、テーブル内のすべての列を指定する USING を使用した INNER JOIN および LEFT JOIN と同等です。
  • RIGHT JOIN は LEFT JOIN に似ていますが、最終結果は右側のテーブルに基づいており、左側のテーブルと一致しないデータは結果に NULL として表示される点が異なります。異なるデータベース間の移行を容易にするために、常に LEFT JOIN を使用することをお勧めします。

JOIN の例をいくつか示します。

テーブル1、テーブル2から*を選択します。

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
 table3 を table2.id = table3.id で左結合します。
  • NATURAL JOIN の結果には重複する列は含まれません。 USING と似ているため、USING では複雑な列はありません。

次の例を考えてみましょう。

テーブル t1 (i INT、j INT) を作成します。
テーブル t2 (k INT, j INT) を作成します。
t1 VALUES(1, 1) に挿入します。
t2 VALUES(1, 1) に挿入します。
t1 から * を選択し、 t2 を自然結合します。
SELECT * FROM t1 JOIN t2 USING (j);

クエリ結果:

+------+------+------+
| j | 私 | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+
+------+------+------+
| j | 私 | k |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+

同じ名前の列は結果に 1 回だけ表示され、すべて同じ値を持つレコードになります。

2 つのテーブルに新しいレコードを挿入して、それらの j を異なるものにし、テストします。

mysql> t1 に値 (2, 2) を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> t2 に値 (2, 3) を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> t1 から * を選択し、t2 を自然結合します。
+------+------+------+
| j | 私 | k |
+------+------+------+
| 2 | 2 | 1 |
+------+------+------+
セット内の 1 行 (0.00 秒)
  • USING と ON を条件として使用する場合、他の制約の結合条件は同じであり、相互に変換できます。しかし、SELECT * が結果を返すときには、まだ違いがあります。前者は USING で指定された列のみの結合結果を返しますが、後者はテーブル内のすべての列を対象とします。
a LEFT JOIN b USING (c1, c2, c3)
a LEFT JOIN b は a.c1 = b.c1 かつ a.c2 = b.c2 かつ a.c3 = b.c3 で結合されます

USING の場合の戻り値:

合体(a.c1, b.c1)、合体(a.c2, b.c2)、合体(a.c3, b.c3)

ON は次を返します:

a.c1、a.c2、a.c3、b.c1、b.c2、b.c3

ON ステートメントでは、その操作テーブル (オペランド) 内のテーブルのみを参照できます。

テーブル t1 (i1 INT) を作成します。
テーブル t2 (i2 INT) を作成します。
テーブル t3 (i3 INT) を作成します。

上記のテーブルの場合、次のクエリはエラーを報告します。

mysql> SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;
エラー 1054 (42S22): 'on 句' に不明な列 'i3' があります

次のクエリは機能します:

mysql> SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);
空のセット (0.00 秒)

なぜなら、現在 t3 は ON ステートメントの動作範囲内にあるからです。

関連リソース

  • MySQL 8.0 リファレンスマニュアル - 13.2.10.2 JOIN 構文
  • MySQL 8.0 リファレンスマニュアル - 13.2.10.3 UNION 構文

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL 派生テーブル(Derived Table)の簡単な使用例分析
  • MySQL ネストクエリと結合テーブルクエリの最適化方法
  • MySQL でのジョイントテーブルの更新と削除の構文の紹介
  • MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴
  • MySQL 派生テーブル ジョイントテーブル クエリ 実際のプロセス

<<:  Linux nslookup コマンドの使用方法の詳細な説明

>>:  アイデアコンパイラvueインデントエラー問題シナリオの分析

推薦する

MySQL で置換操作を使用したときにデータ損失が発生する問題の解決策

序文同社の開発者は、データの更新時に replace into ステートメントを使用していました。不...

ノードをMySQLデータベースに接続する際に発生する問題と解決策

今日、MySQL の新しいバージョン (8.0.21) をインストールしましたが、ノード フレームワ...

JavaScript イベントの概念の詳細な説明 (静的登録と動的登録の区別)

目次js のイベントイベントタイプ一般的なイベントイベント登録静的および動的登録の例onload 読...

Vue デフォルトスロットの理解とサンプルコード

目次スロットとは何かデフォルトスロットの理解コードスニペット要約するスロットとは何かスロットは、親コ...

mysqlは指定された期間内の統計データを取得します

mysqlは指定された期間内の統計データを取得します年別統計 選択 カウント(*)、 DATE_FO...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

プロセスのすべての情報を表示するLinuxメソッドの例

サーバー上にタスク プロセスがあります。 ps -ef | grep task を使用して表示すると...

クールなネオンライト効果を実現する純粋な CSS (デモ付き)

私は最近、YouTube の CSS アニメーション効果チュートリアル シリーズをフォローしています...

全体的なユーザーエクスペリエンスを確保する方法

関連記事:ユーザーエクスペリエンスのためのウェブサイトデザイン今朝、GMail がまた不調になり、接...

js を使用して QR コードを生成するサンプル コード

以前、プロジェクトでQRコードをスキャンして情報を表示する機能を開発する必要がありました。インターネ...

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者か...

要素テーブルの多層ネスト表示の実践

複数の注文を含むリストが必要です。各注文は一意にすることも、複数の注文を結合することもできます。各注...

mysql8.0.11 winx64 手動インストールと設定チュートリアル

まず、私の日常生活についてお話しします。MySQLの急速なアップデートにより、MySQLはバージョン...

SSMプロジェクトは、ホットデプロイメント構成を実装するためにTomcatとMavenを使用してWARパッケージとしてデプロイされることが多い。

背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...