@kyanny's blog

My thoughts, my life. Views/opinions are my own.

SQL 自己結合 非順序対を求めるときの考え方

codezine.jp

SQL は長年苦手意識があって、特に自己結合は頭でイメージを考えてるうちにこんがらがってわからなくなるので避けていたけど、表計算ソフトで色分けしたらわかりやすかった。

上の記事で例に使ってるのはこういう感じのテーブルだけど、 > を使うと順序対を除外できる、というのがピンとこなかった。

name
りんご
みかん
バナナ

> は比較演算子だからデータが数字のほうがわかりやすいので、こういうテーブルを考えた。

number
1
2
3

自己結合 SQL の WHERE 句をかえていくと、それぞれこういう感じになる。緑が選択される行で、赤が除外される行。

f:id:a666666:20150709023438p:plain

これは数字の大小を比較して行を選んでいるだけなので、これならわかる。これがわかれば、数字を文字列に置き換えても、行の選択と除外は同じように行われていることがわかる。 > は文字列をソート順に従って比較している。

f:id:a666666:20150709023639p:plain

文字列にも、数字ほど自明で直感的ではないが順序があり、異なる文字列は異なる順序を持つので、 2 > 1 が真なので {2, 1} の行が選択されるのと同じ理屈で、 りんご > バナナ も真になり {りんご, バナナ} の行が選択される、ということ。