VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
WHERE は条件を満たす行を保持し、残りを捨てます。これまでのすべてのレッスンは
テーブル全体を返しました。これが、テーブルを答えに変える句です。
始める前に、mysql -u root -p sakila でクライアントを開いてください。
WHERE の仕組み
COLUMN_LIST を欲しい列に、TABLE_NAME をテーブルに、SEARCH_CONDITION を
サーバーが一度に 1 行ずつ適用できるテストに置き換えます。サーバーは各行を
読み、その行の値に対して条件を評価し、結果が真のときに行を保持します。偽に
なる行、または NULL になる行は捨てられます。
WHERE は FROM の後、ORDER BY の前に置き、それが結果が定義される順序
です。絞り込み、次に残ったものの並べ替え、次に LIMIT の適用です。そのため、
WHERE の後の LIMIT 5 は、一致する行のうちの 5 行を返すのであって、一部が
一致する 5 行を返すのではありません。サーバーはその答えにどんな方法でたどり
着いてもよく、EXPLAIN がどの方法を選んだかを示します。
例
- 1 つの値に一致させる
Sakila はすべての映画にレーティングを付けています。これはレーティングが G の
映画を保持します。
- 数値を比較する
title でも並べ替えることで同点が解消され、そのおかげで
毎回同じ 5 本が返ってきます。
- 選択していない列で絞り込む
条件は結果ではなく行をテストします。ここで rental_rate は出力にまったく
現れませんが、フィルタは動作します。
- 1 つの値を除くすべて
<> は「等しくない」です。!= も同じ意味で、どちらでもかまいません。
WHERE は列エイリアスを見られない
エイリアスは結果の列に名前を付けます。WHERE は結果が存在する前に実行される
ため、そこでエイリアスを指定すると失敗します。
ORDER BY はエイリアスを使える句です。結果が構築された後に実行されるため
です。ORDER BY のレッスンがそれを示しています。
一致なしはエラーではない
Empty set は、クエリが実行され、条件を満たす行がなかったという意味です。
サーバーは表の代わりにこれを表示するため、列の見出しもありません。これは
1 つの答えです。
まとめ
- 条件を満たす行だけを保持するには
WHEREを使います。 - 文字列は単一引用符で囲み、数値はそのまま書きます。
- サーバーはまず絞り込み、次に並べ替え、次に
LIMITを適用すると考えてください。 - 選択したかどうかにかかわらず、テーブルのどの列でもテストできます。
WHEREではエイリアスを指定するのではなく式を繰り返します。エイリアスを指定するとERROR 1054になります。
関連項目
- SELECT — WHERE が付く文
- 演算子 — 条件を組み立てる比較
- AND、OR、および NOT — 複数の条件の組み合わせ
- ORDER BY — フィルタを通過したものの並べ替え