SQLiteサブクエリ
サブクエリ、内部クエリ、またはネストされたクエリは、別の SQLite クエリ内の WHERE 句に埋め込まれたクエリです。
サブクエリを使用して返されたデータは、取得するデータをさらに制限するためにメインクエリの条件として使用されます。
サブクエリは、=、<、>、>=、<=、IN、BETWEEN などの演算子とともに、SELECT、INSERT、UPDATE、DELETE ステートメントで使用できます。
サブクエリが従う必要のあるルールをいくつか示します:
サブクエリは括弧で囲む必要があります。
サブクエリの選択された列と比較するメインクエリに複数の列がない限り、サブクエリは SELECT 句に 1 つの列のみを持つことができます。
ORDER BY はメインクエリでは使用できますが、サブクエリでは使用できません。 GROUP BY はサブクエリで使用でき、ORDER BY と同じ機能があります。
複数の行を返すサブクエリは、IN 演算子などの複数値演算子でのみ使用できます。
BETWEEN 演算子はサブクエリでは使用できませんが、BETWEEN はサブクエリ内で使用できます。
SELECT ステートメントでのサブクエリの使用法
サブクエリは通常、SELECT ステートメントで使用されます。基本的な構文は次のとおりです:
SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])
例
COMPANY テーブルに次のレコードがあるとします:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
次に、SELECT ステートメントでのサブクエリの使用状況を確認してみましょう:
sqlite> SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY WHERE SALARY > 45000) ;
これにより、次の結果が生成されます:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0INSERT ステートメント内の
Sub
Subquery を使用したクエリは、INSERT ステートメントでも使用できます。 INSERT ステートメントは、サブクエリによって返されたデータを使用して別のテーブルに挿入します。サブクエリで選択されたデータは、任意の文字、日付、または数値関数を使用して変更できます。
基本的な構文は次のとおりです:
INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]
例
COMPANY_BKP の構造は COMPANY テーブルに似ており、テーブル名が COMPANY_BKP に変更されることを除いて、同じ CREATE TABLE を使用して作成できると仮定します。次に、次の構文を使用して COMPANY テーブル全体を COMPANY_BKP にコピーします。
sqlite> INSERT INTO COMPANY_BKP SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY) ;
UPDATE ステートメントでのサブクエリの使用
サブクエリは UPDATE ステートメントと組み合わせて使用できます。 UPDATE ステートメントでサブクエリを使用すると、テーブル内の 1 つまたは複数の列が更新されます。
基本的な構文は次のとおりです:
UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
例
COMPANY テーブルのバックアップである COMPANY_BKP テーブルがあると仮定します。
次の例では、COMPANY テーブル内の AGE が 27 以上のすべての顧客の SALARY を元の値の 0.50 倍に更新します。
sqlite> UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 );
これは 2 つの行に影響します。COMPANY テーブルの最後のレコードは次のとおりです。 : DELETE ステートメント内の
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 10000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 42500.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
サブクエリの使用法
サブクエリは、上記の他のステートメントと同様に、DELETE ステートメントと組み合わせて使用できます。
基本的な構文は次のとおりです:
DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ]
例
COMPANY テーブルのバックアップである COMPANY_BKP テーブルがあると仮定します。
次の例では、AGE が 27 以上である COMPANY テーブル内のすべての顧客レコードを削除します。
sqlite> DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27 );
これは 2 つの行に影響し、COMPANY テーブルの最後のレコードは次のとおりです:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 42500.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0