いかおくら自習室のブログ

普段の学習内容などのアウトプット用のブログです

SQLにおける文字列の不等号

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへを学んでいる最中、挙動が分からなくなった箇所があった。

自己結合の使い方、演習問題の箇所。 文字列はどういう基準で比較されるのか簡単にまとめておく。

準備データ

CREATE TABLE meibo (
,name text
);

INSERT INTO meibo VALUES('たなか');
INSERT INTO meibo VALUES('やまだ');
INSERT INTO meibo VALUES('さとう');

重複を含めた2列の組み合わせの求めかた

SELECT
*
FROM meibo m1
CROSS JOIN meibo m2
WHERE m1.name >= m2.name

-- 出力結果
name   |  name_1
-------+---------
たなか    たなか
たなか    さとう
やまだ    たなか
やまだ    やまだ
やまだ    さとう
さとう    さとう

CROSS JOINで自己結合しているが、 WHEREで条件指定しなかった場合、以下の出力となる

name name_1
たなか たなか
たなか やまだ
たなか さとう
やまだ たなか 不要(すでに「たなか」×「やまだ」で出ている)
やまだ さとう
やまだ やまだ
さとう たなか 不要(すでに「たなか」×「さとう」で出ている)
さとう やまだ 不要(すでに「やまだ」×「さとう」で出ている)
さとう さとう

上記の不要の箇所を取り除くために不等号で除去している。 文字列の比較は、辞書式順序に従う。

name where name_1
たなか >= たなか True
たなか >= やまだ False(や の方が大きい)
たなか >= さとう True
やまだ >= たなか True
やまだ >= さとう True
やまだ >= やまだ True
さとう >= たなか False(た の方が大きい)
さとう >= やまだ False(や の方が大きい)
さとう >= さとう True