WHERE句


条件付き検索

大きな組織のデータベースであれば、情報量は膨大でしょう
数百、数千に及ぶ行を持つ表から特定の行を探すのは大変です

そこで、目的の情報を捜すための条件検索が求められます
SQL では、問い合わせに複雑な条件を指定することができます
条件には、比較演算子を使った真偽値で行います

実験を行うため、次のような表を用意してください

表 Staff
CodeNameBloodHeightWeight
0001アルクェイド ブリュンスタッドNULL16752
0002シエルO16552
0003遠野 秋葉A16045
0004翡翠B15643
0005琥珀B15643

問い合わせに何らかの条件を指定する場合
SELECT 文に WHERE 句を指定し、これに真偽値を渡します

SELECT 選択項目リスト FROM 表名 [WHERE 検索条件]

SELECT 文は以前、表を参照するために学習しました
そのときの経験から WHERE 句は省略可能であることがわかります

WHERE キーワードの直後には、検索条件となる真偽値を与えます
ここに、比較演算子を用いた条件を与えることで、目的の行だけを抽出できるのです

WHERE に渡すデータ型は最終的に boolean 型でなければなりません
逆に言うと TRUE や FALSE などのリテラルを渡すこともできます
WHERE は行を検索するたびにこの条件を評価し、FALSE であれば行を無視します
リテラルを渡すと、すべてを参照するか、すべてを無視するかのどちらかになります

SELECT * FROM Staff WHERE FALSE

この場合は、常に結果が FALSE となるため、すべての行を無視します
比較を行う式には、リテラルのほかに検索中の表の列名を指定できます
列名を指定した場合、現在検索中の行の列の値があてはまることになります

SELECT * FROM Staff WHERE Height=160

この文を実行すると、Height 列が 160 以上の行だけ抽出されるでしょう
サーバーは表の最上部から順に検索します
遠野秋葉の Height は 160 なので、遠野秋葉の行だけが得られます
SELECT * FROM Staff WHERE Weight>50
+------+-------------------------------+-------+--------+--------+
| Code | Name                          | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
|    1 | アルクェイド ブリュンスタッド | NULL  |    167 |     52 |
|    2 | シエル                        | O     |    165 |     52 |
+------+-------------------------------+-------+--------+--------+
この SQL 文は、列 Weight が 50 以上の行を条件検索します
WHERE 句の働きによって、それぞれの行が条件に照らし合わされ
条件式に指定した比較結果が TRUE の行だけが選択されるのです
Weight が 50 以上なのは、アルクェイドとシエルの二人です


論理演算

少し複雑な演算子で、論理演算子があります
論理演算子は、比較演算よりもさらに高度な条件を指定することができます

論理演算子
演算子解説
AND両方のオペランドが TRUE ならば TRUEA AND B
BETWEEN左オペランドが指定範囲内ならば TRUEA BETWEEN B AND C
NOT真偽値を反転させるNOT A
OR両方のオペランドが FALSE ならば FALSEA OR B

複数の条件を組み合わせて指定する場合、論理演算子を用います
例えば「Height が 60 以上で、Weight が 50 以上」といった条件です

AND 演算子を用いれば「A かつ B」という条件に
OR 演算子を用いれば「A または B」という条件になります
これらの演算子のオペランドに比較演算を指定すれば、複雑な条件を指定できます
SELECT * FROM Staff WHERE Height>=160 AND Weight>=50
+------+-------------------------------+-------+--------+--------+
| Code | Name                          | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
|    1 | アルクェイド ブリュンスタッド | NULL  |    167 |     52 |
|    2 | シエル                        | O     |    165 |     52 |
+------+-------------------------------+-------+--------+--------+
この SQL 文は、Height が 160 以上、Weight が 50 以上の行を検索します
秋葉は身長が 160 ですが、体重が 50 以下なので、対象外となっています
この条件に適合するのは、アルクェイドとシエルだけです
SELECT * FROM Staff WHERE Height>165 OR Blood='A'
+------+-------------------------------+-------+--------+--------+
| Code | Name                          | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
|    1 | アルクェイド ブリュンスタッド | NULL  |    167 |     52 |
|    3 | 遠野 秋葉                     | A     |    160 |     45 |
+------+-------------------------------+-------+--------+--------+
今度は、Height が 165 より大きいか、Blood が A の行だけを抽出しています
この条件に合うのは、アルクェイドと秋葉だけです

