【必読】SQLのサブクエリを丁寧に解説|基本から実例まで

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年5月)

✔以下の疑問をお持ちの方へ向けた記事です

「SQLのAS句とは何で、どのように使うのだろうか?」
「SQLのAS句の使い方を学びたい」
「SQLのAS句の具体的な使用例を見て理解したい」

✔この記事を読むことで得られる知識

  • SQLのAS句の基本的な使い方
  • AS句の応用法
  • SQLのAS句を用いた具体的な使用例

この記事では、SQLのAS句の基本的な使い方から、その応用法まで、具体的な例を交えて詳細に説明します。

ぜひ最後までお読みください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

SQLの基本操作とサブクエリの位置づけ

こちらでは、サブクエリを理解するための前提となるSQLの基本操作と、サブクエリの全体的な位置づけについて説明します。

これを理解することで、後述のサブクエリの具体的な使い方について理解しやすくなります。

  • SQLとは?
  • SQLでデータを取得する(SELECT文)
  • WHERE句を用いたデータの絞り込み
  • サブクエリとは?

SQLとは?

SQL(Structured Query Language)は、データベースの操作や管理を行うための言語です。

これを使うことで、データの挿入・削除・更新、そしてデータの取得といった操作が可能になります。

また、データの取得においては、条件を指定して特定のデータだけを取り出すといった複雑な操作も可能です。

これらの操作は、ウェブサイトの裏側で行われるデータベース操作や、ビジネスの現場でのデータ分析など、さまざまな場面で利用されています。

SQLでデータを取得する(SELECT文)

SQLでデータを取得するためには、SELECT文を用います。

SELECT文の基本的な形はこちら。

SELECT 列名 FROM テーブル名;

具体例はこちらです。

SELECT name FROM users;

usersテーブルからname列のデータを全て取得するというクエリになります。

また、列名の部分にアスタリスク(*)を用いると、全列のデータを取得します。

SELECT * FROM users;

WHERE句を用いたデータの絞り込み

取得するデータを特定の条件で絞り込む場合には、WHERE句を使います。

SELECT name FROM users WHERE age > 20;

usersテーブルから、age列の値が20より大きいレコードのname列のデータを取得します。

このように、WHERE句を使うことで、取得するデータを柔軟に絞り込めるのです。

サブクエリとは?

サブクエリ(副問い合わせ)とは、SQL文の中にさらにSQL文を埋め込むことで、より複雑なデータ操作をおこなうためのテクニックのこと。

具体的には、SELECT文やFROM句、WHERE句など、さまざまな場所で利用できます。

サブクエリを使うことで、ひとつのSQL文だけでは難しい、複数ステップにわたるデータ操作を一度に実行できるのです。

後述のセクションで、サブクエリの具体的な使い方や例を詳しく見ていきましょう。

サブクエリの基本

こちらでは、サブクエリの基本的な概念と使用方法について説明します。

サブクエリを自在に扱う基礎を身につけましょう。

  • サブクエリの書き方と基本的な使い方
  • サブクエリの結果の判定

サブクエリの書き方と基本的な使い方

サブクエリは、主要なSQL文の中に括弧()で囲まれた形で記述されます。

たとえば、次のようなSQL文は、サブクエリを用いたものです。

SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'Japan');

このSQL文は、「日本の顧客が注文したすべての注文を取得する」ことを意味します。

ここでは以下の()で囲われている部分が、サブクエリです。

SELECT customer_id FROM customers WHERE country = 'Japan'

サブクエリの結果の判定

サブクエリの結果は一般的には、3つの形式のうちどれかを取ります。

  • スカラーサブクエリ:ひとつの値を返す
  • リストサブクエリ:複数の値を返す
  • テーブルサブクエリ:テーブル形式の結果を返す

何を返したいかにより、サブクエリを使う場所や形式が異なるのです。

たとえば上記の例では、サブクエリが複数のcustomer_idを返すリストサブクエリとなります。

