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インデントエラー問題シナリオの分析

推薦する

オーディオマニアにアピールするオーディオビジュアルLinuxディストリビューション

私は最近、多くの音楽に特化した Linux ディストリビューションの 1 つである Audiovis...

CentOS7 に YUM 経由で MySQL 5.7 をインストールする詳細な手順

1. インストールパッケージを保存する場所に移動しますcd /home/lnmp 2. MySQL ...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...

DockerはElasticsearch7.6クラスタをインストールし、パスワードを設定します

Elasticsearch 6.8 以降、無料ユーザーは X-Pack のセキュリティ機能を使用でき...

nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...

JavaScript データ型の詳細な説明

目次1. リテラル1.1 数値リテラル1.2 浮動小数点リテラル1.3 特別な値1.4 文字列リテラ...

Linux プロセス管理ツール スーパーバイザーのインストールと設定のチュートリアル

環境: CentOS 7公式ドキュメント: http://supervisord.org/インストー...

Vueグローバルカスタム命令の実践 モーダルドラッグ

目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...

最新の高品質な英語無料フォント36個を公開

01. 無限フォントのダウンロード02. バンダフォントのダウンロード03. ロールアップフォントの...

Linux でファイルの権限 (所有権) を変更する

Linux と Unix はマルチユーザー オペレーティング システムであるため、ファイルの権限と所...

ファイアウォールの iptables 戦略を使用して Linux サーバー上のポートを転送する方法

2つの異なるサーバー間の転送ポート転送を有効にするまず、デフォルトでは無効になっている IP 転送機...

MySQLトリガーの詳細な説明と簡単な例

MySQLトリガーの簡単な例文法CREATE TRIGGER <トリガー名> -- トリ...

Linux システムの /etc/fstab ファイルの詳細な解釈

序文 [root@localhost ~]# cat /etc/fstab # #/etc/fsta...

dockerにros2をインストールするための詳細な手順

目次メイントピック1. UbuntuにDockerをインストールする2. DockerにROS2-F...