今回はデータベースのクエリのINNER JOINとLEFT JOINについて説明します。
どちらもテーブルを結合するものですが、INNER JOINは内部結合、LEFT JOINは外部結合と呼ばれるものです。
内部結合と外部結合は異なるもので、違いをよく覚えておかないと正しいクエリは書けません。
今回お話しする内容は実務でもよく使うものなので、きちんと2つの違いを理解して欲しいと思います。
INNER JOIN(内部結合)の挙動
まず、INNER JOINの説明をする前に今回使用するテーブルについて説明します。
今回使用するテーブルは「item」という商品マスタのテーブルと、「sales」という売り上げ情報を登録するトランのテーブルの2つです。
itemのテーブルの中身は以下のようになっています。
そして、salesのテーブルの中身は以下のようになっています。
このテーブルに、以下のようにINNER JOINを使ったクエリを記述して、売り上げ情報を取り出してみます。
SELECT sales.date, item.item_code, sales.seq_no, item.price * sales.amount as sales_price
FROM sales
INNER JOIN item
ON item.item_code = sales.item_code
テーブルを結合する場合、ON句に結合条件を指定します。
ここでは商品コードを結合したいためそれぞれのテーブルのitem_codeを結合条件に指定しています。
なお、結合条件はANDやORを使って複数指定することも出来ます。
では、このクエリの実行結果を見てみましょう。
salesテーブルのうち、itemテーブルに存在する商品コードの情報のみをきちんと抽出できていることが分かります。
salesテーブルの一番下にあったitem_codeが10005のデータはitemテーブルに該当するコードがないため、INNER JOINを行った結果には出てきていません。
INNER JOINによる内部結合は結合条件に指定した列が、双方のテーブルに存在する値のもののみを取得すると覚えておくとよいでしょう。
結合結果がNULLになるものはINNER JOINによる内部結合では除外されます。
LEFT JOIN(左外部結合)の挙動
では、LEFT JOINによる外部結合の動作を見てみます。
LEFT JOINはLEFT OUTER JOINと書くこともありますが、OUTERは省略されることも多いです。
また、RIGHT JOINというものもありますが、あまり使うことがないため、LEFT JOINのみを説明したいと思います。
LEFT JOINを使ったクエリは以下のように書くことが出来ます。
SELECT sales.date, item.item_code, sales.seq_no, item.price * sales.amount as sales_price
FROM sales
LEFT JOIN item
ON item.item_code = sales.item_code
INNER JOINの説明の際に使ったクエリをINNER JOINからLEFT JOINに置き換えただけですが、salesのテーブルに左からitemテーブルを外部結合する動作になります。
LEFT JOINを使ったクエリの実行結果は以下のようになります。
外部結合は、salesテーブルに存在してもitemテーブルに存在しないという場合でも、テーブルの結合結果に含みます。
そのため、salesテーブルに存在していてitemテーブルに存在しないitem_codeが10005のデータも結果として表示しています。
この挙動は気を付けるべきであり、NULLのデータを含めるかどうかでINNER JOINを使うかLEFT JOINを使うかをうまく使い分ける必要があります。
LEFT JOINによりNULLになってもすべての行を取得したいところをINNER JOINを使うと、該当する行が取得できず、不都合になってしまったり、NULLの行が必要ないのにLEFT JOINを使うと、不要な行を取得することになり、不都合なことになったりします。
シンプルなクエリであればそこまで問題にならないかもしれませんが、いくつものテーブルを結合する複雑なクエリになると、どのような動作になるのか、INNER JOINとLEFT JOINの違いが分からないとクエリの内容を理解するのが難しくなります。
まとめ
今回は以下の内容を説明しました。
- INNER JOINの内部結合は両方のコードが一致するものだけを取得するため、結合結果にNULLの行が出来ることがない
- LEFT JOINによる外部結合は、結合するテーブルに値がないものも取得するため、結合結果にNULLが含まれるものが出てくる。
- INNER JOINによる内部結合とLEFT JOINによる外部結合は用途によってしっかりと使い分ける必要があり、きちんと両方の動作の違いを理解する必要がある
INNER JOINとLEFT JOINをうまく使い分けないと、テーブル結合を行うクエリを正しく書くことが出来ません。
そのため、両方の違いはきちんと理解して、実務の場でも使い分けることが出来るようにきちんと理解する必要があります。
盲目的にLEFT JOINを使っているクエリをよく見かけますが、INNER JOINで問題なければINNER JOINを使った方が、理解しやすいクエリにすることが出来ます。
最後に、問題を一つ出題してこの記事を締めたいと思います。
この問題に解答できれば、今回説明した内容がきちんと理解できているということになります。
問題
LEFT JOINによる外部結合のところで出てきたクエリに、WHERE文を1つ書き足すとINNER JOINによる内部結合と同じ挙動にすることが出来ます。
一体どのようなWHERE文を書けばいいでしょうか?
今回の記事はここまでとなります。
また次の記事でお会いしましょう。