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

推薦する

React Fragment の紹介と詳しい使い方

目次序文フラグメントの動機React Fragment の紹介と使用<React.Fragme...

HTML テーブル マークアップ チュートリアル (14): テーブル ヘッダー

<br />HTML 言語では、タグを使用してテーブルにタイトルを自動的に追加できます。...

Vue3 の SetUp 関数のプロパティとコンテキスト パラメータの詳細な説明

1. setUp関数の最初のパラメータpropsセットアップ(プロパティ、コンテキスト){}最初のパ...

Zabbix redis 自動ポート検出スクリプトは json 形式を返します

自動検出を行う際には、ポートなどの情報を取得してjson形式で返すスクリプトが必ず存在します。Red...

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

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

ダッシュボードを実装するためのjQueryプラグイン

jQueryプラグインは、参考のためにダッシュボードを実装します。具体的な内容は次のとおりです。一般...

MySQL シリーズ 13 MySQL レプリケーション

目次1. MySQLレプリケーション関連の概念2. シンプルな1マスター1スレーブアーキテクチャの実...

MySql Installer 8.0.18 画像とテキストによるビジュアル インストール チュートリアル

目次1. MySQL 8.0.18のインストール2. 環境変数を設定する3. 接続テスト1. MyS...

HTML pre タグ内の自動改行

このとき、overflow:auto;(コードがコンテナの境界を超えたときにスクロールボックスを表示...

タグが新しいページを開くかどうかという問題。主要ウェブサイトの開設状況をまとめました

a タグが新しいページを開くかどうか: (1)百度百科事典:ヘッダーが異なる場合は新しいページが開き...

Mysql 複数データベースのバックアップ コード例

この記事は主にMysqlの複数データベースのバックアップのコード例を紹介します。この記事ではサンプル...

uniapp vue および nvue カルーセル コンポーネントのサンプル コード

vueの部分は以下のとおりです。 <テンプレート> <ビュークラス="&...

将来的に人気のあるウェブサイトのナビゲーションの方向

<br />今は情報爆発の時代であるだけでなく、サービス爆発の時代でもあります。それはす...

MySQLインジェクションバイパスフィルタリング技術の概要

まず、GIF 操作を見てみましょう。ケース1: スペースがフィルタリングされるスペースの代わりに角括...

GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

需要背景:ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが...