複数のテーブルを結合して、1つの表として扱うことができます。
結合にはいくつかの種類があります。
6.1.1 UNIONによる結合
UNIONを使うと、複数のSELECT文を繋いで、複数テーブルのレコードを
表示することができます。
SELECT 列名1 FROM テーブル名1 UNION SELECT 列名2 FROM テーブル名2;たとえば、次のような2つのテーブルがあるとします。
mysql> SELECT * FROM staff;2つのテーブルのレコードを全部まとめて出力できます。
+----+-----------+------+------+
| 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 |
+----+----------+------+------+
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 件のコメント:
コメントを投稿