WHERE (SQL)

WHERE句は、SQLにおける予約語の1つである。データ操作言語 (DML) と共に使用し、DMLが操作する行を限定する役割を持つ。

WHERE句の指定は必須ではないが、データを操作する命令と一緒に使用することで対象を限定することができる。

具体的には、SELECT, INSERT, UPDATE, DELETE の各命令で操作対象の行を限定することができる。

文法 
WHERE はデータ操作言語 (DML) と共に使用される。一般的な構文は以下のようになる。

SQL-DML命令
FROM テーブル名 
WHERE 条件

WHERE の後に記述された条件が真のとき DML の操作（抽出・削除など）の対象となる。条件が偽または不明 (NULL) のとき、操作の対象とならない。

次のクエリーは、mytable テーブルの mynumber が100より大きいものを抽出する。

SELECT *
FROM   mytable
WHERE  mynumber > 100

次の DELETE文は、mytable テーブルの mynumber に値が入っていないか、100が入っているものを削除する。
DELETE
FROM   mytable
WHERE  mynumber IS NULL OR mycol = 100

条件文 
単純な条件文は、演算子の =, <>, >, >=, <, <=, IN, BETWEEN, LIKE, IS NULL or IS NOT NULL を使用する。

条件式は必要に応じてかっこで囲むことができる。また、複数の条件文を AND や OR で接続することができる。この優先順位を明示するためにもかっこは有用である。かっこがない場合、AND 演算子が OR 演算子に優先される。

以下の例は mytable テーブルにある「mynumber が100より大きい」かつ「『アイテム』が『ハンマー』」であるデータを削除する。

DELETE
FROM   mytable
WHERE  mynumber > 100 AND アイテム = 'ハンマー'

IN 
IN は、直後に記述したデータ群の中に一致する値があるかどうかを判断する。
SELECT ename WHERE ename IN ('値1', '値2', ...)
この文の場合、ename がかっこの中のいずれかと一致すれば真となる。例えば値が2つの場合は以下の文と同等になる。
SELECT ename WHERE ename='値1' OR ename='値2'
後者の書き方の場合複数の列を判定に含めることができるが IN では単一の項目しか対象にできない。一方、候補の件数多い場合は IN を使用した方が簡潔に書くことができる。

BETWEEN 
BETWEEN は、指定された範囲内に値があるかを判断する。
SELECT ename WHERE ename BETWEEN '値1' AND '値2'

以下の例は収入が「500000以上1000000以下」のデータを抽出する。
SELECT 収入 from emp WHERE 収入 BETWEEN 500000 AND 1000000

LIKE 
LIKE は条件に合う文字列を検索する。

 末尾のワイルドカード
 下の例は 'S' で始まるすべての文字列が一致する。SELECT ename FROM emp WHERE ename LIKE 'S%';
 冒頭のワイルドカード
 下の例は 'S' で終わるすべての文字列が一致する。SELECT ename FROM emp WHERE ename LIKE '%S';
 複数のワイルドカード
 下の例は 'S' がどこかに含まれるすべての文字列が一致する。SELECT ename FROM emp WHERE ename LIKE '%S%';
 1文字分のワイルドカード
 下の例は 'A' と 'E' の間に1文字だけ文字が存在する文字列に一致する。SELECT ename FROM emp WHERE ename LIKE '%A_E%';
 文字クラス
 下の例は最初の文字がアルファベットか数字か '_' である文字列に一致する。SELECT ename FROM emp WHERE ename LIKE '[a-zA-Z0-9_]%';

SQL を使用する場合、LIKE演算子は索引によるパフォーマンスを無視することを認識する必要がある。可能ならば '=' や '<>' などの演算子を使用した方がパフォーマンスがいい。また、データベースソフトによって文字の扱い（大文字と小文字など）が違うことにも注意しないといけない。

参照

外部リンク 
 PSOUG Home Puget Sound Oracle Users Group WHERE を使用した SELECT 文の例が提示されている。

SQL