行を条件で絞り込む - WHERE
行を絞り込む句。比較・論理演算子、IN・BETWEEN・LIKE、NULL 扱いの注意点を押さえる
概念図
構文
sql
SELECT ... FROM テーブル WHERE 条件サンプル
比較演算子で行を絞り込む最小例(age が 20 以上の行だけを残す)
sql
SELECT *
FROM users
WHERE age >= 20;WHERE の役割
WHERE は FROM が取り出した行を 条件式が TRUE の行だけに絞り込みます。条件が FALSE だけでなく UNKNOWN(NULL 絡み)の行も除外される点がポイントです。
比較・論理演算子
WHERE で使える演算子を意味・例とあわせて一覧にします。比較演算子の結果は TRUE / FALSE / UNKNOWN の 3 値で、UNKNOWN の行も WHERE は通しません。
| 演算子 | 意味 | 例 |
|---|---|---|
= | 等しい | status = 'paid' |
<> / != | 等しくない(<> が標準、!= は多くの RDBMS で可) | status <> 'canceled' |
< / <= | より小さい / 以下 | age < 20 / price <= 1000 |
> / >= | より大きい / 以上 | age >= 18 |
BETWEEN a AND b | a 以上かつ b 以下(両端を含む) | price BETWEEN 100 AND 500 |
IN (...) | リストのいずれかに一致 | country IN ('JP', 'US') |
LIKE | パターン一致(% 任意文字列、_ 任意 1 文字) | email LIKE '%@example.com' |
IS NULL / IS NOT NULL | NULL かどうか判定(= NULL は使えない) | deleted_at IS NULL |
AND | かつ(両方 TRUE で TRUE) | age >= 18 AND status = 'active' |
OR | または(どちらか TRUE で TRUE) | country = 'JP' OR country = 'US' |
NOT | 否定(TRUE/FALSE を反転) | NOT (status = 'paid') |
優先順位: NOT > AND > OR の順で強く結合されます。a OR b AND c は a OR (b AND c) と解釈されるため、意図した順にしたい場合は 括弧で明示するのが安全です。
IN / BETWEEN / LIKE
IN (..., ...): 値リストのいずれかに一致。サブクエリも渡せるBETWEEN a AND b:a <= x AND x <= bの糖衣(両端を含む)LIKE 'A%': 前方一致検索(%は任意の文字列、_は任意の 1 文字)。大文字小文字の扱いは RDBMS によって異なる(PostgreSQL はILIKEで大文字小文字無視)
sql
SELECT * FROM users WHERE country IN ('JP', 'US', 'DE');
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
SELECT * FROM users WHERE email LIKE '%@example.com';落とし穴: 列に関数をかけるとインデックスが使われない
WHERE UPPER(name) = 'TAKUMA' のように列側に関数を噛ませると、多くの RDBMS で B-tree インデックスが使えなくなります。
- 可能なら条件側のリテラルを加工する (
WHERE name = 'takuma') - やむを得ない場合は 関数インデックス(式インデックス)を作る (PostgreSQL / Oracle)
NOT INは NULL を含むと期待外れの結果になる(サブクエリのページ参照)
