DATABASE
その他 分類

【SQL入門】JOIN構文,内部結合,外部結合

投稿者情報

  • 運営局 投稿
  • 投稿日

コンテンツ情報

本文内容

複数のテーブルから情報を取得する必要がある際、テーブルを連結することでクエリの発行から情報の取得までを一度で済ませることができます。

複数のテーブルを連結させるには、FROMで複数のテーブルを指定することで実現することができます。

複数のテーブルを指定するには、テーブル名とテーブル名の間にカンマ( , )、もしくはJOINを挟みます。

SELECT * FROM テーブル名, テーブル名

JOINを使って同様のことが行えます。

SELECT * FROM テーブル名 JOIN テーブル名

次のクエリは、購入履歴(purchase)テーブルと顧客(customer)テーブルを結合し、[購入ID(id_p)] フィールド、[名前(fullname)]
フィールドを表示します。

SELECT id_p, fullname 
FROM purchase JOIN customer ON purchase.id_c=customer.id_c;
+------+--------------------------------------+
| id_p | fullname                             |
+------+--------------------------------------+
|    1 | マディ・ウォーターズ                 |
|    2 | エラ・フィッツジェラルド             |
|    3 | エディ・ロバーツ                     |
|    4 | トミー・ゲレロ                       |
|    5 | エディ・ロバーツ                     |
|    6 | トミー・ゲレロ                       |
+------+--------------------------------------+

購入履歴(purchase)テーブルと顧客(customer)テーブルを結合するために、JOINを使っています。ON以降の「purchase.id_c = customer.id_c」という箇所は、「顧客履歴テーブルと顧客テーブルの[顧客ID(id_c)]フィールドの値が一致したレコードを選択する」という意味です。複数のテーブルにリレーションを張るには、FROMの部分に複数のテーブルをカンマ( ,
)かJOINで区切って並べ、ONでそれらのテーブルを連結する条件を指定します。

内部結合

JOIN、カンマ( , )は2つのテーブルを比較し、結合条件に一致した行だけを返します。これを内部結合と呼び、他の結合方法と区別しやすいように、INNER JOINと記述することも可能です。

JOIN、カンマ( , )、INNER JOINはどれも意味は同じです。

購入履歴(purchase)テーブルと商品(goods)テーブルを[商品ID(id_g)]で内部結合してみましょう。

SELECT purchase.id_g,name 
FROM goods INNER JOIN  purchase ON purchase.id_g=goods.id_g;
+------+----------------------+
| id_g | name                 |
+------+----------------------+
|    1 | Afro-American-Arctic |
|    1 | Afro-American-Arctic |
|    1 | Afro-American-Arctic |
|    2 | Ready To Die         |
|    2 | Ready To Die         |
|    4 | Things Fall Apart    |
+------+----------------------+

内部結合は2つのテーブルを比較し、結合条件に一致したレコードだけを返す結合方法です。どちらかのテーブルに無いレコードは表示されないので、購入履歴テーブルに記録の無い商品、ここでは[商品ID(id_g)]が3のレコードは表示されません。

外部結合

内部結合が両方のテーブルを比較し、結合条件に一致したレコードだけを返す結合方法だったのに対し、外部結合は、結合条件に一致した行に加え、指定したテーブルに関しては結合条件に一致しなくてもレコードを返す結合方法です。

外部結合には、LEFT JOINキーワードとRIGHT JOINキーワードの2種があります。JOINを中心にして、JOINの前に記述したテーブルを左、JOINの後に記述したテーブルを右として、LEFT JOINは左側のテーブルが結合条件に一致しなくてもレコードを返し、RIGHTJOINは右側のテーブルが結合条件に一致しなくてもレコードを返します。

それでは、購入履歴(purchase)テーブルと商品(goods)テーブルを[商品ID(id_g)]で外部結合してみましょう。ここれではLEFT OUTER JOINを使います。OUTERは省略可能です。

SELECT purchase.id_g,name
FROM goods LEFT OUTER JOIN purchase ON purchase.id_g=goods.id_g;
+------+----------------------+
| id_g | name                 |
+------+----------------------+
|    1 | Afro-American-Arctic |
|    1 | Afro-American-Arctic |
|    1 | Afro-American-Arctic |
|    2 | Ready To Die         |
|    2 | Ready To Die         |
| NULL | Fresh                |
|    4 | Things Fall Apart    |
+------+----------------------+

LEFT OUTER JOINキーワードを使っているので、左に指定した商品(goods)テーブルは条件に一致しなくてもレコードが返されます。

JOIN構文
テーブル名, テーブル名
テーブル名 JOIN テーブル名
テーブル名 INNER JOIN テーブル名 JOIN条件式
テーブル名 STRAIGHT_JOIN テーブル名
テーブル名 LEFT [OUTER] JOIN テーブル名 JOIN条件式
テーブル名 LEFT [OUTER] JOIN テーブル名
テーブル名 NATURAL [LEFT [OUTER]] JOIN テーブル名

{ oj テーブル名 LEFT OUTER JOIN テーブル名 ON 条件式 }
テーブル名 RIGHT [OUTER] JOIN テーブル名 JOIN条件式
テーブル名 RIGHT [OUTER] JOIN テーブル名
テーブル名 NATURAL [RIGHT [OUTER]] JOIN テーブル名
[JOIN]

JOINとカンマ( , )は、同義語です。どちらもテーブル間の直積です。

[テーブル名]

[テーブル名] は次のように定義と同じです。

テーブル名 [[AS] エイリアス名] [USE INDEX (キー・リスト)] [IGNORE INDEX (キー・リスト)] 

[テーブル名] は、テーブル名 AS エイリアス名や "テーブル名 エイリアス名" によるエイリアス名を指定することができます。

SELECT t1.sei, t2.quantity 
FROM customer AS t1, goods AS t2
WHERE t1.id_c = t2.id_c;
[JOIN条件式]

[JOIN条件式] は次のような定義と同じです。

ON 条件式 | USING (フィールド・リスト) 
[LEFT OUTER JOIN]

LEFT OUTER JOIN は、ODBCとの互換性のために用意されています。

[OUTER]

外部結合を明示するためのキーワードで、省略可能です。

関連資料

新着投稿


  • 投稿がありません。

新着書込み


  • 書込みがありません。
アラート 0