STAGE 03 — 3-3 / 絞り込みと並べ替え

LIKE・BETWEEN・IN・NULL

考えてみよう

「名前に“ミ”がつく人」や「年齢が30〜40歳の人」を探したいとき、=>だけで書けるでしょうか?

前回までの条件は、値がきっちり一致するか、大小がはっきり比べられるものばかりでした。でも実際には「だいたい」「この範囲」「このどれか」という探し方をしたい場面も多いですよね。少し考えてから読み進めてください。

あいまい検索LIKE(% と _)

文字列の一部だけが分かっているときは、LIKE演算子とワイルドカードを使います。

crewテーブルで確認しましょう。

crew テーブル:

idnameroleagehomesalary
1ユミエンジニア24地球320000
2ケンジパイロット35火星400000
3サクラ医師41地球520000
4ハルト医師33450000
5レイ研究員29火星380000
6ミドリパイロット27地球360000
7ソラエンジニア45470000
8トウマ研究員24NULL270000
9アカリエンジニア31火星350000
10リョウパイロット38NULL440000

「サ」で始まる名前を探すなら、%を後ろにつけます。

SELECT name
FROM crew
WHERE name LIKE 'サ%';

結果:

name
サクラ

「名前のどこかに“ミ”を含む」なら、前後を%で挟みます。

SELECT name
FROM crew
WHERE name LIKE '%ミ%';

結果:

name
ユミ
ミドリ

_は「文字数を1文字ぶん指定したいとき」に便利です。たとえば「2文字目が“カ”」の名前を探すなら、こう書けます。

SELECT name
FROM crew
WHERE name LIKE '_カ%';

結果:

name
アカリ

_が1文字目を1つ分だけ読み飛ばし、2文字目に「カ」があるかを見て、残りは%で何文字でも許す、という組み立てです。

範囲を指定するBETWEEN

「30歳から40歳まで」のように範囲で絞り込みたいときは、BETWEEN A AND Bを使います。AとB自体も含まれる点に注意しましょう。

SELECT name, age
FROM crew
WHERE age BETWEEN 30 AND 40;

結果:

nameage
ケンジ35
ハルト33
アカリ31
リョウ38

これはage >= 30 AND age <= 40と書いても同じ結果になります。BETWEENは、その組み合わせを短く書けるようにした表現です。

リストで指定するIN

「パイロットか医師のどちらか」のように、候補のリストから一致するものを探したいときはINが便利です。

SELECT name, role
FROM crew
WHERE role IN ('パイロット', '医師');

結果:

namerole
ケンジパイロット
サクラ医師
ハルト医師
ミドリパイロット
リョウパイロット

これはrole = 'パイロット' OR role = '医師'と同じ意味ですが、候補が増えるほどINのほうがすっきり書けます。

IS NULL / IS NOT NULL

アマテラスの乗員名簿をよく見ると、まだ配属先(home)が決まっていない乗員が2人いることに気づきます。

home が未定の乗員:

idnameroleagehomesalary
8トウマ研究員24NULL270000
10リョウパイロット38NULL440000

homeの値が「決まっていない」ことを表すのがNULLです。NULLは「空文字」や「0」とは違い、「値が存在しない」ことを意味する特別な状態です。

ここで注意が必要なのが、NULLは=で比較できないことです。WHERE home = NULLと書いても、常に結果は0件になってしまいます。NULLかどうかを調べるには、専用のIS NULL / IS NOT NULLを使います。

-- 配属先が未定の乗員を探す
SELECT name, home
FROM crew
WHERE home IS NULL;

結果:

namehome
トウマNULL
リョウNULL

配属先が決まっている乗員を探すなら、IS NOT NULLです。

SELECT name, home
FROM crew
WHERE home IS NOT NULL;

NULLの判定は=ではなくIS NULL/IS NOT NULL——これは初心者が特につまずきやすいポイントなので、ここでしっかり押さえておきましょう。

確認問題

配属先(home)が未定の乗員を探すWHERE句として正しいのは、WHERE home = NULLWHERE home IS NULL のどちらでしょう?

答えを見る

正解はWHERE home IS NULLです。NULLは「値がない」という特別な状態なので、=では比較できません。WHERE home = NULLは常に0件になってしまうので注意しましょう。

LIKE・BETWEEN・IN・IS NULLを使いこなせれば、絞り込みの表現力は一気に広がります。次回はいよいよ「並べ替え」を学びます。

/sql/game/ の SQL DIVER で、ワイルドカードやNULL判定を実際にタイプして確かめてみましょう。

ゆみちゃん
ゆみ

LIKEの%_、BETWEENの範囲、INのリスト、そしてNULLだけは=じゃなくてIS NULL——盛りだくさんだけど、どれも「探しやすくする道具」だよ。少しずつ使って慣れていこう!