複数条件に一致するデータに絞り込もう

これまで、特定の列の値に一致する、もしくは一致しないデータや、特定の値を(超える/未満)のデータ・(以上/以下)のデータに絞り込む方法を学んできました。

しかし、それだけの知識では求めるデータに辿り着けない場合があります。

例えば、users テーブルがあるとして、職種が A の人で、かつ登録年月日が 2021 年の間で・・・といったように、いくつかの条件を組み合わせてデータを抽出したい場合などです。

ここでは、複数の条件に合致するデータに絞り込む方法を学んでいきます。

書き方

複数の条件のうち、いずれかの条件に合致するレコードだけに絞り込みたい場合、OR を使う

列 A の値が値 1 もしくは列 B の値が値 2 であるレコードに絞り込みたい場合

SELECT * FROM <テーブル名> WHERE 列A = 値1 OR 列B = 値2;

複数の条件のうち、それらの条件どちらともに合致するレコードに絞り込みたい場合、AND を使う

列 A の値が値 1 であり、かつ、列 B の値が値 2 であるレコードに絞り込みたい場合

SELECT * FROM <テーブル名> WHERE 列A = 値1 AND 列B = 値2;

書き方の説明

OR: 前後に記述した条件のうち、いずれかの条件を満たす行に絞り込みます。

AND: 前後に記述した条件の両方を満たす行に絞り込みます。

ORAND は複数回使うことができるので、条件1 AND 条件2 OR 条件3 などの記述も可能です。

ただし、ANDOR より優先度が高いので、もし 条件1 AND 条件2 OR 条件3 と書いたら、条件 1 かつ条件 2 を満たすデータか、もしくは条件 3 を満たすデータ、つまり (条件1 AND 条件2) OR 条件3 と同義となります。

条件 1 かつ、条件 2 または条件 3 を満たすものとしたい場合は、ANDより優先度が高い () で括り、条件1 AND (条件2 OR 条件3) とします。

商品情報が入っている products テーブルから、price が 4000 もしくは price が 480 のデータを取得したいとき

SELECT * FROM products WHERE price = 4000 OR price = 480;

ユーザー情報が入っている users テーブルから price が 4000 かつ name が melon のデータを取得したいとき

SELECT * FROM users WHERE price = 4000 AND name = 'melon';

練習

次の SQL 文を実行すると、price が 4000 かつ、name が melon のデータを取得できます。

問題

sales というテーブルがあります。この sales というテーブルから、user_id が 770 もしくは 500 のデータ かつ、total_price が 440 以外 のデータを取得する SQL 文を書いてみましょう。

答え合わせ

正解を見る
正解:SELECT * FROM sales WHERE (user_id = 770 OR user_id = 500) AND total_price <> 440;
解説:user_id が770もしくは500なので一つ目の条件としてuser_id = 770 OR user_id = 500 を示しますが、次に続くAND条件と分離させるために、() で括って (user_id = 770 OR user_id = 500) とします。また、total_price が440 以外 なので、total_price <> 440が二つ目の条件となり、両者を満たすものになるのでANDで接続します。