AND や OR を用いれば、数千人いる社員名簿から
年齢、資格、性別など、さまざまな条件を合わせて検索することができます
大量の情報の中から、目的の情報にスマートにアクセスできるのです

BETWEEN 演算子は、SQL で唯一の3項演算子です
この演算子は、ある値が特定範囲の間かどうかを調べます
例えば、ある列が 30 以上 50 未満の行を調べたい場合などに使うことができます

exp1 BETWEEN exp2 AND exp3

BETWEEN は exp1 の数値が exp2 以上 exp3 以下の時に TRUE となります
各オペランドは数値型でなければなりません
これは、次の式と同じであると考えられます

exp1 >= exp2 AND exp1 <= exp3

論理演算を用いるよりも、exp1 を重複させないので便利です
SELECT * FROM Staff WHERE Height BETWEEN 160 AND 165
+------+-----------+-------+--------+--------+
| Code | Name      | Blood | Height | Weight |
+------+-----------+-------+--------+--------+
|    2 | シエル    | O     |    165 |     52 |
|    3 | 遠野 秋葉 | A     |    160 |     45 |
+------+-----------+-------+--------+--------+
この SQL 文は BETWEEN 演算子を使って
Height が 160 以上 165 以下の行を検索しています
この条件に適合するのは、シエルと秋葉です

最後の NOT 演算子ですが、これは与えられたオペランドの真偽値を反転させます
この演算子は単項演算子に分類され、演算子に続いて boolean 型の値を指定します
SELECT * FROM Staff WHERE NOT Name='シエル'
+------+-------------------------------+-------+--------+--------+
| Code | Name                          | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
|    1 | アルクェイド ブリュンスタッド | NULL  |    167 |     52 |
|    3 | 遠野 秋葉                     | A     |    160 |     45 |
|    4 | 翡翠                          | B     |    156 |     43 |
|    5 | 琥珀                          | B     |    156 |     43 |
+------+-------------------------------+-------+--------+--------+
この SQL 文は、Name がシエル以外の行を取得しています
「〜以外の」という検索を行いたい場合、このように NOT を使うと効率的です
Name='シエル' という比較は、Name 列がシエルのときに TRUE となりますが
これを NOT 演算して反転させるため、このような結果になるのです


NULLの検索

特定の列が NULL の行を検索する場合、比較で調べることができます
比較演算子は、NULL のオペランドが見つかった場合 NULL を返すと定められています
そのため NULL との比較で真偽値は得られません

値が NULL かどうかを調べるには、IS NULL 演算子を使います
IS NULL は指定したオペランドが NULL であれば TRUE を返します

exp IS [NOT] NULL

exp には NULL かどうかを調べる値を指定します
IS と NULL の間には NOT を指定することができます
NOT は省略可能です
NOT が指定されている場合、NULL でなければ TRUE を返します

NOT を指定した IS NULL 演算子は、次の文と同じです

NOT (exp IS NULL)

これは、IS NULL で調べた結果を否定するため NULL でなければ TRUE を返します
しかし、パフォーマンスや記述において、IS NOT NULL の方が優れています
SELECT * FROM Staff WHERE Blood IS NULL
+------+-------------------------------+-------+--------+--------+
| Code | Name                          | Blood | Height | Weight |
+------+-------------------------------+-------+--------+--------+
|    1 | アルクェイド ブリュンスタッド | NULL  |    167 |     52 |
+------+-------------------------------+-------+--------+--------+
この SQL 文は、IS NULL 演算子を用いて Blood が NULL の行を検索します
Blood が未定義なのはアルクェイドだけなので、アルクェイドだけが抽出されました
SELECT * FROM Staff WHERE Blood IS NOT NULL
+------+-----------+-------+--------+--------+
| Code | Name      | Blood | Height | Weight |
+------+-----------+-------+--------+--------+
|    2 | シエル    | O     |    165 |     52 |
|    3 | 遠野 秋葉 | A     |    160 |     45 |
|    4 | 翡翠      | B     |    156 |     43 |
|    5 | 琥珀      | B     |    156 |     43 |
+------+-----------+-------+--------+--------+
逆に IS NOT NULL を指定すれば、アクルェイド以外が取得できます
「Blood が NULL の行以外」という検索になります



前のページへ戻る次のページへ