N46_myHearter
@N46_myHearter (N46 myHearter)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[SQL] テーブル結合 ~INNER JOINとWHERE~

質問

データベースで2つ以上のテーブル結合する際に、INNER JOINで結合するパターンとWhere句で結合するパターンがあると思いますが、みなさんはどっちの方法使いますか。

自分は努めている会社の意向でWhere句の方が見やすいので、Where句で結合しているのですが、INNER JOINだと何がメリットなのかいまいち分からなくて...
単純にどっちの方が多いのか気になったので、質問させていただきました。
下にある投稿フォームで回答お願いします(出来れば理由とともに)!!

2

これはめちゃくちゃ個人的な意見ですが...
僕はテーブル結合を行うときはINNER JOINを使っています。理由は簡単で、テーブル結合をするための構文がINNER JOINであり、そのように記述することで文脈的にもデータの動き方的にも理解しやすいと感じるからです。WHERE句を用いた結合の時とINNER JOINを使った時、僕は頭でこんな感じの処理が走ります。

INNER JOINのとき

  1. 1つめのテーブルを取得する
  2. テーブルの各行に、あるテーブルの条件にあるカラムを結合していく

WHERE句のとき

  1. はじめに2つのテーブルの直積が作られる
  2. 直積のテーブルから条件に合わない行を削除していく

↑の処理を脳内再生したときに、テーブル結合という意味でいうとやはりINNER JOINの方が直感的だなと感じます。

5Like

後からの読みやすさのためにINNER JOINを書きます。

結合のための条件も、絞り込むための条件も、必ずひとつとは限りません。後から増やすこともあるでしょう。

なので、

SELECT
    *
FROM
    T1, T2
WHERE
    T1.UserId = T2.UserId
    AND T1.TaskId = T2.TaskId -- ここまでが結合のための条件だが、ぱっと見区別付きにくい
    AND T1.Status = 'Active'
    AND T1.Cost < T2.Cost

よりも

SELECT
    *
FROM
    T1
INNER JOIN
    T2 ON
    T1.UserId = T2.UserId
    AND T1.TaskId = T2.TaskId
WHERE
    T1.Status = 'Active'
    AND T1.Cost < T2.Cost

のほうが、宣言的かつ明快でいいかな~という感じです。

1Like

Your answer might help someone💌