T-SQL-サブクエリ

A sub-query または Inner query または Nested query別のSQLServerクエリ内のクエリであり、WHERE句内に埋め込まれています。サブクエリは、取得するデータをさらに制限するための条件としてメインクエリで使用されるデータを返すために使用されます。

サブクエリは、SELECT、INSERT、UPDATE、およびDELETEステートメントとともに、=、<、>、> =、<=、IN、BETWEENなどの演算子とともに使用できます。

サブクエリが従わなければならないいくつかのルールがあります-

  • サブクエリは括弧で囲む必要があります。

  • サブクエリには、SELECT句とFROM句を含める必要があります。

  • サブクエリには、オプションのWHERE、GROUP BY、およびHAVING句を含めることができます。

  • サブクエリにCOMPUTE句またはFORBROWSE句を含めることはできません。

  • TOP句が含まれている場合にのみ、ORDERBY句を含めることができます。

  • 最大32レベルのサブクエリをネストできます。

SELECTステートメントを使用したサブクエリ

構文

サブクエリは、SELECTステートメントで最も頻繁に使用されます。以下は基本的な構文です。

SELECT column_name [, column_name ] 
FROM   table1 [, table2 ] 
WHERE  column_name OPERATOR 
   (SELECT column_name [, column_name ] 
   FROM table1 [, table2 ] 
   [WHERE])

次のレコードを持つCUSTOMERSテーブルについて考えてみます。

ID  NAME       AGE       ADDRESS            SALARY 
1   Ramesh     32        Ahmedabad          2000.00 
2   Khilan     25        Delhi              1500.00 
3   kaushik    23        Kota               2000.00 
4   Chaitali   25        Mumbai             6500.00 
5   Hardik     27        Bhopal             8500.00 
6   Komal      22        MP                 4500.00 
7   Muffy      24        Indore             10000.00

SELECTステートメントを使用して次のサブクエリを適用してみましょう。

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

上記のコマンドは、次の出力を生成します。

ID  NAME       AGE       ADDRESS          SALARY 
4   Chaitali   25        Mumbai           6500.00 
5   Hardik     27        Bhopal           8500.00 
7   Muffy      24        Indore           10000.00

INSERTステートメントを使用したサブクエリ

サブクエリは、INSERTステートメントでも使用できます。INSERTステートメントは、サブクエリから返されたデータを使用して、別のテーブルに挿入します。サブクエリで選択したデータは、文字、日付、または数値関数のいずれかを使用して変更できます。

構文

以下は基本的な構文です。

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

CUSTOMERSテーブルと同様の構造を持つテーブルCUSTOMERS_BKPについて考えてみます。以下は、完全なCUSTOMERSテーブルをCUSTOMERS_BKPにコピーするための構文です。

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

UPDATEステートメントを使用したサブクエリ

サブクエリは、UPDATEステートメントと組み合わせて使用​​できます。UPDATEステートメントでサブクエリを使用すると、テーブル内の単一または複数の列を更新できます。

構文

以下は基本的な構文です。

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

CUSTOMERSテーブルのバックアップであるCUSTOMERS_BKPテーブルが使用可能であると仮定します。

次のコマンド例は、AGEが27以上のすべての顧客のCUSTOMERSテーブルでSALARYを0.25倍更新します。

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

これは2つの行に影響し、最終的にCUSTOMERSテーブルには次のレコードが含まれます。

ID  NAME       AGE       ADDRESS             SALARY 
1   Ramesh     32        Ahmedabad           500.00 
2   Khilan     25        Delhi               1500.00 
3   kaushik    23        Kota                2000.00 
4   Chaitali   25        Mumbai              6500.00 
5   Hardik     27        Bhopal              2125.00 
6   Komal      22        MP                  4500.00 
7   Muffy      24        Indore              10000.00

DELETEステートメントを使用したサブクエリ

サブクエリは、上記の他のステートメントと同様に、DELETEステートメントと組み合わせて使用​​できます。

構文

以下は基本的な構文です。

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

CUSTOMERSテーブルのバックアップであるCUSTOMERS_BKPテーブルが使用可能であると仮定します。

次のコマンド例は、AGEが27以上のすべての顧客のCUSTOMERSテーブルからレコードを削除します。

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

これは2つの行に影響し、最終的にCUSTOMERSテーブルには次のレコードが含まれます。

ID  NAME       AGE       ADDRESS          SALARY 
2   Khilan     25        Delhi            1500.00 
3   kaushik    23        Kota             2000.00 
4   Chaitali   25        Mumbai           6500.00  
6   Komal      22        MP               4500.00 
7   Muffy      24        Indore           10000.00