MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで2つのテーブルを外部キー制約を使って結合する方法

MySQLでは、外部キー制約を設定した2つのテーブルを作成し、JOIN句を使って結合することができます。ここでは、親テーブルと子テーブルを作成し、LEFT JOINで結合する手順を具体的に解説します。

1. 親テーブル(ParentTable)の作成

まず、最初のテーブルを作成します。UniqueId列をAUTO_INCREMENT付きの主キーとして定義します。

mysql> create table ParentTable
    -> (
    -> UniqueId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EmployeeName varchar(10)
    -> );
Query OK, 0 rows affected (0.56 sec)

レコードの挿入

INSERTコマンドを使って、親テーブルにいくつかのレコードを挿入します。

mysql> insert into ParentTable(EmployeeName) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into ParentTable(EmployeeName) values('Carol');
Query OK, 1 row affected (0.32 sec)
mysql> insert into ParentTable(EmployeeName) values('Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into ParentTable(EmployeeName) values('Bob');
Query OK, 1 row affected (0.19 sec)

データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from ParentTable;

実行結果は以下の通りです。

+----------+--------------+
| UniqueId | EmployeeName |
+----------+--------------+
|        1 | John         |
|        2 | Carol        |
|        3 | Sam          |
|        4 | Bob          |
+----------+--------------+
4 rows in set (0.00 sec)

2. 子テーブル(ChildTable)の作成

次に、外部キー制約を持つ2つ目のテーブルを作成します。CONSTRAINT句でfk_uniqueIdという名前の外部キーを定義し、ParentTableのUniqueId列を参照させます。

mysql> create table ChildTable
    -> (
    -> UniqueId int NOT NULL PRIMARY KEY,
    -> EmployeeAddress varchar(100),
    -> CONSTRAINT fk_uniqueId FOREIGN KEY(UniqueId) references ParentTable(UniqueId)
    -> );
Query OK, 0 rows affected (0.54 sec)

レコードの挿入

子テーブルにもINSERTコマンドでレコードを追加します。なお、3番目のレコードは住所がNULLになるよう、UniqueIdのみを挿入しています。

mysql> insert into ChildTable values(1,'15 West Shady Lane Starkville, MS 39759');
Query OK, 1 row affected (0.19 sec)
mysql> insert into ChildTable values(2,'72 West Rock Creek St. Oxford, MS 38655');
Query OK, 1 row affected (0.18 sec)
mysql> insert into ChildTable(UniqueId) values(3);
Query OK, 1 row affected (0.41 sec)
mysql> insert into ChildTable values(4,'119 North Sierra St. Marysville, OH 43040');
Query OK, 1 row affected (0.16 sec)

データの確認

mysql> select *from ChildTable;

実行結果は以下の通りです。

+----------+-------------------------------------------+
| UniqueId | EmployeeAddress                           |
+----------+-------------------------------------------+
|        1 | 15 West Shady Lane Starkville, MS 39759   |
|        2 | 72 West Rock Creek St. Oxford, MS 38655   |
|        3 | NULL                                      |
|        4 | 119 North Sierra St. Marysville, OH 43040 |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)

3. LEFT JOINで2つのテーブルを結合する

準備ができたら、LEFT JOINを使って両方のテーブルを結合します。結合条件として、ParentTableのUniqueIdとChildTableのUniqueIdをON句で指定します。

mysql> select ParentTable.UniqueId,ParentTable.EmployeeName,ChildTable.EmployeeAddress from
ParentTable left join
    -> ChildTable on ParentTable.UniqueId=ChildTable.UniqueId;

実行結果は以下の通りです。

+----------+--------------+-------------------------------------------+
| UniqueId | EmployeeName | EmployeeAddress                           |
+----------+--------------+-------------------------------------------+
|        1 | John         | 15 West Shady Lane Starkville, MS 39759   |
|        2 | Carol        | 72 West Rock Creek St. Oxford, MS 38655   |
|        3 | Sam          | NULL                                      |
|        4 | Bob          | 119 North Sierra St. Marysville, OH 43040 |
+----------+--------------+-------------------------------------------+
4 rows in set (0.00 sec)

まとめ

LEFT JOINを使用すると、左側のテーブル(ParentTable)のすべてのレコードが必ず表示され、右側のテーブル(ChildTable)に一致するデータがない場合はNULLが返されます。上記の例では、UniqueIdが3の「Sam」の住所が子テーブルに存在しないため、EmployeeAddressがNULLとして表示されています。このように、外部キー制約とJOINを組み合わせることで、複数のテーブルに分散したデータを効率的に取得できます。

  1. 2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?

    はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1    -> (   &nb

  2. MySQLで1つのクエリを使ってSELECTとINSERTを同時に実行する方法

    MySQLでは、INSERT INTO ... SELECT構文とUNION ALLを組み合わせることで、1つのクエリだけで別テーブルからデータを選択(SELECT)し、挿入(INSERT)することができます。本記事では、実際のサンプルコードを使ってその手順をわかりやすく解説します。1. 最初のテーブルを作成するまず、データの挿入先となる最初のテーブルを作成します。以下のクエリを実行してください。mysql> create table DemoTable1 -> ( -> StudentName varchar(20), -> StudentMarks