WHERE句とON句、どちらに条件を記述するかによってSQLの結果は変わるのか
WHERE句に条件を記述した場合と、ON句に条件を記述した場合とで
結果はどうなるのか気になったので実験しました。
まずは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の結果
次に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の結果
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の結果
結果が変わりましたね!
左外部結合の場合は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の結果
SQL文1,2と同じ結果ですね。SECTION_CODEを結合キーとして
外部結合した後、WHERE句で絞り込みをかける為、SQL文3とは結果が変わります。