SQL INNER JOIN 内部結合のサンプル

SQLのinner joinのサンプルです。

目次

サンプル inner join(内部結合)
  on句の結合条件とwhere句の条件で絞る
  inner joinなしの場合(テーブルを並べて結合)
  結合するテーブルが3つの場合
結合後のデータ数が2倍になる場合

inner join(内部結合)

select
   項目
from テーブルA 
    inner  join テーブルB
on
   結合する条件
where
  抽出する条件
  • inner joinは、テーブルAとテーブルBを結合して、結合する条件に一致した行を抽出します(図の黄色の部分)。
  • on句の後に結合する条件を記述します。件数を絞る条件も追加できます。
  • whereは、結合されたデータ(※)に対して条件をつけて抽出します。
    (※オプティマイザにより結合前のデータを対象とする場合があります。)
  • inner joinは、内部結合と呼ばれます。inner(内側)のjoin(結合)です。

 

inner joinの使用例

次の2つのテーブルがあるとします。

salesテーブル
id price
1 300
2 400
3 200
productテーブル
id name
2 鉛筆
3 消しゴム
4 ノート

 

上記テーブルに対してinner joinを使用してデータを抽出します。

select 
  s.id,
  p.name,
  s.price
from sales s 
  inner join product p
on 
  s.id = p.id;

inner joinでテーブルを結合し、on句で結合条件を指定しています。

 

結果は、以下のとおりです。

id name price
2 鉛筆 400
3 消しゴム 200

salesテーブルとproductテーブルのidが一致した行のみ表示されます。

 

on句の結合条件とwhere句の条件で絞る

inner joinのon句の結合条件とwhere句の条件で絞るサンプルです。

select 
  s.id,
  p.name,
  s.price
from sales s 
  inner join product p
on 
  s.id = p.id
where
  p.name like '%筆';

イメージとしては、「7行目のon句で件数が2件になりwhere句で1件になる」ですが、実際はオプティマイザにより処理順序は変わる場合があります。

 

inner joinなしの場合(テーブルを並べて結合)

inner joinなしでも内部結合できますがinner joinありの方が結合条件がわかりやすいです。

select 
  s.id,
  p.name,
  s.price
from 
  sales s,
  product p
where
  s.id = p.id and
  p.name like '%筆';

fromの後にテーブルを複数指定します。where句で結合する条件を指定します。

 

結合するテーブルが3つの場合

次の3つのテーブルがあるとします。

salesテーブル
id price company_cd
1 300 101
2 400 201
3 200 301
productテーブル
id name
2 鉛筆
3 消しゴム
4 ノート
companyテーブル
id name
201 A社
301 B社

 

上記テーブルに対してinner joinを使用してデータを抽出します。

select 
  s.id,
  p.name,
  s.price,
  c.name as company
from 
  sales s 
   inner join product p
   on 
     s.id = p.id
   inner join company c
   on
     s.company_cd = c.id;

salesテーブルに対してproductテーブルとcompanyテーブルを結合しています。

 

結果は、以下のとおりです。

id name price company
2 鉛筆 400 A社
3 消しゴム 200 B社

 

結合後のデータ数が2倍になる場合

次の2つのテーブルがあるとします。

employeeテーブル
id(PK) name romaji
1 鈴木 suzuki
2 鈴木 suzuki
3 佐藤 sato
employee_bkテーブル
id(PK) name romaji
1 鈴木 suzuki
2 鈴木 suzuki
3 佐藤 sato

 

上記テーブルに対してinner joinを使用してデータを抽出します。

select a.name
from employee A
inner join employee_bk  B
on A.name = B.name 
where A.name  = '鈴木'

5行目のwhere句で条件を指定しています。

 

結果は、以下のように4件表示されてしまいます。(「鈴木」はそれぞれのテーブルで2件なので結果も2件を想定していた)
これは、表示結果に無い列で異なる値になっているためです。

name
鈴木
鈴木
鈴木
鈴木

 

異なる値を確認するため両テーブルのidまで含めたSQLを実行します。

select a.id,a.name,b.id,b.name
from employee A
inner join employee_bk  B
on A.name = B.name 
where A.name  = '鈴木'

 

結果は以下のようにidの組み合わせが異なるパターンになっています。

id name id name
1 鈴木 1 鈴木
2 鈴木 1 鈴木
1 鈴木 2 鈴木
2 鈴木 2 鈴木

 

対応

1.onの結合条件にidを追加した場合。

select a.id,a.name,b.id,b.name
from employee A
inner join employee_bk  B
on A.name = B.name and
a.id = b.id
where A.name  = '鈴木'

結果

id name id name
1 鈴木 1 鈴木
2 鈴木 2 鈴木

2件になりました。

 

2.distinctを使用+id列を表示しない場合

select distinct a.name
from employee A
inner join employee_bk  B
on A.name = B.name
where A.name  = '鈴木'

結果

name
鈴木

distinctは重複行を1行にします。

 

3.onの結合条件をidのみにした場合は2件表示されます。

select a.name
from employee A
inner join employee_bk  B
on a.id = b.id
where A.name  = '鈴木'
name
鈴木
鈴木

関連の記事

SQL LEFT JOIN 外部結合のサンプル
SQL 副問合せのサンプル(サブクエリ)
SQL UNIONとUNION ALLのサンプル(結合して抽出)

△上に戻る