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 のほうが読みやすくなります。
例
- 複数の値のいずれかに一致する
- どれにも一致しない
- 数値のリスト
actor_id 順に返るのは ORDER BY で
そう指定したからであり、リストがその順に並んでいるからではありません。
- サーバーが自分で求めるリスト
括弧の中にはリストの代わりにクエリを書けます。film_actor は各映画と
その出演俳優を組み合わせるテーブルなので、このクエリは映画の id を 1 つも
知らなくても、俳優 1 が出演する映画を求めます。
IN のリストだからです。
リスト内の NULL は NOT IN を壊す
IN と NOT IN はリスト内の NULL を同じようには扱いません。そして
どちらも警告を出しません。
IN では、リスト内の NULL は無害です。実際の値に一致する行はそのまま
残ります。
NOT IN では、同じリストがまったく何も返しません。
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 で使ったクエリの形