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を組み合わせることで、複数のテーブルに分散したデータを効率的に取得できます。
-
2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?
はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1 -> ( &nb
-
MySQLで1つのクエリを使ってSELECTとINSERTを同時に実行する方法
MySQLでは、INSERT INTO ... SELECT構文とUNION ALLを組み合わせることで、1つのクエリだけで別テーブルからデータを選択(SELECT)し、挿入(INSERT)することができます。本記事では、実際のサンプルコードを使ってその手順をわかりやすく解説します。1. 最初のテーブルを作成するまず、データの挿入先となる最初のテーブルを作成します。以下のクエリを実行してください。mysql> create table DemoTable1 -> ( -> StudentName varchar(20), -> StudentMarks