• ベストアンサー

SQL文を勉強し始めたのですが質問です。

受講履歴表(研修コード、社員番号、評価)と、社員マスター(社員番号、氏名、部署番号)という2つの表があるときに、次の2つのSQL文はどちらでも同じでしょうか?それとも違う意味があるでしょうか? SELECT 社員マスター.社員番号, 研修コード, 評価, 氏名 FROM 受講履歴表, 社員マスター WHERE 受講履歴表.社員番号 = 社員マスター.社員番号 SELECT 受講履歴表.社員番号, 以下は上と同じ。 それから、もう一つ分からないのは、アクセスの講習を受けたときは、選択クエリを作るときは、多側のテーブルのフィールドを選んだのですが、SQLの教科書では、社員マスターのフィールドを選ぶように書いてありました。でも理由が書いていないので、なぜそうなのか、よくわかりません。 アクセスの選択クエリと、上のSQL文では、意味が違うのでしょうか?どなたかわかる方、教えていただければありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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の内部処理の実装によるので一概にどちらのほう よいともいえません。

korachu
質問者

お礼

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

その他の回答 (2)

  • cazum
  • ベストアンサー率22% (2/9)
回答No.2

現状ではNO1の方のおっしゃるとおりと思います。 select 社員マスター.社員番号, 研修コード, 評価, 氏名 from 社員マスター left join 受講履歴表 on 社員マスター.社員番号 = 受講履歴表.社員番号 といった連結を勉強してみてください。違いがわかってくると思います。

korachu
質問者

お礼

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

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

普通のケースでは同じです。しかし特殊な処理があると違ってきます。 (社員マスターがあるが、受講履歴表にレコードがないとか言うときに処理の仕方が違ってきます。)

korachu
質問者

お礼

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

関連するQ&A