サブクエリとIN演算子を用いて、複数の値に対する比較をおこなう方法です。

サブクエリの応用

このセクションでは、サブクエリの具体的な使用方法について、詳しくお伝えします。

サブクエリのさまざまな使用方法を理解すれば、より複雑なデータ操作に取り組めるようになるでしょう。

  • FROM句で使う場合
  • WHERE句で使う場合
  • SELECT句で使う場合
  • HAVING句で使う場合
  • 相関サブクエリ

FROM句で使う場合

FROM句でのサブクエリは、一時テーブルを作成するのに役立ちます。

SELECT * FROM (SELECT * FROM orders WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31') as orders_2020

サブクエリを使って2020年の注文のみを含む一時テーブル(orders_2020)を作成し、その一時テーブルからすべてのデータを取得します。

WHERE句で使う場合

前述した例のように、WHERE句でのサブクエリは、特定の条件に基づいた値のリストを提供します。

これは、特定の条件を満たす行のみを選択するのに非常に役立ちます。

SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country = 'Japan');

SELECT句で使う場合

SELECT句でのサブクエリは、他の行やテーブルに基づいて計算された値を提供します。

SELECT customer_id, (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) as order_count FROM customers;

各顧客が何回注文したかを計算しています。

SELECT文について、詳しく以下の記事で解説しています。

HAVING句で使う場合

HAVING句でのサブクエリも可能ですが、これはGROUP BYを用いたクエリで集計後の結果に対する条件を指定する場合に使います。

たとえば、各顧客の注文数が平均注文数以上の顧客を探すクエリなどに使用します。

SELECT customer_id, COUNT(*) AS order_count
FROM Orders
GROUP BY customer_id
HAVING COUNT(*) >= (
    SELECT AVG(order_count)
    FROM (
        SELECT customer_id, COUNT(*) AS order_count
        FROM Orders
        GROUP BY customer_id
    ) AS Subquery
);

HAVING句についてはこちらをどうぞ。

相関サブクエリ

相関サブクエリは、外部のクエリに依存するサブクエリです。

つまり、サブクエリの中の一部が外部のクエリの列を参照します。

SELECT customers.customer_name, (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) as order_count FROM customers;

各顧客ごとにサブクエリが実行され、その顧客の注文数を計算します。

サブクエリの注意点とトラブルシューティング

次のセクションでは、サブクエリの性能と最適化、トラブルシューティングについて説明します。

ブクエリを効率的に使用する方法だけでなく、問題が発生した際の対処法を理解いただけるでしょう。

  • サブクエリの性能と最適化
  • サブクエリの一般的なエラーとその対処法

サブクエリの性能と最適化

サブクエリは便利なツールではありますが、使用する際には性能面での注意が必要です。

大量のデータを処理する場合や相関サブクエリを使用する場合は、パフォーマンスが大幅に低下する可能性があります。

以下などと併用し、適切な最適化手法を選択することが重要です。

  • インデックスの使用
  • クエリの改善
  • 必要に応じてJOINを使用

サブクエリの一般的なエラーとその対処法

サブクエリを使用する際には、一般的なエラーに対する理解が必要です。

例えば、「サブクエリが複数の行を返す」、「サブクエリがNULLを返す」などのエラーがあります。

それぞれのエラーの原因と対処法を理解することで、サブクエリを効率的に使用するための知識を深めることができます。

サブクエリとJOINの比較

このセクションでは、サブクエリとJOINの比較について解説します。

SQLには複数のテーブルからデータを取得する方法のうち、とくに利用頻度が高いのがサブクエリとJOINです。

どちらを使用すべきかは、求める結果とパフォーマンスによります。

  • JOINの基本とサブクエリとの関係
  • サブクエリとJOINの使い分け

JOINの基本とサブクエリとの関係

JOINとは、2つ以上のテーブルを特定の条件で結合する操作のことを指します。

