複雑なSQL文について

複雑なSQL文について

テーブル結合はSQLの基本ですが難しいと思われている方もいるでしょう。

結合には内部結合と外部結合、交差結合があります。
内部結合は結合条件が一致するレコードのみを返します。
外部結合は結合条件が一致しなくても主テーブルのレコードは全て返します。
交差結合は結合条件の全ての組み合わせを返します。

3つの結合の中で最も使用頻度が高いのが内部結合です。次に使うのが外部結合で、交差結合を使うことはほとんどありません。

最も使用頻度の高い内部結合ですが、SQL文ではINNER JOIN句で結合するとされています。
一番簡単な内部結合のSQL文は以下のようになります。

SELECT * FROM A INNER JOIN B ON A.id = B.id;

結合するカラム名が同じであれば、USING句を使用して記述することもできます。

SELECT * FROM A INNER JOIN B USING (id);

さらに、idだけが2つのテーブルに共通したカラム名である場合、自然結合も利用できます。

SELECT * FROM A NATURAL JOIN B;

多くのJOINの説明はこのようになっているかと思いますが、個人的にはどれもほとんど使っていません。等値結合や非等値結合で記述しています。

SELECT * FROM A, B WHERE A.id = B.id;

等値結合で記述した方がINNER JOIN句で記述するよりも短いですし、3つ以上のテーブルを結合する場合や複数カラムで結合する場合、相関サブクエリで作成したテーブルを結合する場合など様々な状況であまり細かい文法を気にせずにWHERE句に条件を追加していけば問題なくSQL文として成立するからです。複雑な結合であればあるほど、等値結合で記述した方がすっきりします。等値結合は内部結合と同じ意味です。

特に、結合したテーブルでUPDATEやDELETEをする場合は、等値結合で記述した方が簡単になります。

例えば、内部結合では、

UPDATE A
INNER JOIN B ON A.id = B.id
SET A.value= A.value+ 1;

となりますが、等値結合では

UPDATE A, B
SET A.value = A.value + 1
WHERE A.id = B.id;

となります。
これだけだと、大して変わらないじゃないかと思われるかもしれませんが、結合するテーブルが3つ以上だったり、テーブルAもテーブルBも一緒に更新する場合は圧倒的に等値結合の方が簡単に表記できます。

UPDATE A, B, C
SET A.value = A.value + 1
WHERE A.id = B.id AND A.name = C.name;

UPDATE A, B
SET A.value = A.value + 1, B.updated = true
WHERE A.id = B.id;

といった形になります。

好みの問題にもなりますが、内部結合については等値結合でWHERE句に必要な条件を書き連ねていくことをおすすめします。