問合せで条件に合う行だけを絞り込むSQLの句。
WHERE 句とは、問合せで条件に合う行だけを絞り込む SQL の句のことです。表のすべての行を1つずつ条件と照らし合わせ、条件が成り立つ(真になる)行だけを残します。
身近な例で考えると、たくさんの本の中から条件に合う本だけを棚から抜き出す作業に似ています。「2020年以降に出版された本だけ」のように条件を決め、それに当てはまる本だけを取り出すイメージです。当てはまらない本は棚に残します。
上のツールで▶ボタンを押すと、各行を「年齢 >= 30」という条件で1つずつ判定し、真(○)の行だけが残り、偽(×)の行が外される流れを確認できます。
WHERE 句の条件は、比較演算子で値を比べて作ります。代表的なものは次のとおりです。
・=:等しい(例:部署 = '営業')
・<>:等しくない
・> ・ <:より大きい・より小さい
・>= ・ <=:以上・以下(例:年齢 >= 30)
複数の条件を組み合わせたいときは、論理演算子でつなぎます。
・AND(論理積):両方の条件を満たす行だけ(例:年齢 >= 30 AND 部署 = '開発')
・OR(論理和):どちらか一方でも満たせば残す
・NOT(否定):条件を満たさない行を残す
「30歳以上の営業部」のように複数条件で絞り込むときに、AND・OR を使い分けます。AND は条件を厳しく(数が減る方向)、OR は条件をゆるく(数が増える方向)する、と覚えると間違えにくいです。
比較演算子だけでは表しにくい条件のために、WHERE 句には便利な記法が用意されています。代表的なものは次のとおりです。
・LIKE:あいまいな文字列の一致。ワイルドカード %(0文字以上の任意の文字列)と _(任意の1文字)を使う(例:名前 LIKE '佐%' =佐で始まる)
・IN:複数の値のいずれかに一致(例:部署 IN ('営業', '開発'))
・BETWEEN:範囲内に収まる(例:年齢 BETWEEN 30 AND 40)
・IS NULL:値が NULL(=値なし)かどうかを判定する
たとえば 部署 IN ('営業', '開発') は 部署='営業' OR 部署='開発' と同じ意味で、OR を並べるより短く書けます。これらを比較演算子・論理演算子と組み合わせることで、目的のデータをぴったり絞り込めます。
WHERE 句が「1行ずつ判定する」のは、データベースが表をリスト(行の集まり)として持っているからです。WHERE の条件は「この行の値が条件を満たすか?」という質問で、その答えは真(true)か偽(false)のどちらかしかありません。
処理の流れはシンプルです。
・表の1行目から順番に、条件式を当てはめて計算する
・答えが真(true)なら、その行を結果に残す
・答えが偽(false)なら、その行を捨てる
・全行を見終わったら処理完了
上のツールの「判定」列に表示される「○ 真」「× 偽」がまさにこれです。条件 年齢 >= 30 を各行に当てはめ、真なら緑(残す)・偽なら赤(取り除く)と色分けして確認できます。NULL(値なし)の場合は真でも偽でもない「不明」となり、その行は除外されます。
WHERE と HAVING は、どちらも「絞り込む」句ですが、絞り込むタイミングがまったく異なります。
・WHERE:GROUP BY で集計する前に各行を絞り込む。行1件ずつに条件をかける
・HAVING:GROUP BY で集計した後にグループ(集計値)を絞り込む。グループ1つずつに条件をかける
具体例で確認します。社員表から「30歳以上の人だけ」を対象にして「部署ごとの人数が2人以上のグループ」を取り出したい場合、次のように書きます。
SELECT 部署, COUNT(*)
FROM 社員
WHERE 年齢 >= 30 ← 行を先に絞る
GROUP BY 部署
HAVING COUNT(*) >= 2 ← 集計後にグループを絞る
「集計前に行を減らしたい → WHERE」「集計後のグループに条件をつけたい → HAVING」と使い分けます。HAVING を WHERE の代わりに使うことはできません。なぜなら WHERE は集計前に動くので、集計関数(COUNT など)の結果がまだ出ていないからです。