専門的な情報を、立場の違う人に「分かるように説明する」のは難しいものです。このブログは「技術屋が説明書や提案書を分かりやすく書く」ために役に立つ情報をお届けします。

SQLの結合条件と抽出条件の解説をリライトした例

»

こんにちは。ドキュメント・コンサルタントの開米瑞浩です。

今回は、専門的な知識経験を持った専門家の技術解説をリライトする事例をお見せしましょう。題材がSQLによるRDBアクセスの話なので、SQLに関する基本知識を持った人向きの内容です。

背景は、RDBのプロフェッショナルである生島勘富さんから、セミナーや雑誌連載企画に関するご相談を先日来いただいていることで、生島さんの承諾を得てここでその中の1つを紹介します。

まず、元ネタはこちら

FROM句とWHERE句 - SQLer 生島勘富 の日記
http://d.hatena.ne.jp/Sikushima/20100612/1276311628

SQL文の中で使われる FROM 句とWHERE句について、現場の技術者の間では正しく理解されていないことが多い、ということで生島さんが書かれたものです。

この内容は技術的には正しいのですが、分かりやすいか? というと少々難がありますので、セミナーで話をしようとするとなかなか話が通じずに困ることでしょう。そこで、私がリライトすることにしました。私のほうはDBに関する知識は乏しいのですが、人に通じるように構成するほうは本職ですので。

(ただし、今回は記事全体の後半、「結合条件と抽出条件」以降の部分をリライトしています。前半部分は別に書いていますが、その話はまた別の機会に)

以下、書き直したものを掲載します。


SQLに関してよくある「結合条件と抽出条件の間違い」の例をご紹介します。まずは次の例題を考えてみてください。

2015-1102-1.PNG

求める結果は、次の通りです。

2015-1102-2.PNG

この問題についてのよくある間違いにこのようなパターンがあります。

2015-1102-3.PNG

正しくは次の通り。

2015-1102-4.PNG

B.D <> 1 の条件は、WHERE句ではなく、ON句に書く必要がありました。

それにしても、なぜこのような動きをするのでしょうか?

それを理解するためには、SELECT 文において FROM, JOIN, ON, WHERE の各句がどのように処理されるかを知る必要があります。
今回のようなケースでのSQL処理の流れは次のようになります。

2015-1102-5.PNG

【結合元の指定】
FROM句で、データのソース(結合元)となるテーブルを指定します。今回のケースではAとBです。

【結合前抽出】
各結合元テーブルのうち、一部のデータを抽出して結合させる場合は、その抽出条件を ON句に書きます。これで、Aの一部とBの一部を作ります。

【結合】
そうして抽出されたAの一部とBの一部を結合します。
  A LEFT JOIN B
結合する際、通常は双方のカラムの一部を一致するような条件を指定します。
  ON A.ID = B.A_ID
この条件を結合条件と言います。

【結合後抽出】
結合した結果から、さらに一部のレコードを抽出します。このための条件をWHERE句に書きます。

【カラム指定】
最後に必要なカラムを指定します。これをSELECT 句に書きます。

以上、このような流れで、JOINをともなうSELECT操作は実行されるのですが、

  表からレコードを抽出する操作が二ヶ所ある

ことに注意してください。

結合前の段階で結合元のテーブルから一部のレコードを抽出したい場合、そのための条件はON句に書きます。

結合後に一部のレコードを抽出したい場合、そのための条件はWHERE句に書きます。

なお、一般のSQL解説では、本稿でいう「結合前抽出」と「結合」の2ヶ所でON句に書く条件式を合わせて「結合条件」と総称している場合が多いようですが、上図でおわかりのとおり、「結合前抽出」というのは「結合前」の操作です。

どちらもON 句に書くのでわかりにくいですが、「結合」のための式と、「抽出」のための式は別物です。したがって、別な名前で理解しておきましょう。

まとめ

  • 「抽出」操作は結合前と結合後の2段階で行われる
  • 「結合前抽出」条件はON句に、「結合後抽出」条件はWHERE句に記載
  • ON句には「結合前抽出」条件と「結合」条件を合わせて書く


以上、ここまでがリライトされた内容です。
では、次回はリライトそのものの作業の注目ポイントについて説明します。

Comment(1)

コメント

自分では論理的に考えているつもりだったんですが、直観的にSQLを書いていたんですね。
だから、長嶋さんのように、「来た球を打つ」みたいな指導になっているのかもw

コメントを投稿する