SQLサブクエリ完全ガイド:基本構文からSELECT・INSERT・UPDATE・DELETEでの実践例まで
SQLサブクエリとは、別のSQLクエリの中に組み込まれたクエリのことです。主にWHERE句やHAVING句の中で使用され、あるクエリの実行結果を、別のクエリの条件や引数として指定できます。
SQLでクエリを書いていると、「別のクエリの結果に基づいて条件を指定したい」という場面によく出会います。たとえば、顧客リストから「一定額を超える注文をした顧客だけを抽出したい」としましょう。しかし、注文情報と顧客情報は別々のテーブルに保存されているため、単純なクエリでは取得できません。
そんなときに役立つのがSQLサブクエリです。サブクエリは「ネストされたクエリ(入れ子構造のクエリ)」とも呼ばれ、別のSQLクエリのWHERE句内に記述されるSELECT文です。外側のメインクエリは、サブクエリの結果を受け取って処理を行います。
この記事では、具体的なコード例を挙げながら、SQLにおけるサブクエリの使い方を詳しく解説します。
SQLサブクエリの基本
SQLサブクエリとは、別のクエリの中に含まれるクエリのことです。あるクエリの結果に依存する形で別のクエリを実行したい場合に使われます。サブクエリを使えば、2つのクエリを別々に実行して結果を手作業でコピー&ペーストする必要がなく、1つのクエリで完結できるのが大きなメリットです。サブクエリはWHERE句またはHAVING句の中に記述します。
SQLのSELECT文におけるサブクエリの基本構文は以下の通りです。
SELECT name FROM products WHERE supplier_id IN (SELECT id FROM suppliers WHERE local = True);
このクエリは、国内の企業から供給されているすべての商品名を取得します。ここでは、SQLのIN演算子への入力としてサブクエリを使用しています。IN演算子は、supplier_idがサブクエリの結果に含まれている「products」テーブルの全レコードを返します。
サブクエリは、INSERT文・UPDATE文・DELETE文でも使用できます。それぞれの詳細は後述します。
サブクエリを記述する際は、以下のポイントに注意しましょう。
- 必ず括弧()で囲む:サブクエリは必ず丸括弧で囲みます。これにより、サブクエリの内部とメインクエリが明確に区別されます。
- 必要なカラムを正しく選択する:上記の例では、suppliersテーブルからidを選択しています。もし別のカラムを選択すると、メインクエリがサプライヤーIDに依存しているため、クエリは正しく動作しません。
SQLサブクエリの使用例:SELECT
まずは最も基本的なSELECT文でのサブクエリの使い方を見てみましょう。次のクエリは、200ドルを超える注文をしたすべての顧客のリストを返します。
SELECT * FROM customers WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
このクエリの実行結果は次の通りです。
| name | address | loyalty_plan | id | |
| Katy | katy.l@gmail.com | Mountain View, CA | None | 4 |
| John | john.p@outlook.com | Boston, MA | None | 1 |
(2行)
1行目では、customersテーブルのすべてのカラムを選択しています。次に、顧客IDがサブクエリの結果に含まれる顧客のみを取得するよう条件を指定しています。サブクエリでは、ordersテーブルから200ドルを超える商品を注文した顧客のIDを重複なく(DISTINCT)抽出しています。この条件に一致した顧客だけが、最終的な結果として返されます。
SQLサブクエリの使用例:INSERT
サブクエリは、別テーブルへのデータ挿入にも活用できます。200ドルを超える購入をした顧客の全レコードを、high_value_customersというテーブルに挿入したいとしましょう。その場合は、INSERT文とサブクエリを次のように組み合わせます。
INSERT INTO high_value_customers SELECT * FROM customers WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
high_value_customersテーブルを照会すると、高額購入顧客が1つのテーブルにまとめられていることが確認できます。
| name | address | loyalty_plan | id | |
| Katy | katy.l@gmail.com | Mountain View, CA | Gold | 4 |
| John | john.p@outlook.com | Boston, MA | None | 1 |
(2行)
SQLサブクエリの使用例:UPDATE
サブクエリは、既存データの更新にも使えます。たとえば、高額な購入をしたすべての顧客のロイヤルティプランを「High Value」に更新したい場合、次のようなクエリで実現できます。
UPDATE customers SET loyalty_plan = 'High Value' WHERE id IN (SELECT DISTINCT customer_id FROM orders WHERE cost > 200);
更新後にcustomersテーブルを照会すると、該当する2人の顧客のロイヤルティプランが「High Value」に変更されていることがわかります。
| name | address | loyalty_plan | id | |
| Katy | katy.l@gmail.com | Mountain View, CA | High Value | 4 |
| John | john.p@outlook.com | Boston, MA | High Value | 1 |
(2行)
SQLサブクエリの使用例:DELETE
サブクエリは、SQLのDELETE文と組み合わせることで、テーブルから特定の行や複数行を削除するためにも使用できます。
ここでは、前のセクションで別テーブルへ移し替えた高額購入顧客の注文データを、ordersテーブルから削除するコマンドを書いてみましょう。削除対象を特定するために、サブクエリを使用します。
DELETE FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE loyalty_plan = 'High Value');
このクエリにより、高額購入顧客の注文データがすべて削除されます。削除後のordersテーブルは次の通りです。
| id | item_name | cost | customer_id |
| 5 | Oak Chair | 100 | 3 |
(1行)
まとめ
SQLサブクエリとは、別のクエリの中に含まれるクエリのことです。サブクエリを使うことで、あるクエリの結果に基づいて別のクエリを実行でき、複数のクエリを1つにまとめて効率的に記述できます。サブクエリは、SQL文のHAVING句またはWHERE句の中に記述します。
サブクエリを活用すれば、他のクエリの結果に依存する処理をシンプルかつ可読性高く実装できます。このガイドでは、SQLサーバーでサブクエリを書く基本を解説し、さらにSELECT文・INSERT文・UPDATE文・DELETE文それぞれでのサブクエリの使用方法を具体例とともに紹介しました。
SQLのコーディングについてさらに学びたい方は、「SQLの学び方ガイド」もあわせてチェックしてみてください。SQL学習に関する専門家のアドバイスや、学習を継続するためのおすすめコース一覧を掲載しています。
-
【2024年最新】フォートナイト(Fortnite)のシステム要件を徹底解説|PC・Macの動作環境チェック完全ガイド
フォートナイト(Fortnite)は今や世界中で大人気のバトルロイヤルゲームですが、「自分のPCでも動くのか?」「このPCのスペックで快適にプレイできるのか?」という疑問を持つ方は少なくありません。一般的に、ゲームは通常のアプリケーションと比べて、メモリ(RAM)、CPU(プロセッサー)、グラフィックボード、DirectXなどに対する要求水準が高くなっています。 本記事では、以下の内容について詳しく解説します。 フォートナイトの最低動作環境とは? 推奨PCスペックはどれくらい? Macでのシステム要件は? おまけ:ドライバーとゲームコンポーネントの更新でフォートナイトを高速化する方法
-
Fitbit Pay完全ガイド:設定方法からお支払い・セキュリティ対策まで徹底解説
Fitbitは、最も優れたスマートウェアラブルデバイスのひとつです。多彩なモデルと豊富な機能を備えており、その中でも人気の高い機能が「Fitbit Pay」です。Fitbit IonicやFitbit Versaに搭載されたNFC(近距離無線通信)チップにより、非接触決済に対応したあらゆる店舗で、腕時計をつけたまま支払いが可能になります。 この記事では、Fitbit Payの使い方をマスターできるよう、設定方法からセキュリティ対策まで完全ガイドとして詳しく解説します。 Fitbit Payとは? Fitbit Payは、デビットカードやクレジットカードをFitbit IonicおよびVersa