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

WHEREで行を絞り込む

考えてみよう

乗員が7人だけならひと目で選べますが、これが7000人だったら? ある条件に合う人だけを見つけたいとき、SQLはどう書けばいいでしょう?

これまでのSELECTは「全部の行」を取り出すものでした。今回は「条件に合う行だけ」を取り出す方法を学びます。少し考えてから読み進めてください。

WHERE句の位置と役割

SQLで行を絞り込むには、WHERE句を使います。書く位置はいつも同じで、FROM句のすぐあとです。

SELECT 列名
FROM テーブル名
WHERE 条件;

宇宙ステーション「アマテラス」の乗員名簿、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, role
FROM crew
WHERE role = 'パイロット';

結果:

namerole
ケンジパイロット
ミドリパイロット
リョウパイロット

FROM句で「どのテーブルから」を指定したあと、WHERE句が「その中のどの行を残すか」をふるいにかけている、とイメージすると分かりやすいです。WHEREがなければ全ての行が対象、WHEREがあれば条件に一致した行だけが残ります。

比較演算子(= != <> < > <= >=)

条件を作るときによく使う比較演算子は、次の7つです。

年齢が30より大きい乗員を探してみましょう。

SELECT name, age
FROM crew
WHERE age > 30;

結果:

nameage
ケンジ35
サクラ41
ハルト33
ソラ45
アカリ31
リョウ38

「地球出身ではない」乗員を探すなら、!=(または<>)を使います。

SELECT name, home
FROM crew
WHERE home != '地球';

結果:

namehome
ケンジ火星
ハルト
レイ火星
ソラ
アカリ火星

文字列条件のクォート

ここで気づいた方もいるかもしれません。role = 'パイロット'home != '地球'は文字列をシングルクォート(')で囲んでいますが、age > 3030は囲んでいません。

これはSQLのルールです。文字列はクォートで囲み、数値は囲まない。クォートを忘れると、SQLは「パイロット」を文字の並びではなく列名か何かと誤解し、エラーになってしまいます。

-- ○ 正しい:文字列はクォートで囲む
WHERE role = 'エンジニア'

-- × エラーになりやすい:文字列なのにクォートがない
WHERE role = エンジニア

文字列はクォートあり、数値はクォートなし——このルールを、まずは手で覚えてしまいましょう。

確認問題

salaryが350000以上の乗員を取り出すWHERE句は、次のうちどちらでしょう? WHERE salary => 350000WHERE salary >= 350000

答えを見る

正解はWHERE salary >= 350000です。「以上」を表す演算子は>=の順番で書きます。=>のように順番を逆にするとエラーになるので注意しましょう。

WHERE句が使えると、SQLは一気に実用的になります。次回は「複数の条件を同時に満たす行」を探す方法を学びます。

/sql/game/ の SQL DIVER で、実際にタイプして試してみましょう。WHERE句を自分の手で書く感覚を、ぜひ体に覚え込ませてください。

ゆみちゃん
ゆみ

WHEREはSQLの主役級の存在。「文字列はクォート、数値は裸」——これだけ覚えれば、もう条件文でつまずかないよ!