サブクエリとJOINは、いずれも複数のテーブルからデータを取得するための手段ですが、処理の仕方が大きく異なります。

サブクエリは主にデータのフィルタリングや値の取得に使われるのに対し、JOINはテーブル間の関連性を明確に示しながらデータを結合します。

サブクエリとJOINの使い分け

サブクエリとJOINのどちらを使用するかは、問題の性質とパフォーマンスによります。

一般的に、同じ結果を得られる場合でも、JOINの方が高速に処理できることが多いです。

しかし、相関サブクエリのように、JOINだけでは解決できない問題を扱う場合もあります。

また、クエリの可読性や保守性を考慮すると、一部のケースではサブクエリの方が適している場合もあります。

実践!サブクエリを使ったクエリ作成

ここでは、実際にサブクエリを使ってデータを操作する具体的な課題を提供します。

実際のデータ操作においてサブクエリがどのように機能するかを理解して、その活用方法を身につけましょう。

  • 実習課題1:基本的なサブクエリの使用
  • 実習課題2:HAVING句でのサブクエリ
  • 実習課題3:相関サブクエリの使用

実習課題1:基本的なサブクエリの使用

初めての実習課題として、最も基本的なサブクエリの使用方法を学びます。

想定する問題は次のとおりです。

「顧客テーブル(customer)と注文テーブル(orders)があり、顧客ごとの最新の注文情報を取得したい。」

この問題を解決するため、サブクエリを利用したSQLを書いてみましょう。

SELECT
  c.customer_id,
  c.customer_name,
  o.order_id,
  o.order_date
FROM
  customer c
  INNER JOIN orders o ON c.customer_id = o.customer_id
WHERE
  o.order_date = (
    SELECT
      MAX(order_date)
    FROM
      orders
    WHERE
      customer_id = c.customer_id
  );

実習課題2:HAVING句でのサブクエリ

2つ目の実習課題では、HAVING句でのサブクエリの使用方法を学びます。

想定する問題は次のとおりです。

「顧客テーブル(customer)と注文テーブル(orders)があり、平均注文額が全体の平均を超える顧客のみを取得したい。」

この問題を解決するため、サブクエリを利用したSQLを書いてみましょう。

SELECT
  c.customer_id,
  c.customer_name,
  AVG(o.order_amount) AS avg_order_amount
FROM
  customer c
  INNER JOIN orders o ON c.customer_id = o.customer_id
GROUP BY
  c.customer_id,
  c.customer_name
HAVING
  AVG(o.order_amount) > (
    SELECT
      AVG(order_amount)
    FROM
      orders
  );

実習課題3:相関サブクエリの使用

最後の実習課題では、相関サブクエリの使用方法について学びます。

想定する問題は次のとおりです。

「商品テーブル(products)と注文テーブル(orders)があり、各商品が初めて注文された日付を取得したい。」

この問題を解決するため、相関サブクエリを利用したSQLを書いてみましょう。

SELECT
  p.product_id,
  p.product_name,
  MIN(o.order_date) AS first_order_date
FROM
  products p
  INNER JOIN orders o ON p.product_id = o.product_id
GROUP BY
  p.product_id,
  p.product_name;

まとめ

当記事では、以下を学びました。

  • サブクエリの基本的な概念
  • 具体的な使い方
  • クエリ作成の実践
  • サブクエリとJOINの使い分け
  • サブクエリの注意点とトラブルシューティング

サブクエリを覚えると、SQLでのコーディングの幅が広がります。

よく使われる方法のひとつなので、必ず覚えましょう。

わからない方は当記事を何度が読み直し、以下のようなサイトで手を動かしながら学ぶのがおすすめです。

SQL Fiddle - Online SQL Compiler for learning & practice
Discover our free online SQL editor enhanced with AI to chat, explain, and generate code. Support SQL Server, MySQL, Mar...
タイトルとURLをコピーしました