メインコンテンツへスキップ

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. 1 つの値に一致させる

Sakila はすべての映画にレーティングを付けています。これはレーティングが G の 映画を保持します。
文字列は単一引用符で囲みます。数値は囲みません。

  1. 数値を比較する

185 分はカタログ内で最も長い映画で、その長さの映画が 10 本あるため、最初の 5 行はすべて同点です。title でも並べ替えることで同点が解消され、そのおかげで 毎回同じ 5 本が返ってきます。

  1. 選択していない列で絞り込む

条件は結果ではなく行をテストします。ここで rental_rate は出力にまったく 現れませんが、フィルタは動作します。

  1. 1 つの値を除くすべて

<> は「等しくない」です。!= も同じ意味で、どちらでもかまいません。

WHERE は列エイリアスを見られない

エイリアスは結果の列に名前を付けます。WHERE は結果が存在する前に実行される ため、そこでエイリアスを指定すると失敗します。
代わりに、条件の中で式をもう一度書きます。
ORDER BY はエイリアスを使える句です。結果が構築された後に実行されるため です。ORDER BY のレッスンがそれを示しています。

一致なしはエラーではない

Empty set は、クエリが実行され、条件を満たす行がなかったという意味です。 サーバーは表の代わりにこれを表示するため、列の見出しもありません。これは 1 つの答えです。

まとめ

  • 条件を満たす行だけを保持するには WHERE を使います。
  • 文字列は単一引用符で囲み、数値はそのまま書きます。
  • サーバーはまず絞り込み、次に並べ替え、次に LIMIT を適用すると考えてください。
  • 選択したかどうかにかかわらず、テーブルのどの列でもテストできます。
  • WHERE ではエイリアスを指定するのではなく式を繰り返します。エイリアスを指定すると ERROR 1054 になります。

関連項目