プログラミング覚え書き

WEB製作覚え書き

ノート代わりに勉強した内容をまとめています。

MariaDB:リレーション(テーブルの結合)

 

結合するサンプルテーブルの準備

商品管理用のcommodityテーブル

+----+----------------------+-------+-------+
| id | item                 | price | maker |
+----+----------------------+-------+-------+
|  1 | おいしい水           |   190 |  NULL |
|  2 | ポテトチップバターし |   120 |  NULL |
|  3 | カフェ'チョコ        |   150 |  NULL |
|  5 | チョコパン           |   240 |  NULL |
|  6 | 米                   |  2000 |  NULL |
|  7 | たまねぎ             |     0 |  NULL |
|  8 | NULL                 |  9800 |  NULL |
+----+----------------------+-------+-------+

 

メーカー管理用のtraderテーブル

+----+----------------------+-------+-------+
| id | item                 | price | maker |
+----+----------------------+-------+-------+
|  1 | おいしい水           |   190 |     3 |
|  2 | ポテトチップバターし |   120 |  NULL |
|  3 | カフェ'チョコ        |   150 |  NULL |
|  5 | チョコパン           |   240 |  NULL |
|  6 | 米                   |  2000 |  NULL |
|  7 | たまねぎ             |     0 |  NULL |
|  8 | NULL                 |  9800 |  NULL |
+----+----------------------+-------+-------+ 

commodityテーブル:

 テーブルを結びつけるためのmakerフィールドを追加

+----+----------------------+-------+-------+
| id | item                 | price | maker |
+----+----------------------+-------+-------+
|  1 | おいしい水           |   190 |  NULL |
|  2 | ポテトチップバターし |   120 |  NULL |
|  3 | カフェ'チョコ        |   150 |  NULL |
|  5 | チョコパン           |   240 |  NULL |
|  6 | 米                   |  2000 |  NULL |
|  7 | たまねぎ             |     0 |  NULL |
|  8 | NULL                 |  9800 |  NULL |
+----+----------------------+-------+-------+

commodityテーブル:

 makerフィールドにid番号をセット

+----+----------------------+-------+-------+
| id | item                 | price | maker |
+----+----------------------+-------+-------+
|  1 | おいしい水           |   190 |     3 |
|  2 | ポテトチップバターし |   120 |     4 |
|  3 | カフェ'チョコ        |   150 |     4 |
|  5 | チョコパン           |   240 |     1 |
|  6 | 米                   |  2000 |     2 |
|  7 | たまねぎ             |     0 |  NULL |
|  8 | NULL                 |  9800 |  NULL |
+----+----------------------+-------+-------+

 

内部結合(JOIN

書式1(JOIN

SELECT フィールド名 FROM テーブル名1 JOIN テーブル名2
ON テーブル名1. フィールド名=テーブル名2. フィールド名;

SELECT * FROM commodity JOIN trader
ON commodity. maker=trader. id;

※両テーブルに共通するフィールド名がない場合、ONの後のテーブル名指定は省略可能だが、以後同じフィールド名が作成されないとも限らないため、指定しておく方が良い。

※ONの後、テーブル名.とフィールド名の間には半角スペース!!

+----+----------------------+-------+-------+----+------------+---------+--------------+
| id | item                 | price | maker | id | company    | address | tel          |
+----+----------------------+-------+-------+----+------------+---------+--------------+
|  5 | チョコパン           |   240 |     1 |  1 | 東京パン   | 東京都  | 03-0000-0000 |
|  6 | 米                   |  2000 |     2 |  2 | 宇都宮米店 | 栃木県  | 028-111-1111 |
|  1 | おいしい水           |   190 |     3 |  3 | 札幌農場   | 北海道  | 011-222-2222 |
|  2 | ポテトチップバターし |   120 |     4 |  4 | 浦安製菓   | 千葉県  | 047-XXX-3333 |
|  3 | カフェ'チョコ        |   150 |     4 |  4 | 浦安製菓   | 千葉県  | 047-XXX-3333 |
+----+----------------------+-------+-------+----+------------+---------+--------------+

 ※ONの条件で対応する相手があるものだけ表示される

 

書式2

SELECT フィールド名 FROM テーブル名1,テーブル名2
WHERE テーブル名1.フィールド名=テーブル名.2フィールド名;

FROMの後に結合するテーブルを「,」で区切り羅列する。結合するテーブルはいくつでも指定可能。ただし、WHEREで照合用のフィールドを指定してあげないと、全てを総当たりにした無駄に長いテーブルが表示されるので注意。

 

 

外部結合

内部結合の場合、照合できないレコードは表示されない。外部結合を使用すると照合できなかったレコードも表示させることができる。

 

左外部結合(LEFT JOIN

SELECT フィールド名 FROM テーブル名1 LEFT JOIN テーブル名2
ON テーブル名1. フィールド名=テーブル名2. フィールド名;

f:id:midori_x:20200210103600p:plain

 

右外部結合(RIGHT JOIN

SELECT フィールド名 FROM テーブル名1 RIGHT JOIN テーブル名2
ON テーブル名1. フィールド名=テーブル名2. フィールド名; 

f:id:midori_x:20200210103758p:plain