SQLite | データの検索 | 値の一覧と比較する(IN句)

IN句を使うと、カラム値が一覧内のいずれかと一致するか判定できます。ここでは、その使い方を説明します。

条件付き検索についてはWHERE句の記事を参照してください。

IN句を使った条件式

INに値の一覧を指定して一致を判定します。構文は次のとおりです。

SELECT カラム名, ... FROM テーブル名 WHERE カラム IN (値1, 値2, ...);

カラム値が一覧のいずれかと一致すると行を取得します。これは等価比較をORで結ぶ場合と同じです。

SELECT カラム名, ... FROM テーブル名 WHERE カラム = 値1 OR カラム = 値2 OR ...;

NOT INを使うと一覧に含まれない行を取得できます。

SELECT カラム名, ... FROM テーブル名 WHERE カラム NOT IN (値1, 値2, ...);

例として次のテーブルを作成します。

create table user (name text, old integer, address text);
sqlite> create table user (name text, old integer, address text);
sqlite> 

テーブルにデータを追加します。

insert into user values ('devkuma', 39, 'Seoul');
insert into user values ('kimkc', 34, 'Busan');
insert into user values ('araikuma', 26, 'Paju');
insert into user values ('happykuma', 19, 'Paju');
insert into user values ('mykuma', 27, 'Daejeon');
insert into user values ('yourkuma', 28, 'Seongnam');
insert into user values ('raccoon', 31, 'Suwon');
sqlite> insert into user values ('devkuma', 39, 'Seoul');
sqlite> insert into user values ('kimkc', 34, 'Busan');
sqlite> insert into user values ('araikuma', 26, 'Paju');
sqlite> insert into user values ('happykuma', 19, 'Paju');
sqlite> insert into user values ('mykuma', 27, 'Daejeon');
sqlite> insert into user values ('yourkuma', 28, 'Seongnam');
sqlite> insert into user values ('raccoon', 31, 'Suwon');
sqlite> 

条件なしで検索すると次の結果になります。

select * from user;
sqlite> select * from user;
name        old         address   
----------  ----------  ----------
devkuma     39          Seoul     
kimkc       34          Busan     
araikuma    26          Paju      
happykuma   19          Paju      
mykuma      27          Daejeon   
yourkuma    28          Seongnam  
raccoon     31          Suwon     
sqlite> 

addressPajuSeongnamSuwonのいずれかに一致する行を検索します。

select * from user where address in ('Paju', 'Seongnam', 'Suwon');
sqlite> select * from user where address in ('Paju', 'Seongnam', 'Suwon');
name        old         address   
----------  ----------  ----------
araikuma    26          Paju      
happykuma   19          Paju      
yourkuma    28          Seongnam  
raccoon     31          Suwon     
sqlite> 

条件に一致する行だけが返されます。

別のテーブルから取得した値と比較する

値を直接列挙する代わりに、サブクエリで別テーブルから一覧を取得できます。構文は次のとおりです。

SELECT カラム名, ... FROM テーブル名 WHERE カラム IN (SELECT カラム名 FROM テーブル名);

サブクエリは1カラムだけを返す必要があります。その結果のいずれかと一致する行を取得します。

次のテーブルを作成します。

create table gyeonggi (id integer, region text);
sqlite> create table gyeonggi (id integer, region text);
sqlite> 

テーブルにデータを追加します。

insert into gyeonggi values (1, 'Paju');
insert into gyeonggi values (2, 'Seongnam');
insert into gyeonggi values (3, 'Suwon');
insert into gyeonggi values (4, 'Gimpo');
sqlite> insert into gyeonggi values (1, 'Paju');
sqlite> insert into gyeonggi values (2, 'Seongnam');
sqlite> insert into gyeonggi values (3, 'Suwon');
sqlite> insert into gyeonggi values (4, 'Gimpo');
sqlite> 

addressgyeonggiテーブルのregionと一致するuser行を検索します。

select * from user where address in (select region from gyeonggi);
sqlite> select * from user where address in (select region from gyeonggi);
name        old         address   
----------  ----------  ----------
araikuma    26          Paju      
happykuma   19          Paju      
yourkuma    28          Seongnam  
raccoon     31          Suwon     
sqlite> 

条件に一致する行だけが返されます。