指定した値のリストと比較
カラムの値が複数の値のいずれかに該当するかどうかという条件式を記述する時に使用できるIN句の使い方について解説します。
1.IN句の使い方
2.他のテーブルから取得した値のリストと比較
値をリストのように記述しておき、このリストの中のいずれかの値に一致するかどうかを調べる場合にIN句を使用すると便利です。書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム IN(値1, 値2, ...);
カラムの値がIN句で指定された値1、値2、...のいずれにかに一致した場合にデータを取得します。これは比較演算子と論理演算子を使って次のように記述した場合と同じです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム = 値1 OR カラム = 値2 OR ...;
またNOT演算子を組み合わせることで指定した値のリストに含まれて居ない場合のデータを取得することもできます。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム NOT IN(値1, 値2);
この場合はカラムの値が値1または値2でない場合にデータを取得します。
それでは実際に試してみます。次のようなテーブルを作成しました。
create table user(id integer, name text, address text);
いくつかのデータが格納されています。取得するデータの条件を指定しないでデータを取得した場合は次のようになります。
select * from user;
それではIN句を使って条件に一致する値のリストを指定してみます。次の例では「address」カラムの値が「'Tokyo'」「'Kanagawa'」に一致するデータを取得しています。
select * from user where address in('Tokyo', 'Kanagawa');
今回は2つの値との比較でしたが、ある程度の数の値と一致するかどうかの条件式を記述する場合にIN句を使用すると便利です。
比較する値のリストとして、値を1つ1つ並べて記述する以外に他のテーブルからSELECT文を使って値のリストを取得し一致するかどうか比較することもできます。書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム IN(SELECT カラム名 FROM テーブル名);
IN句の中に記述したSELECT文は1つのカラムの値だけを取得するようにしなければなりません。カラムの値が、IN句の中のSELECT文によって取得された値のリストのいずれかに一致する場合にデータを取得します。
それでは実際に試してみます。次のようなテーブルを作成しました。
create table westarea(id integer, pref text);
このテーブルには次のようなデータが格納されています。
それではuserテーブルからデータを取得します。取得するデータは「address」カラムの値がwestareaテーブルの「pref」カラムの値のいずれかと一致するデータです。
select * from user where address in(select pref from westarea);
条件に一致するデータを取得することができました。
notを使用することで値のリストと一致しないデータを取得することもできます。
select * from user where address not in(select pref from westarea);
このように他のテーブルから取得した値と一致するかどうか比較してデータを取得することができます。
( Written by Tatsuo Ikura )