• ベストアンサー

テーブルを結合するとき

MySQLのSQL文です。 TblAのID、Nmがあり、TblBにID、Adrsがあるとします。 次の2つのSQL文の結果は同じになります。 そもそもこの2つの書き方には何か違う意味があるのでしょうか。 CREATE View TblC1 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA INNER JOIN TblB ON TblA.ID = TblB.ID; CREATE View TblC2 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA ,TblB where TblA.ID = TblB.ID; また、TblAにはありTblBには含まれないレコードを出すときは CREATE View TblC3 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA LEFT JOIN TblB ON TblA.ID = TblB.ID; 逆にTblBにありTblAには含まれないレコードを出すときは CREATE View TblC4 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA RIGHT JOIN TblB ON TblA.ID = TblB.ID; としています。 これをwhereを使った書き方ではできないのでしょうか。

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

  • ベストアンサー
  • takubou05
  • ベストアンサー率52% (11/21)
回答No.1

まず、 InnerJoinか where句で 結合指定をするかですが、 基本的にはどちらでもかまいません。 実行計画を見ても違いはないです。 実行計画はselect句の前に”explain”を追加すると確認できます。 参考URL : http://dev.mysql.com/doc/refman/5.1/ja/explain.html >また、TblAにはありTblBには含まれないレコードを出すときは これは、差集合といいます。 mysql での差集合の抽出方法は、 where句に、"not exitst"で出来ます。 頑張ってみてください。

Hirorin_20
質問者

お礼

ありがとうございました

その他の回答 (1)

回答No.2

MySQLのビュー表は、MySQL 5.0と実装が遅く、「FROM句でのサブクエリ(インラインビュー)」を使えないなどいろいろ制限があるので、初歩のSQLの勉強に使うにはお薦めしません。 内部結合だけの話なら、ONでの結合条件と、WHEREで結合条件を指定するのに差異はありません。 しかし、外部結合の場合は、まったく意味が違ってきます。 ON句で指定するのは結合条件で、どのように表を結合するかを指定します。この結合条件に合致しなかったものは、左側の表、右側の表などを基準にnullで返されます。 一方、WHERE句で書くのは制限条件であり、最終的な結果に影響します。 差分検索する基本的な方法として、 (1)left joinして、結合キーがnullとなるもの (2)サブクエリの「not exists」 (3)サブクエリの「not in」 を使うといった方法があります。 このうち、not inは、性能を出しにくい構文です。 MySQLでは、サブクエリの実装がMySQL 4.1と遅かったこともあり、サブクエリでなくジョインに書き換える方が性能を出しやすいといったケースがたくさんあります。 以下、ぱっと思いついた構文で、実機確認していませんが、参考まで。 -- t1にあり、t2にない行 -- left join select t1.c1 from t1 left join t2 on t1.c1=t2.c1 where t2.c1 is null -- not exists select c1 from t1 where c1 not exists(select 1 from t2 where t1.c1=t2.c1) -- not in select c1 from t1 where c1 not in(select c1 from t2)

Hirorin_20
質問者

お礼

ありがとうございました。

関連するQ&A