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を使った書き方ではできないのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、 InnerJoinか where句で 結合指定をするかですが、


基本的にはどちらでもかまいません。

実行計画を見ても違いはないです。

実行計画はselect句の前に”explain”を追加すると確認できます。

参考URL : http://dev.mysql.com/doc/refman/5.1/ja/explain.h …




>また、TblAにはありTblBには含まれないレコードを出すときは
これは、差集合といいます。
mysql での差集合の抽出方法は、
where句に、"not exitst"で出来ます。

頑張ってみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2011/04/12 18:14

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)
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/15 09:05

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング