SQLite | データの追加・更新・削除 | 別のテーブルから取得したデータを追加する

INSERT文で明示的に指定した値を追加するほかに、SELECT文で別のテーブルから取得した行も追加できます。ここでは、その方法を説明します。

別のテーブルから取得したデータを追加する

構文は次のとおりです。

INSERT INTO テーブル名 SQL文;

追加先テーブルの列数とクエリ結果の列数は同じである必要があります。列名は異なっていても問題ありません。

INSERT INTO テーブル1 SELECT C1, C2, C3 FROM テーブル2 WHERE 条件式;

この例では、テーブル1に3つの列が定義されている必要があります。

追加先の列も指定できます。

INSERT INTO テーブル名 (列名1, 列名2, ...) SQL文;

指定した追加先の列数とクエリが返す列数は、この場合も同じである必要があります。

INSERT INTO テーブル1 (N1, N2, N3) SELECT C1, C2, C3 FROM テーブル2 WHERE 条件式;

ソーステーブルを作成し、データを追加します。

create table user (id integer, name text, old integer);
insert into user values (1, 'devkuma', 24);
insert into user values (2, 'kimkc', 31);
insert into user values (3, 'araikuma', 18);
insert into user values (4, 'happykuma', 25);
insert into user values (5, 'mykuma', 19);
sqlite> create table user (id integer, name text, old integer);
sqlite> 
sqlite> insert into user values (1, 'devkuma', 24);
sqlite> insert into user values (2, 'kimkc', 31);
sqlite> insert into user values (3, 'araikuma', 18);
sqlite> insert into user values (4, 'happykuma', 25);
sqlite> insert into user values (5, 'mykuma', 19);
sqlite> 

追加先テーブルを作成します。

create table olduser (id integer, name text, address text);
sqlite> create table olduser (id integer, name text, address text);
sqlite> 

userテーブルからold列が20より大きい行を選択し、id列とname列の値をolduserテーブルに追加します。

insert into olduser (id, name) select id, name from user where old> 20;
sqlite> insert into olduser (id, name) select id, name from user where old> 20;
sqlite> 

olduserテーブルを照会して、追加された行を確認します。例では比較のために先にuserテーブルを照会しています。

select * from olduser;
sqlite> select * from user;
id          name        old       
----------  ----------  ----------
1           devkuma     24        
2           kimkc       31        
3           araikuma    18        
4           happykuma   25        
5           mykuma      19        
sqlite> 
sqlite> select * from olduser;
id          name        address   
----------  ----------  ----------
1           devkuma               
2           kimkc                 
4           happykuma      
sqlite> 

old列が20より大きいソース行だけが追加されました。olduseraddress列の値は指定していないため、デフォルト値のNULLが保存されます。