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

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
1 つの条件は 1 つの質問に答えます。AND、OR、および NOT は条件をつなぎ、 1 つの WHERE で複合的な質問ができるようにします。 始める前に mysql -u root -p sakila でクライアントを開いてください。

AND、OR、および NOT の仕組み

COLUMN_LIST を必要な列に、TABLE_NAME をテーブルに、FIRST_CONDITION と SECOND_CONDITION のそれぞれを独立したテストに置き換えます。 AND は両方の条件が真のときだけ行を残します。OR は少なくとも一方が真のとき 行を残します。NOT は後に続く条件を反転します。 3 つの結合の強さは同じではありません。NOT が最も強く、次に AND、その次が OR です。そのためサーバーは a OR b AND c を a OR (b AND c) と読みますが、 これは書いた人の意図とはめったに一致しません。括弧はそれを上書きし、コストは かかりません。 3 つとも比較より弱く結合します。下の NOT rating = 'G' が列だけではなく比較 全体を反転するのはそのためです。

例

  1. 両方の条件

9 本の映画がレーティング G で、180 分を超えています。

  1. いずれかの条件

1 つの列を値のリストと照合するのはよくあることなので、専用の演算子があります。 IN は同じフィルタを 1 つの句で書きます。

  1. 条件を反転する

NOT rating = 'G' と rating <> 'G' は同じ行を選びます。単一の比較には <> を使い、NOT はより大きなものを反転するために取っておいてください。

AND は OR より強く結合する

これは「レーティングが G または PG で、かつ 180 分超」のように見えます。
182 行あり、最初の 1 本は 48 分です。AND が隣の組に結合したため、サーバーは 「レーティングが G、またはレーティングが PG で 180 分超」と答えました。G の 映画はすべて、長さにかかわらず最初の分岐だけで条件を満たしました。 括弧が意図を伝えます。
13 行です。どちらのクエリも無効ではなく、何も警告してくれないため、唯一の 防御策は、AND と OR を混ぜるたびに書きながら括弧で囲むことです。

OR は裸の 2 つ目の値を取らない

rating = 'G' OR 'PG' は、英語では「レーティングが G または PG」と読めます。 サーバーにとっては 2 つの別々の条件であり、2 つ目は文字列 'PG' が単独で 立っているものです。
G の映画だけが返り、フッターは警告を 1 件報告しています。同じセッションで SHOW WARNINGS を実行すると、サーバーが理由を説明します。 Warning 1292 Truncated incorrect DOUBLE value: 'PG' です。 条件は真か偽でなければならないため、サーバーは 'PG' を数値に変換しました。 'PG' は数字で始まらないので 0 に変換され、それは偽です。したがって 2 つ目の 分岐全体が無効でした。両側で列を指定するか、IN を使って ください。

NOT は直後のものだけを反転する

NOT は隣の比較を取ったため、これは「レーティングが G ではなく、かつ 180 分超」 です。組全体を反転するには、括弧で囲みます。
ACE GOLDFINGER はレーティング G で 48 分です。括弧で囲んだ組の条件を満たさ ないため、組を反転するとこの行が残ります。

まとめ

  • すべての条件が成り立つ必要があるときは AND を、どれか 1 つでよいときは OR を使います。
  • AND のほうが強く結合するため、AND と OR を混ぜる WHERE は括弧で囲みます。
  • NOT は隣の条件だけを反転すると考えてください。
  • 裸の値は数値に変換されるため、OR の両側で列を繰り返します。
  • フッターの警告数に注意し、SHOW WARNINGS を実行してください。

関連項目

  • WHERE — これらの演算子が組み立てる句
  • IN — 1 つの列を複数の値と照合するより整った方法
  • 演算子 — 組み合わせられる比較