データベースを操作しているときは、いくつかの異なるテーブルのデータをまとめる必要があるかもしれません。この記事ではその方法を説明します。
こことここでSQL結合についてはすでに書いていますが、最初に結合がどのように機能するか、特にMySQLに固有の構文を確認してみましょう。
SQL結合ステートメント
結合は、2つのテーブルをまとめて、相互に関連する行を照合し、照合可能な行のみを保持し、ペアになっていない行は保持しないようにするステートメントです。
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
ステートメントはどちらが最初のテーブルであるかを示し、2番目のテーブル名は INNER JOIN
の直後に書き込まれます キーワード。
2つのテーブルを結合する方法は、 ON
に記述されています。 声明。この場合、2つのテーブルは、関係 table1.id =table2.id
を使用して結合されます。 。
複数の結合ステートメントを一緒に使用して、同時に複数のテーブルを結合することができます。
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
これを行うには、2番目の INNER JOIN
を追加します ステートメントと2番目のON
3番目のテーブルと2番目の関係を示すステートメント。
テーブル間の関係と、3つのテーブルを結合する理由について少し話しましょう。
SQLのテーブル間の関係
相互に関連するテーブルがある場合、それらの関係はさまざまなタイプの1つである可能性があります。
1対多
1対多の関係では、最初のテーブルの1つの行を、2番目のテーブルの複数の行に関連付けることができます。
リレーショナルデータベースでは、これは first_table_id
を持つ2番目のテーブルで実装できます。 その行が最初のテーブルのどの行に関連しているかを示す列。
many-to-one
多対1の関係では、最初のテーブルの1つの行を2番目のテーブルの1つの行に関連付け、2番目のテーブルの1つの行を最初のテーブルの複数の行に関連付けることができます。
>
リレーショナルデータベースでは、これは second_table_id
を持つ最初のテーブルで実装できます。 2番目のテーブルのどの行にその行が関連しているかを示す列。
この場合、複数の行が複数の行に関連付けられています。
この種の関係は、SQLテーブルのように表すことはできません。テーブル間に多対1および1対多の関係のみが存在するように、2つのテーブル間に結合テーブルを追加する必要があります。
中央のテーブルの各行は、左側のテーブルの行と右側のテーブルの行の間の1つの関係を表しています。
MySQLの実際には、その中央のテーブルには first_table_id
の列があります。 およびsecond_table_id
の列 、それぞれの組み合わせは一意です。
組織のデータベースがあり、チーム(チームの名前やその他の識別情報)を含むテーブルと、プロジェクト(名前、進捗状況など)を含むテーブルがあるとします。
id | team_name | 専門 |
---|---|---|
1 | バナナスローワー | バナナ |
2 | ウッドグナワーズ | 木をかじる |
3 | ピンクの象 | 地面を踏みつける |
4 | ふわふわポテト | 仕事と睡眠 |
id | project_name | 進捗状況 |
---|---|---|
1 | ダムビル | もう少し木のかじりと地面の踏みつけが必要です |
2 | バナナケーキ | 誰かがすべてのバナナを食べています |
3 | 睡眠調査 | 睡眠不足の調査が不十分 |
チームは複数のプロジェクトで作業でき、プロジェクトは複数のチームで作業できるため、チームとプロジェクトの一致を追跡する3番目のテーブルもあります。
project_id | group_id |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
JOIN
を使用できます 次のように、人間が読める形式でテーブルの情報を表示する必要がある場合に、すべてをまとめるステートメント:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
SELECT
を使用して、各テーブルから表示する列を選択します ステートメント。
テーブルの行をON
と組み合わせる方法を指定します ステートメント。
そして、 ORDER BY
を使用して、好みの方法で行を並べ替えます。 ステートメント。
ON
ステートメントteams.id=matches.team_id
およびmatches.projects_id=projects.id
matchs
の行を使用して行が結合されることを意味します テーブル。出力テーブルの各行には、プロジェクト名とチーム名があり、 matchs
のプロジェクトIDとチームIDのペアを使用して組み合わされています テーブル。
出力テーブルは次のようになります。
Team_name | Project_name |
---|---|
バナナスローワー | バナナケーキ |
バナナスローワー | 睡眠研究 |
ウッドグナワーズ | ダムバルディング |
ウッドグナワーズ | 睡眠研究 |
ピンクの象 | ダムビル |
ピンクの象 | ダムビル |
ふわふわのジャガイモ | 睡眠研究 |
matchs
から直接列はありません テーブル。 一致コード> 表は出力には表示されませんが、
team
の行を組み合わせる方法の説明として使用されます。 およびprojects
テーブル。
JOIN
ステートメントを使用すると、1つ以上のテーブルを結合できます。 ON
と組み合わせて使用する必要があります テーブルの行と別のテーブルの行の間の関係を判別するステートメント。
この記事では、 JOIN
の使用方法を学びました。 3つの異なるテーブルを結合するステートメント。