基本情報技術者試験 (FE) 科目 A — データベース

WHERE 句 — 条件で行を絞り込む

定義

WHERE 句は表の各行を 1 行ずつ評価し、条件が真になる行だけを残す。行を選ぶこの操作を関係代数では選択と呼ぶ。NULL との比較は真でも偽でもなく不定 (UNKNOWN) になり、行は残らない。

WHERE は 1 行ずつ判定する

WHERE は表の各行を 1 行ずつ見て、条件が真になる行だけを残します。 行を絞り込むこの操作を関係代数では選択と呼び、 列を絞る射影(SELECT)と対になります。

条件の組み合わせ

WHERE 単価 >= 100 AND 分類 = 'A'    -- 両方を満たす
WHERE 分類 = 'A' OR 分類 = 'C'      -- どちらかを満たす
WHERE NOT 分類 = 'A'                -- 満たさない

AND は OR より先に評価されます。A OR B AND CA OR (B AND C) の意味です。 意図した順序にするには括弧を書きます。試験ではこの優先順位を突いた選択肢が出ます。

試す: AND を OR に変える / 括弧を付けて優先順位を変える

リセットで表の中身も元に戻ります
エディタを読み込み中…

よく使う述語

書き方意味
単価 BETWEEN 100 AND 300100 以上 300 以下(両端を含む
分類 IN ('A', 'C')列挙したどれかに一致
商品名 LIKE '%ゴム'「ゴム」で終わる(% は 0 文字以上)
商品番号 LIKE 'P0_'P0 の後にちょうど 1 文字(_ は 1 文字)
在庫数 IS NULL値が入っていない

LIKE に渡す '%ゴム' のような文字列を、 シラバスではパターン文字列と呼びます。NOT BETWEEN / NOT IN / NOT LIKE のように、それぞれ否定形も書けます。

試す: BETWEEN の値を 120 AND 150 にして、境界が含まれるか確かめる

リセットで表の中身も元に戻ります
エディタを読み込み中…

試す: LIKE の % と _ を入れ替える ('P0_' / 'P%' / '%ート')

リセットで表の中身も元に戻ります
エディタを読み込み中…

NULL は「比較できない」

SQL で最もつまずくのがここです。NULL は値ではなく「不明」なので、 比較した結果は真でも偽でもなく不定 (UNKNOWN) になります。

WHERE 在庫数 = NULL     -- 1 行も返らない
WHERE 在庫数 <> NULL    -- これも 1 行も返らない
WHERE 在庫数 IS NULL    -- これが正解

WHERE が行を残すのは条件が真のときだけで、 不定の行は残りません。だから = NULL<> NULL も 両方とも 0 行になります。「NULL でない行を取りたい」ならIS NOT NULL と書きます。

試す: IS NULL を = NULL や <> NULL に書き換えると 0 行になる

リセットで表の中身も元に戻ります
エディタを読み込み中…

何行に絞られたかを段階で見る

一つ進めるを押すと、FROM で 5 行読み込んだあと WHERE で何行に減ったかが数字で出ます。条件を書き換えて、 絞り込みの効き方を見比べてください。

試す: 一つ進める で FROM → WHERE の行数の変化を見る

リセットで表の中身も元に戻ります
エディタを読み込み中…

試験で問われるポイント

  • BETWEEN が両端を含むこと
  • AND が OR より優先されること
  • NULL は = では判定できないこと。ほぼ毎回どこかで問われます
  • _ が「ちょうど 1 文字」であること(0 文字にはマッチしない)

よくある疑問

Q.BETWEEN は境界の値を含みますか?
A.含みます。単価 BETWEEN 100 AND 300 は「100 以上 300 以下」で、100 と 300 の両方が対象です。境界を含むかどうかは頻出の引っかけなので、閉区間だと覚えてください。
Q.LIKE の % と _ の違いは何ですか?
A.% は 0 文字以上の任意の文字列、_ はちょうど 1 文字にマッチします。'A%' は A で始まる任意の長さ、'A_' は A の後にちょうど 1 文字あるものだけです。
Q.= NULL と書いても NULL の行が取れないのはなぜですか?
A.NULL は「値が不明」を意味するため、NULL との比較結果は真でも偽でもなく不定 (UNKNOWN) になります。WHERE が行を残すのは条件が真のときだけなので、不定の行は残りません。NULL を判定するには IS NULL を使います。

WHERE で絞り込む」の練習問題 2

読んだ内容がそのまま出題されます。解答すると解説と、 その SQL を実行シミュレーターで開くリンクが出ます。

自由に試す / 他のレッスンを読む

データベース分野をもっと学ぶ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

プログラムの読み方でつまずいたら。

たいてっくが、アルゴリズムの追い方から SQL・データベース設計まで、1対1で学習をサポートします。「コードを目で追っても何をしているか分からない」段階からで大丈夫です。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講