ちりぬるお本舗制作日誌

同人ゲーム・同人コミックその他制作サークル「ちりぬるお本舗」の主催でありプリキュアヲタクの奇々浦ヌル夫がゲーム、ドット絵、その他色々な物を作るブログです

WHERE句とON句、どちらに条件を記述するかによってSQLの結果は変わるのか

WHERE句に条件を記述した場合と、ON句に条件を記述した場合とで

結果はどうなるのか気になったので実験しました。

f:id:nulluo:20150715002635p:plain

 

 

まずはWHERE句を使用する場合を試しましょう。

上記のテーブルに対し、次のSQL文1を実行します。

 

<SQL文1> 

SELECT

W.WORKER_NAME,

W.JOIN_DATE,

SECTION_NAME

FROM MST_WORKER AS W

JOIN MST_SECTION AS S

ON W.SECTION_CODE=S.SECTION_CODE

WHERE W.JOIN_DATE = '2015-04-01'

 

SQL文1の結果

f:id:nulluo:20150715002759p:plain

 

 

次にON句を使用する場合です。

 

<SQL文2>

SELECT

W.WORKER_NAME,

W.JOIN_DATE,

SECTION_NAME

FROM MST_WORKER AS W

JOIN MST_SECTION AS S

ON W.SECTION_CODE=S.SECTION_CODE

AND W.JOIN_DATE = '2015-04-01'

 

SQL文2の結果

f:id:nulluo:20150715002759p:plain

 

SQL文1の結果とまったく同じである事が分かります。

 

以前、私は<SQL文1>の書き方しか知らなかったのですが

SQL文2>の書き方もできる事に気づいて「あれ?こんな書き方してもいいのかな?」と思い、

この実験を行ってみた次第です。

 

さて、SQL文1もSQL文2も表示される結果は同じという事は

条件を記述するのはWHERE句、ON句どちらでもよいのでしょうか?

 

実はそうではありません。

今までは内部結合の例でしたが、今度は外部結合で同じ事を試してみます。

下記のSQL文を実行してみましょう。

 

<SQL文3>

SELECT

W.WORKER_NAME,

W.JOIN_DATE,

SECTION_NAME

FROM MST_WORKER AS W

LEFT JOIN MST_SECTION AS S

ON W.SECTION_CODE=S.SECTION_CODE

AND W.JOIN_DATE = '2015-04-01'

 

SQL文3の結果

f:id:nulluo:20150715002910p:plain

 

 

結果が変わりましたね!

左外部結合の場合はON句に指定された条件を全て満たす行が存在しない場合

左のテーブル(この場合はMST_WORKER)の行に対し、NULL行を結合するのでこういう動きになります。

(右外部結合の場合は逆に、右のテーブルの行に対してNULL行を結合します。)

 

結論として、外部結合の場合はON句とWHERE句、どちらに条件を書くかで結果が変わる事が分かりました。

じゃあ、内部結合の場合はON句に条件記述する<SQL文2>のやり方をしてもいいのか?という疑問がわいてきますが

それについては、また今度時間があれば考察してみたいと思います。

意見があればコメントください。

 

 

ついでに、WHERE句に書いた場合の動作も載せておきます。

 

SQL文4>

SELECT

W.WORKER_NAME,

W.JOIN_DATE,

SECTION_NAME

FROM MST_WORKER AS W

LEFT JOIN MST_SECTION AS S

ON W.SECTION_CODE=S.SECTION_CODE

WHERE W.JOIN_DATE = '2015-04-01'

 

SQL文4の結果

f:id:nulluo:20150715002759p:plain

 

 

SQL文1,2と同じ結果ですね。SECTION_CODEを結合キーとして

外部結合した後、WHERE句で絞り込みをかける為、SQL文3とは結果が変わります。