dポイントプレゼントキャンペーン実施中!

受講履歴表(研修コード、社員番号、評価)と、社員マスター(社員番号、氏名、部署番号)という2つの表があるときに、次の2つのSQL文はどちらでも同じでしょうか?それとも違う意味があるでしょうか?
SELECT 社員マスター.社員番号, 研修コード, 評価, 氏名 FROM 受講履歴表, 社員マスター WHERE 受講履歴表.社員番号 = 社員マスター.社員番号

SELECT 受講履歴表.社員番号, 以下は上と同じ。

それから、もう一つ分からないのは、アクセスの講習を受けたときは、選択クエリを作るときは、多側のテーブルのフィールドを選んだのですが、SQLの教科書では、社員マスターのフィールドを選ぶように書いてありました。でも理由が書いていないので、なぜそうなのか、よくわかりません。
アクセスの選択クエリと、上のSQL文では、意味が違うのでしょうか?どなたかわかる方、教えていただければありがたいです。

A 回答 (3件)

どちらのクエリも意味は同じです。


このようなクエリを内部結合とかインナージョインとか
いうのですが、= で結ばれるカラムはどちらの表のもの
を指定してもまったく等価でクエリの結果は同じです。

簡単に、表Aと表Bがあるとします。

表A
c1 c2
1 X
2 Y

表B
c1 c3 c4
1 a 10
1 b 20
2 x 0


SELECT * FROM 表A, 表B

では結果はこんな感じになります。

表A.c1 表A.c2 表B.c1 表B.c3 表B.c4
1 X 1 a 10
1 X 1 b 20
1 X 2 x 0
2 Y 1 a 10
2 Y 1 b 20
2 Y 2 x 0

次に

SELECT * FROM 表A,表B
WHERE 表A.c1 = 表B.c1

の結果は上記から表A.c1 = 表B.c1 のものを取り出した
形になるのでこんな感じです。

表A.c1 表A.c2 表B.c1 表B.c3 表B.c4
1 X 1 a 10
1 X 1 b 20
2 Y 2 x 0

結合の条件として = が使われるとその条件の列は必ず
等しくなりますので、

SELECT 表A.c1, c2,c3,c4 FROM 表A,表B
WHERE 表A.c1 = 表B.c1



SELECT 表B.c1, c2,c3,c4 FROM 表A,表B
WHERE 表A.c1 = 表B.c1

も同じ結果を返します。つまり等価なクエリです。

結果は同じなのですが、選択する列によって実行速度
に違いが出たりする場合があります。
DBMSの内部処理の実装によるので一概にどちらのほう
よいともいえません。
    • good
    • 0
この回答へのお礼

丁寧に教えていただいてありがとうございました。
実行速度が違うとは考えていなかったので、とてもためになりました。

お礼日時:2003/10/09 22:18

現状ではNO1の方のおっしゃるとおりと思います。




select 社員マスター.社員番号, 研修コード, 評価, 氏名 from 社員マスター left join 受講履歴表 on 社員マスター.社員番号 = 受講履歴表.社員番号

といった連結を勉強してみてください。違いがわかってくると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
今持っている教科書は本当に基礎的なものでleft joinという連結は載っていませんでした。
更に本を買って勉強したいと思います。

お礼日時:2003/10/09 22:20

普通のケースでは同じです。

しかし特殊な処理があると違ってきます。
(社員マスターがあるが、受講履歴表にレコードがないとか言うときに処理の仕方が違ってきます。)
    • good
    • 0
この回答へのお礼

早速にお答えいただいてありがとうございました。
受講履歴表にレコードがないと言うときというのは、まったくレコードがないときなのか、それとも違うのか良くわかりませんが、多分、これから勉強を進めればわかってくるものと思います。どうも、ありがとうございました。

お礼日時:2003/10/09 22:23

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

関連するカテゴリからQ&Aを探す