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つのテーブルがあるとします。
id | price |
---|---|
1 | 300 |
2 | 400 |
3 | 200 |
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つのテーブルがあるとします。
id | price | company_cd |
---|---|---|
1 | 300 | 101 |
2 | 400 | 201 |
3 | 200 | 301 |
id | name |
---|---|
2 | 鉛筆 |
3 | 消しゴム |
4 | ノート |
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つのテーブルがあるとします。
id(PK) | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 鈴木 | suzuki |
3 | 佐藤 | sato |
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のサンプル(結合して抽出)