English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite 子クエリ

サブクエリまたは内部クエリまたはネストクエリは、WHERE子句内に埋め込まれた別のSQLiteクエリです。

サブクエリは、主クエリで使用されるデータを返し、検索するデータの条件をさらに制限するために使用されます。

サブクエリはSELECT、INSERT、UPDATE、DELETE文および=、<、>、>=、<=、IN、BETWEENなどの演算子と一緒に使用できます。

サブクエリに従う必要のあるいくつかのルールがあります-

  • サブクエリは括弧内に配置する必要があります。

  • サブクエリはSELECT子句内で一つの列しか持つことができません。ただし、主クエリが複数の列を提供してサブクエリが選択する列を比較する場合を除きます。

  • 主クエリでは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           アレン       25          テキサス       15000.0
3           テディ       23          ノルウェー      20000.0
4           マーク        25          リッチ-モンド   65000.0
5           デイビッド       27          テキサス       85000.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0

今、SELECT文を使って以下のサブクエリを確認しましょう。

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000) ;

これにより以下の結果が得られます。

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           マーク        25          リッチ-モンド   65000.0
5           デイビッド       27          テキサス       85000.0

INSERT文と一緒に使用されるサブクエリ

サブクエリもINSERT文と一緒に使用できます。INSERT文は、サブクエリから返されるデータを使用して別のテーブルにデータを挿入します。サブクエリの中で選択されたデータを変更するためには、どんな文字、日付、数字の機能も使用できます。

以下は基本的な文法です-

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

COMPANY_BKPテーブルを考慮し、それはCOMPANYテーブルと似た構造を持っており、COMPANY_BKPとしてテーブル名を使用できます。COMPANYテーブルを完全にCOMPANY_BKPにコピーするには、以下の文法を使用してください。-

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

UPDATE文と一緒に使用されるサブクエリ

サブクエリは、UPDATE文と組み合わせて使用できます。UPDATE文と一緒に使用されるサブクエリでは、テーブルの単一の列または複数の列を更新できます。

以下は基本的な文法です-

UPDATE tableSET column_name = new_value[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

COMPANY_BKPテーブルが利用可能で、それはCOMPANYテーブルのバックアップであると仮定します。

以下の例では、COMPANYテーブルから年齢が大き于または等しい27歳のすべての顧客の給料を0倍に更新します。50倍。

sqlite> UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

これにより、2行が影響を受け、最終的に COMPANY テーブルには以下のレコードが含まれます-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           アレン       25          テキサス       15000.0
3           テディ       23          ノルウェー      20000.0
4           マーク        25          リッチ-モンド   65000.0
5           デイビッド       27          テキサス       42500.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0

DELETE文と一緒に使用されるサブクエリ

サブクエリは、上記で述べた他のどんなステートメントとも一緒に使用できます。

以下は基本的な文法です-

DELETE FROM TABLE_NAME[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

COMPANY_BKPテーブルが利用可能で、それはCOMPANYテーブルのバックアップであると仮定します。

以下の例では、COMPANYテーブルから年齢が大き于または等しい27のすべての顧客のレコード。

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

これにより、2行が影響を受け、最終的に COMPANY テーブルには以下のレコードが含まれます-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           アレン       25          テキサス       15000.0
3           テディ       23          ノルウェー      20000.0
4           マーク        25          リッチ-モンド   65000.0
5           デイビッド       27          テキサス       42500.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0