指定した値のリストと比較
カラムに含まれる値が、値のリストのいずれかに一致するかどうか調べたい場合、比較演算子と論理演算子を使えば次のように記述することができます。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム >= 値1 OR カラム <= 値2 OR ...;
IN句を使うと値のリストのいずれかに一致するかどうかをもう少し簡潔に記述することができます。書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム IN(値1, 値2, ...);
上記では、カラムに格納された値がIN句の中で指定した値のリストのいずれかに一致した場合にデータを取得します。
またNOT演算子を組み合わせることで指定した値のリストに含まれて居ない場合のデータを取得することもできます。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム NOT IN(値1, 値2, ...);
具体的には次のようになります。
create table customer(id integer, old integer, address text);
select * from customer where address in('東京', '神奈川');
select * from customer where address not in('東京', '神奈川');
最初のSELECT文では「address」カラムの値が'東京'か'神奈川'の場合にデータを取得します。2番目のSELECT文では「address」カラムの値が'東京'か'神奈川'ではない場合にデータを取得します。
他のテーブルの値を参照する
値を並べて指定するかわりに他のテーブルからSELECT文を使って値を取得し、その値に一致するかどうか調べることもできます。書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム IN(SELECT カラム名 FROM テーブル名);
IN句の中に記述したSELECT文は1つのカラムの値だけを取得するようにしなければなりません。カラムの値が、IN句の中のSELECT文によって取得された値のリストのいずれかに一致する場合にデータを取得します。
またNOT演算子を組み合わせることでSELECT文によって取得した値のリストに含まれて居ない場合のデータを取得することもできます。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム NOT IN(SELECT カラム名 FROM テーブル名);
具体的には次のようになります。
create table customer(id integer, old integer, address text); create table preftable(id integer, name text); select * from customer where address in(select name from preftable); select * from customer where address not in(select name from preftable);
最初のSELECT文では「address」カラムの値が「preftable」テーブル内の「name」カラムに含まれる値のいずれかに一致する場合にデータを取得します。2番目のSELECT文では「address」カラムの値が「preftable」テーブル内の「name」カラムに含まれる値のいずれにも一致しなかった場合にデータを取得します。
サンプル
では実際に試してみます。
次のようなデータが格納されたテーブルを対象にします。
それでは「address」カラムの値が'東京'か'大阪'のいずれかに一致するデータだけを取得してみます。
select * from customer where address in('東京', '大阪');
逆に「address」カラムの値が'東京'にも'大阪'にも一致しないデータだけを取得してみます。
select * from customer where address not in('東京', '大阪');
次に他のテーブルの値を使って見ます。次のようなテーブルを別に用意しました。
では「address」カラムの値が「preftable」テーブルの「name」カラムに格納された値のいずれかに一致するデータだけを取得してみます。
select * from customer where address in(select name from preftable);
このようにIN句を使うことで指定のカラムの値がリスト形式で指定した値のいずれかに一致するデータだけを取得することができます。