プロが教える店舗&オフィスのセキュリティ対策術

innerjoinとleftjoinとrightjoinについてお聞きします。
この3つの検索方法の違いがよく理解できません。
どなたか宜しくお願いします。
また、どのような時にどの検索方法が適しているか、
具体例などを添えていただければ分り易いかと思います。
宜しくお願いします。

A 回答 (3件)

一応、実SQLを載せておきます。


※机上で書いてて合っているか不安になったので。

create table 表1
( col1 char(1)
);

create table 表2
( col1 char(1)
);


insert into 表1 values('A');
insert into 表1 values('B');
insert into 表1 values('C');

insert into 表2 values('C');
insert into 表2 values('D');
insert into 表2 values('E');


select a.col1,b.col1
from 表1 a
inner join 表2 b
on a.col1 = b.col1
order by 1,2;

表1 表2
----- -----
C C

select a.col1,b.col1
from 表1 a
left outer join 表2 b
on a.col1 = b.col1
order by 1,2;

表1 表2
----- -----
A NULL
B NULL
C C

select a.col1,b.col1
from 表1 a
right outer join 表2 b
on a.col1 = b.col1
order by 1,2;

表1 表2
----- -----
C C
NULL D
NULL E

select a.col1,b.col1
from 表1 a
full outer join 表2 b
on a.col1 = b.col1
order by 1,2;

表1 表2
----- -----
A NULL
B NULL
C C
NULL D
NULL E
    • good
    • 0
この回答へのお礼

申し訳ありません。
お礼の投稿、遅くなりました。
それぞれの違い、よく理解することができました。
ありがとうございました。

お礼日時:2009/07/07 03:49

BOOKS ONLINEの以下を参照してください。


http://msdn.microsoft.com/ja-jp/library/ms191517 …
http://msdn.microsoft.com/ja-jp/library/ms191472 …

特徴的には以下の表1と表2を結合した場合に、どのような結果が戻されるかです。

表1
A
B
C

表2
C
D
E



inner join
表1 表2
-- --
C C

left outer join
表1 表2
-- --
A null
B null
C C

right outer join
表1 表2
-- --
C C
Null D
Null E

full outer join
表1 表2
-- --
A NULL
B NULL
C C
NULL D
NULL E
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
添付して頂いたサイトも参考にしてみます。
ありがとうございました。

お礼日時:2009/07/07 03:51

いずれのJOINもテーブルを結合して検索するときに使います。


結合するときには、結合条件を指定されます(これが結合時のキーになります)

INNER JOINは結合された2つのテーブルの両方に結合キーの値を持つデータがなければ、
仮に一方にはデータがあっても抽出されません。

LEFT OUTER JOINは主テーブルにデータがあれば、従テーブルにそのキーのデータがなくても抽出されます。
このとき従テーブルにはデータがないわけなので、従テーブルの項目は全部NULL(値不明・値未決定の意味)になります。

例としては、社員マスタと部署マスタなどで考えてみるといいでしょう。
社員マスタには全ての社員のデータが登録されていますが、一部の社員はまだ所属部署が決まっていないとします。
(社員マスタが主、部署マスタが従のテーブルと考えます)

SELECT
a.社員コード,
a.社員名,
b.部署名
FROM 社員マスタ a
INNER JOIN 部署マスタ b ON b.部署コード=a.部署コード
=>部署が決まっている社員だけが抽出されます

SELECT
a.社員コード,
a.社員名,
b.部署名
FROM 社員マスタ a
LEFT OUTER JOIN 部署マスタ b ON b.部署コード=a.部署コード
=>全ての社員が抽出されますが、部署が決まっていない社員の部署名はNULLと表示されます。

RIGHT OUTER JOINは、LEFT OUTER JOINの主と従をひっくり返して考えればよいのです。

SELECT
a.社員コード,
a.社員名,
b.部署名
FROM 社員マスタ a
RIGHT OUTER JOIN 部署マスタ b ON b.部署コード=a.部署コード
=>全ての部署が抽出されますが、まだ所属社員の決まっていない部署の社員コードと社員名はNULLと表示されます。

言いかえればRIGHT OUTER JOINは全てLEFT OUTER JOINに書き換えることができます。

SELECT
a.社員コード,
a.社員名,
b.部署名
FROM 部署マスタ b
LEFT OUTER JOIN 社員マスタ a ON a.部署コード=b.部署コード

実はデータベースも処理するときにRIGHT OUTER JOINは内部的にLEFT OUTER JOINに書き換えて処理しています。
つまり、RIGHT OUTER JOINは無理に使う必要はないということです。
構文としても、RIGHT OUTER JOINを使われると、「どのテーブルをメインのテーブルと考えて抽出を行おうとしているのか」が分かりにくくなりますので、お勧めしません。
(AccessなどでGUIでリレーションシップを張ると、RIGHT OUTER JOINが使われたSQL文を生成してくれたりするのですが、あとでメンテナンスするときには、とてもわかりにくいですよ。私個人でも、RIGHT OUTER JOINを書いたのは資格試験の問題を解くときだけで、実務で使ったことはほぼゼロです)
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
RIGHT JOINは無理に使う必要はないんですね。
実際、どんな時にRIGHT JOINを使うのか分からなかったので
とりあえず、使わないようにします。
ありがとうございました。

お礼日時:2009/07/07 03:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!