「名前に“ミ”がつく人」や「年齢が30〜40歳の人」を探したいとき、=や>だけで書けるでしょうか?
前回までの条件は、値がきっちり一致するか、大小がはっきり比べられるものばかりでした。でも実際には「だいたい」「この範囲」「このどれか」という探し方をしたい場面も多いですよね。少し考えてから読み進めてください。
あいまい検索LIKE(% と _)
文字列の一部だけが分かっているときは、LIKE演算子とワイルドカードを使います。
%― 0文字以上の任意の文字列_― 任意の1文字
crewテーブルで確認しましょう。
crew テーブル:
| id | name | role | age | home | salary |
|---|---|---|---|---|---|
| 1 | ユミ | エンジニア | 24 | 地球 | 320000 |
| 2 | ケンジ | パイロット | 35 | 火星 | 400000 |
| 3 | サクラ | 医師 | 41 | 地球 | 520000 |
| 4 | ハルト | 医師 | 33 | 月 | 450000 |
| 5 | レイ | 研究員 | 29 | 火星 | 380000 |
| 6 | ミドリ | パイロット | 27 | 地球 | 360000 |
| 7 | ソラ | エンジニア | 45 | 月 | 470000 |
| 8 | トウマ | 研究員 | 24 | NULL | 270000 |
| 9 | アカリ | エンジニア | 31 | 火星 | 350000 |
| 10 | リョウ | パイロット | 38 | NULL | 440000 |
「サ」で始まる名前を探すなら、%を後ろにつけます。
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;
結果:
| name | age |
|---|---|
| ケンジ | 35 |
| ハルト | 33 |
| アカリ | 31 |
| リョウ | 38 |
これはage >= 30 AND age <= 40と書いても同じ結果になります。BETWEENは、その組み合わせを短く書けるようにした表現です。
リストで指定するIN
「パイロットか医師のどちらか」のように、候補のリストから一致するものを探したいときはINが便利です。
SELECT name, role
FROM crew
WHERE role IN ('パイロット', '医師');
結果:
| name | role |
|---|---|
| ケンジ | パイロット |
| サクラ | 医師 |
| ハルト | 医師 |
| ミドリ | パイロット |
| リョウ | パイロット |
これはrole = 'パイロット' OR role = '医師'と同じ意味ですが、候補が増えるほどINのほうがすっきり書けます。
IS NULL / IS NOT NULL
アマテラスの乗員名簿をよく見ると、まだ配属先(home)が決まっていない乗員が2人いることに気づきます。
home が未定の乗員:
| id | name | role | age | home | salary |
|---|---|---|---|---|---|
| 8 | トウマ | 研究員 | 24 | NULL | 270000 |
| 10 | リョウ | パイロット | 38 | NULL | 440000 |
homeの値が「決まっていない」ことを表すのがNULLです。NULLは「空文字」や「0」とは違い、「値が存在しない」ことを意味する特別な状態です。
ここで注意が必要なのが、NULLは=で比較できないことです。WHERE home = NULLと書いても、常に結果は0件になってしまいます。NULLかどうかを調べるには、専用のIS NULL / IS NOT NULLを使います。
-- 配属先が未定の乗員を探す
SELECT name, home
FROM crew
WHERE home IS NULL;
結果:
| name | home |
|---|---|
| トウマ | 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 = NULL と WHERE 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——盛りだくさんだけど、どれも「探しやすくする道具」だよ。少しずつ使って慣れていこう!