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

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

All examples on this page work on VillageSQL. Install Now →
IN は 1 つの列を複数の値と一度に比較します。OR をつなげたものと同じ ことを 1 つの句で表し、フィルタの値が 2 つを超えたときに多くの人が使う句です。 始める前に mysql -u root -p sakila でクライアントを開いてください。

IN の仕組み

COLUMN_NAME をテストする列に、FIRST_VALUE と SECOND_VALUE を受け入れる 値に置き換えます。 条件は、列が括弧内のいずれかの値と等しいときに真になります。値はカンマで 区切り、必要なだけ並べられます。 x IN (a, b) は x = a OR x = b と同じ意味です。読みやすいほうを書いて ください。値が 2 つを超えると IN のほうが読みやすくなります。

例

  1. 複数の値のいずれかに一致する

  1. どれにも一致しない

  1. 数値のリスト

数値には引用符を付けません。行が actor_id 順に返るのは ORDER BY で そう指定したからであり、リストがその順に並んでいるからではありません。

  1. サーバーが自分で求めるリスト

括弧の中にはリストの代わりにクエリを書けます。film_actor は各映画と その出演俳優を組み合わせるテーブルなので、このクエリは映画の id を 1 つも 知らなくても、俳優 1 が出演する映画を求めます。
別のクエリの中に書かれたクエリをサブクエリと呼びます。後のセクションで きちんと扱います。ここで 1 つ見ておく価値があるのは、多くの人が最初に サブクエリを書く場所が IN のリストだからです。

リスト内の NULL は NOT IN を壊す

IN と NOT IN はリスト内の NULL を同じようには扱いません。そして どちらも警告を出しません。 IN では、リスト内の NULL は無害です。実際の値に一致する行はそのまま 残ります。
NOT IN では、同じリストがまったく何も返しません。
すべての映画にはレーティングがあり、そのうち 822 本は G ではないので、 空の結果は意外です。理由は、NOT IN が「列がリスト内のすべての値と 異なるか」を問うものであり、NULL と異なることは何についても示せないからです。 何かを NULL と比較すると、真でも偽でもなく NULL になるため、条件全体が 決して真にならず、どの行も残りません。 これが最も問題になるのはリストがサブクエリのときです。自分で手書きして いないサブクエリは、予期しない NULL を返すことがあるからです。可能な 場合は、サブクエリの中に WHERE COLUMN_NAME IS NOT NULL を加えてください。 IS NULL のレッスンでは、NULL がどう比較されるかを 扱います。

まとめ

  • 1 つの列を値のリストと 1 つの句で比較するには IN を使います。
  • x IN (a, b) は x = a OR x = b と読みます。
  • リスト内の文字列は引用符で囲み、数値はそのまま書きます。
  • リスト自体が 1 つの答えであるときは、括弧の中にサブクエリを置きます。
  • NOT IN のリストに NULL を入れないでください。行がまったく返らなくなります。

関連項目

  • AND、OR、NOT — IN が置き換える OR の連鎖
  • IS NULL — NULL との比較が真でも偽でもない理由
  • BETWEEN — リストではなく範囲をテストする
  • サブクエリ — 例 4 で使ったクエリの形