Query Go
行を条件で絞り込む - WHERE の使い方・オプション・サンプル

行を条件で絞り込む - WHERE

行を絞り込む句。比較・論理演算子、IN・BETWEEN・LIKE、NULL 扱いの注意点を押さえる

概念図

WHERE diagram

構文

sql
SELECT ... FROM テーブル WHERE 条件

サンプル

比較演算子で行を絞り込む最小例(age が 20 以上の行だけを残す)

sql
SELECT *
FROM users
WHERE age >= 20;

WHERE の役割

WHEREFROM が取り出した行を 条件式が 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 ba 以上かつ b 以下(両端を含む)price BETWEEN 100 AND 500
IN (...)リストのいずれかに一致country IN ('JP', 'US')
LIKEパターン一致(% 任意文字列、_ 任意 1 文字)email LIKE '%@example.com'
IS NULL / IS NOT NULLNULL かどうか判定(= 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 ca 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 を含むと期待外れの結果になる(サブクエリのページ参照)

関連トピック