1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【暗黙的結合とは?】SQL|カンマ区切りで結合する方法

Posted at

はじめに

よろしくおねがいします。にゃるしざと申します。

業務ではシステム開発に携わっており、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句を使うのがベター。

参考にした記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?