TIL#51 DB)リレーショナル・データベースのJOIN演算子


JOIN
リレーショナル・データベースでは、重複データを回避するために、データを複数のテーブルに分割して格納します.このように分離されたデータから所望の結果を再取得するためには、複数のテーブルを組み合わせる必要がある.リレーショナル・データベースでは、「結合」(JOIN)演算子を使用して、関連する列の基準で行を連結します.LEFTJOINとINNERJOINは絶対2種類使用しており、残りの使用頻度は比較的低い.

結合の種類

Exampleテーブル
mysql> select * from people;
idnamephone1Mr Brown01225 7082252Miss Smith01225 8993603Mr Pullen01380 724040
mysql> select * from property;
idsellingpeople_id1Old House Farm12The Willows33Tail Trees34The Melksham Florist35Dun Roamin4
1. INNER JOIN
基本的にJOINは交点です
mysql> select name, phone, selling
       from people JOIN property
       on people.id = property.people_id;
       
 +-----------+--------------+----------------------+
 | name      | phone        | selling              | 
 +-----------+--------------+----------------------+ 
 | Mr Brown  | 01225 708225 | Old House Farm       | 
 | Mr Pullen | 01380 724040 | The Willows          | 
 | Mr Pullen | 01380 724040 | Tall Trees           | 
 | Mr Pullen | 01380 724040 | The Melksham Florist | 
 +-----------+--------------+----------------------+
2. LEFT JOIN
  • 左のテーブルを中心に右のテーブルを合わせます.
  • 左テーブルの1つのレコードに複数の右テーブルレコードが一致すると、左テーブルレコードが複数回表示されます.
  • 左は無条件に表示され、組み合わせたレコードが右にない場合はNULLが表示されます.
  • mysql> select name, phone, selling 
           from people LEFT JOIN property 
           on people.id = property.people_id; 
    
    +------------+--------------+----------------------+
    | name       | phone        | selling              |
    +------------+--------------+----------------------+
    | Mr Brown   | 01225 708225 | Old House Farm       |
    | Miss Smith | 01225 899360 | NULL                 |
    | Mr Pullen  | 01380 724040 | The Willows          |
    | Mr Pullen  | 01380 724040 | Tall Trees           |
    | Mr Pullen  | 01380 724040 | The Melksham Florist |
    +------------+--------------+----------------------+
    3. RIGHT JOIN
  • 右側テーブルを中心に、左側テーブルを合わせます.
  • LEFTJOINでは方向のみが変更されているため、このレコードは複数回表示されるか、NULLが表示される.
  • mysql> select name, phone, selling 
           from people RIGHT JOIN property 
           on people.id = property.people_id;
    
    +-----------+--------------+----------------------+
    | name      | phone        | selling              |
    +-----------+--------------+----------------------+
    | Mr Brown  | 01225 708225 | Old House Farm       |
    | Mr Pullen | 01380 724040 | The Willows          |
    | Mr Pullen | 01380 724040 | Tall Trees           |
    | Mr Pullen | 01380 724040 | The Melksham Florist |
    | NULL      | NULL         | Dun Roamin           |
    +-----------+--------------+----------------------+