はじめに
よろしくおねがいします。にゃるしざと申します。
業務ではシステム開発に携わっており、SQLを学び始めて4年目になります。
日々SELECT文を書いたり、パフォーマンスを調整したりと、それなりにSQLは扱える気でいました。
しかし、最近設計書とソースを照らし合わせて調査していた際に、テーブル同士を「(,)カンマ」で繋ぐ見慣れない記載方法を見つけました。
今回は、そんな「暗黙的結合」についてまとめます。
想定読者
・SQLの「INNER JOIN」や「LEFT JOIN」など基本的な結合は知っている
・が、“明示的結合” “暗黙的結合” という単語はピンと来ない方
代表的な結合について
基本的なSQLの記載方法はご存じのものとして、ざっくりとした前提を書きます。
リレーショナルデータベースの強みは、複数のテーブルを組み合わせて必要なデータを取り出せるところですね。
INNER JOIN(内部結合)、LEFT JOIN(外部結合)、そのほかRIGHT JOIN(右部結合) CROSS JOIN(交差結合)などが有名です。
筆者も新卒一年目のOJTでは、ひたすら課題でこれらと向き合った記憶があります。
暗黙的結合とは?
さて、問題の「暗黙的結合」です。
ある日の業務では、内部設計書と実装を照らし合わせながら処理を確認していました。
設計書によると「CROSS JOIN」でテーブルを結合しているらしいのですが、ソース内に「CROSS JOIN」の文言は見当たりません。
代わりに、このようなクエリが記載されていました。
SELECT * FROM A, B
カンマだけ?と最初は思ったのですが、調べるとこの書き方で「CROSS JOIN」になるのだそう。(というか、後述しますが昔はこの書き方が主流だった)
FROM で列挙されたテーブルは一旦 CROSS JOIN(直積) され、そのあと WHERE で条件を付けることで「実質的な内部結合」として動作する仕組みなんだとか。
つまり、
FROM A, B WHERE A.key = B.key
は
FROM A INNER JOIN B ON A.key = B.key
と同じ結果を返します。
暗黙的結合の仕組み
整理すると、暗黙的結合は以下のような流れになります。
1. FROM A, B で 全組み合わせ(CROSS JOIN) が生成される
→ Aが100件、Bが200件なら、一旦は20,000件になります。
2. WHERE A.key = B.key で結合条件を絞り込む
→ 実際に欲しい「対応する行」だけ残る。
つまり、CROSS JOIN + 絞り込み という形でINNER JOINを再現しているんですね。
明示的結合と暗黙的結合の違い
動作上は同じ結果を返すのですが、やはり可読性や意図の伝わりやすさで大きな違いがあります。
明示的結合
⭕️結合条件が ON に明示されるので「どの列でつなぐのか」が一目瞭然。
⭕️JOINの種類(INNER / LEFT / RIGHT / FULL)が明示できる。
❌初心者にとっては複雑なクエリに見えるかも
暗黙的結合
⭕️シンプルに短いクエリで書ける
⭕️古いシステムに互換性がある
❌可読性が低い
❌WHERE句に条件が混ざるので、結合条件とフィルタ条件が混合してしまう。
❌WHERE句の付け忘れによる意図しないCROSS JOINを生みやすい。
いや、暗黙的結合のデメリット多ッ。
この書き方にする意味ある?とつい疑問に思ってしまったのですが...
それについてはSQLの歴史を辿る必要がありそうなので、次の記事でまとめようと思います。
まとめ
◾️よく使用される”INNER JOIN”や”LEFT JOIN”などの結合方法は「明示的結合」。
◾️FROM A, B WHERE A.key = B.key のような書き方は「暗黙的結合」と呼ばれる。CROSS JOIN を行い、WHERE句で条件を絞り込むことでINNER JOINと同様の結果を得られる。
◾️結果は同じでも、可読性や保守性の観点からJOIN句を使うのがベター。
参考にした記事