SQLiteは軽量で扱いやすいデータベースとして、多くの場面で利用されています。
その中でも少し高度な技術として登場するのが「サブクエリ」です。
サブクエリとは、SQL文の中に含まれる別のSELECT文のことで、条件の絞り込みや集計などに活用されます。
この記事では、SQLiteにおけるサブクエリの基本から実践的な使い方まで、初心者にもわかりやすく解説していきます。
サブクエリとは?その役割と基本文法
サブクエリ(Subquery)は、あるSELECT文の中で別のSELECT文をネストして使うテクニックです。
基本的な書き方は以下のようになります。
SELECT カラム名 FROM テーブル名
WHERE カラム名 = (SELECT カラム名 FROM テーブル名 WHERE 条件);
サブクエリは以下の3つの主要な場面で使われます。
- WHERE句の中で使う
- FROM句の中で使う
- SELECT句の中で使う
それぞれの使い方について、次のセクションで詳しく見ていきましょう。
WHERE句で使うサブクエリの使い方
最も基本的でよく使われるパターンが「WHERE句内で使う」サブクエリです。
例1:特定の値を条件に使う
SELECT name FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = '営業');
この例では、部署名が「営業」のIDを取得し、それと一致する社員の名前を表示します。
サブクエリが「フィルター条件」として使われている典型例です。
例2:IN句との組み合わせ
SELECT name FROM products
WHERE category_id IN (SELECT id FROM categories WHERE parent_id = 1);
複数の値に一致させたいときは、IN
句との併用が便利です。
FROM句で使うサブクエリの使い方
サブクエリを「仮想テーブル」として扱いたいときは、FROM句内で使います。
SELECT avg_salary.department, avg_salary.avg
FROM (
SELECT department_id AS department, AVG(salary) AS avg
FROM employees
GROUP BY department_id
) AS avg_salary;
この例では、部署ごとの平均給与を計算するサブクエリを仮想テーブルとして使い、その結果を外側のSELECTで利用しています。
この方法は、複雑な集計処理などで非常に便利です。
SELECT句で使うサブクエリの使い方
やや高度な使い方になりますが、SELECT句の中でサブクエリを使うことも可能です。
SELECT name,
(SELECT COUNT(*) FROM sales WHERE sales.employee_id = employees.id) AS sales_count
FROM employees;
この例では、各社員が担当した売上件数を取得しています。
サブクエリが「列」として機能する点がポイントです。
相関サブクエリとの違いとは?
ここまでに紹介したサブクエリは「非相関サブクエリ」です。
一方で、外側のクエリの情報を参照する「相関サブクエリ」もあります。
SELECT name
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
この例では、各部署内の平均給与と比較して、高い給料をもらっている社員だけを抽出しています。e.department_id
のように外側のクエリの値を内側で参照している点が、相関サブクエリの特徴です。
サブクエリを使うときの注意点
サブクエリは便利な一方で、パフォーマンスや可読性に影響を与えることもあります。
- サブクエリが複雑になりすぎると読みにくくなる
- INやEXISTSの使い方次第で処理速度に差が出る
- 相関サブクエリは行ごとに実行されるため、遅くなりやすい
可能であれば、ビューやJOINなど他の手段も検討しましょう。
実践例:売上が最も高い商品を表示する
SELECT name, price
FROM products
WHERE price = (SELECT MAX(price) FROM products);
このクエリでは、最も高価な商品を1つだけ取得しています。
このように、サブクエリは「最大値」や「最小値」などの計算結果を条件に使うのにも適しています。
実践例:売上が平均より高い商品を抽出
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
このようなサブクエリを使えば、「平均より上」の値を持つデータだけを取り出すことも可能です。
おわりに:サブクエリを使いこなして効率的なSQLを書こう
SQLiteにおけるサブクエリは、シンプルなクエリでは対応できない複雑な条件や集計を可能にする強力な機能です。
WHERE句、FROM句、SELECT句など、状況に応じて柔軟に使い分けることで、よりスマートなSQLを書くことができます。
ただし、複雑なサブクエリはパフォーマンスや可読性に影響する場合があるため、JOINやビューとの使い分けも意識しましょう。
この記事を参考に、あなたのSQLスキルを一段レベルアップさせてみてください。