SQL-サブクエリ
サブクエリ、内部クエリ、またはネストされたクエリは、別のSQLクエリ内のクエリであり、WHERE句に埋め込まれています。
サブクエリは、取得するデータをさらに制限するための条件としてメインクエリで使用されるデータを返すために使用されます。
サブクエリは、SELECT、INSERT、UPDATE、およびDELETEステートメントとともに、=、<、>、> =、<=、IN、BETWEENなどの演算子とともに使用できます。
サブクエリが従わなければならないいくつかのルールがあります-
サブクエリは括弧で囲む必要があります。
サブクエリのメインクエリに複数の列があり、選択した列を比較しない限り、サブクエリはSELECT句に1つの列しか含めることができません。
メインクエリではORDERBYを使用できますが、ORDERBYコマンドをサブクエリで使用することはできません。GROUP BYコマンドを使用して、サブクエリでORDERBYと同じ機能を実行できます。
複数の行を返すサブクエリは、IN演算子などの複数の値演算子でのみ使用できます。
SELECTリストには、BLOB、ARRAY、CLOB、またはNCLOBに評価される値への参照を含めることはできません。
サブクエリを集合関数ですぐに囲むことはできません。
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])
例
次のレコードを持つCUSTOMERSテーブルについて考えてみます-
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | 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ステートメントを使用して次のサブクエリを確認しましょう。
SQL> 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テーブルにコピーするには、次の構文を使用できます。
SQL> 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倍更新します。
SQL> 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 | 35 | Ahmedabad | 125.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テーブルからレコードを削除します。
SQL> 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 |
+----+----------+-----+---------+----------+