> ⑯サブクエリ – ネットワークエンジニアチュートリアル

⑯サブクエリ

スポンサーリンク

無料でプログラマへ!30歳までなら無料でプログラミング学校に通うことが出来ます。下の画像をクリックして無料相談会でGO!

サブクエリ




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

サブクエリを使用して、メインクエリで使用されるデータを条件として検索し、検索するデータをさらに制限します。

副問合せは、SELECT、INSERT、UPDATEおよびDELETE文とともに、=、<、>、> =、<=、IN、BETWEENなどの演算子とともに使用できます。

サブクエリに従わなければならないルールはいくつかあります。

  • サブクエリはかっこで囲む必要があります。
  • サブクエリは、選択された列を比較するためにサブクエリの複数の列がメイン問合せに含まれていない限り、SELECT句には1つの列のみを持つことができます。
  • サブクエリでORDER BYコマンドを使用することはできませんが、メイン・クエリではORDER BYを使用できます。GROUP BYコマンドを使用すると、サブクエリ内のORDER BYと同じ機能を実行できます。
  • 複数の行を返すサブクエリは、IN演算子などの複数の値演算子でのみ使用できます。
  • SELECTリストには、BLOB、ARRAY、CLOB、またはNCLOBと評価される値への参照を含めることはできません。
  • サブクエリは、set関数ですぐに囲むことはできません。
  • 副問合せで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 | kodak    |  32 | Ahmedabad |  2000.00 |
|  2 | nikon    |  25 | Delhi     |  1500.00 |
|  3 | suzuki   |  23 | Kota      |  2000.00 |
|  4 | nissan   |  25 | Mumbai    |  6500.00 |
|  5 | tometo   |  27 | Bhopal    |  8500.00 |
|  6 | nakag    |  22 | MP        |  4500.00 |
|  7 | toshiki  |  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 | nissan   |  25 | Mumbai  |  6500.00 |
|  5 | tometo   |  27 | Bhopal  |  8500.00 |
|  7 | toshiki  |  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_BKPテーブルに完全なCUSTOMERSテーブルをコピーするには、次の構文を使用します。

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 | kodak    |  32 | Ahmedabad |  2000.00 |
|  2 | nikon    |  25 | Delhi     |  1500.00 |
|  3 | suzuki   |  23 | Kota      |  2000.00 |
|  4 | nissan   |  25 | Mumbai    |  6500.00 |
|  5 | tometo   |  27 | Bhopal    |  8500.00 |
|  6 | nakag    |  22 | MP        |  4500.00 |
|  7 | toshiki  |  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 | nikon    |  25 | Delhi   |  1500.00 |
|  3 | suzuki   |  23 | Kota    |  2000.00 |
|  4 | nissan   |  25 | Mumbai  |  6500.00 |
|  6 | nakag    |  22 | MP      |  4500.00 |
|  7 | toshiki  |  24 | Indore  | 10000.00 |
+----+----------+-----+---------+----------+

前のページ⑮クローンテーブル

次のページ⑰シーケンスの使用

スポンサーリンク

ネットワークエンジニアになりたければ下記から無料相談会に参加!
なんと無料で授業を受けれてエンジニアになれます

投稿日:2017-09-19 更新日:

執筆者: