2012年8月22日水曜日

6.1 テーブルの結合


複数のテーブルを結合して、1つの表として扱うことができます。
結合にはいくつかの種類があります。

6.1.1 UNIONによる結合


UNIONを使うと、複数のSELECT文を繋いで、複数テーブルのレコードを
表示することができます。

SELECT 列名1 FROM テーブル名1 UNION SELECT 列名2 FROM テーブル名2;
たとえば、次のような2つのテーブルがあるとします。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM staff2;
+----+----------+------+------+
| id | name | age | bid |
+----+----------+------+------+
| 1 | Ito | 27 | 2 |
| 2 | Yamamoto | 31 | 1 |
| 3 | Nakamura | 24 | 4 |
+----+----------+------+------+
2つのテーブルのレコードを全部まとめて出力できます。

mysql> SELECT * FROM staff UNION SELECT * FROM staff2;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
| 1 | Ito | 27 | 2 |
| 2 | Yamamoto | 31 | 1 |
| 3 | Nakamura | 24 | 4 |
+----+-----------+------+------+

なお、それぞれのテーブルでキャラクタセットが異なると、UNIONを使う
ことができませんので注意してください。

6.1.2 内部結合


UNIONによる結合は、2つのテーブルを縦に結合しましたが、横に結合す
るには内部結合や外部結合を使います。まず、以下のような2つのテーブル
(staffとbranch)があるとします。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM branch;
+----+------------+
| id | branchname |
+----+------------+
| 1 | Tokyo |
| 2 | Yokohama |
| 3 | Osaka |
| 4 | Nagoya |
+----+------------+

staffテーブルのbid列とbranchテーブルのid列を関連づけて表示することを
内部結合と呼んでいます。

SELECT 列名1 FROM テーブル名1 [INNER] JOIN テーブル名2
ON テーブル名1.列名1 = テーブル名2.列名2;

次の例を見てください。「staff.bid = branch.id」により、それぞれの列が
関連づけられています。

mysql> SELECT * FROM staff JOIN branch ON staff.bid = branch.id;
+----+-----------+------+------+----+------------+
| id | name | age | bid | id | branchname |
+----+-----------+------+------+----+------------+
| 1 | Sato | 23 | 1 | 1 | Tokyo |
| 2 | Suzuki | 24 | 2 | 2 | Yokohama |
| 3 | Takahashi | 28 | 1 | 1 | Tokyo |
| 4 | Tanaka | 26 | 3 | 3 | Osaka |
| 5 | Watanabe | 30 | 2 | 2 | Yokohama |
+----+-----------+------+------+----+------------+
mysql> SELECT name,age,branchname FROM staff JOIN branch ON
staff.bid = branch.id;
+-----------+------+------------+
| name | age | branchname |
+-----------+------+------------+
| Sato | 23 | Tokyo |
| Takahashi | 28 | Tokyo |
| Suzuki | 24 | Yokohama |
| Watanabe | 30 | Yokohama |
| Tanaka | 26 | Osaka |
+-----------+------+------------+

なお、branchテーブルにある4つめのレコード(Nagoya)は、staffテーブ
ルにはないので表示されません。

0 件のコメント:

コメントを投稿