SQLテーブルの基礎から実践的な使い方まで、具体的なコード例を交えて解説します。データベース初心者でも理解できる内容から、実務で使える応用まで、どのように活用できるのでしょうか?
SQLの主問合せと副問合せで実現する高度なデータ抽出の技法
SQLの主問合せと副問合せの基本から応用まで、実践的なコード例を交えて解説します。複雑なデータ抽出をシンプルに実現できる副問合せ、どのように活用すればよいのでしょうか?
副問合せは、SQL文の中に別のSELECT文を含める形で記述します。基本的な構文は以下のようになります:
SELECT カラム名
FROM テーブル名
WHERE カラム名 演算子 (SELECT カラム名 FROM テーブル名 [WHERE 条件式])
この構文では、括弧内のSELECT文(副問合せ)が先に実行され、その結果を使って外側のSELECT文(主問合せ)が実行されます。
単一行副問合せは、1つの値のみを返す副問合せです。以下のような場合に使用します:
SELECT name, score
FROM students
WHERE score > (SELECT AVG(score) FROM students)
このクエリでは、全体の平均点より高い点数を取った生徒を抽出しています。
比較演算子として使用できるものは:
複数行副問合せでは、複数の値を返す副問合せに対して特別な演算子を使用します:
SELECT department_name
FROM departments
WHERE department_id IN (
SELECT department_id
FROM employees
WHERE salary > 10000
)
主な演算子:
相関副問合せは、主問合せと副問合せが相互に関連する形式です:
SELECT e1.employee_name, e1.salary
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
)
この例では、各従業員の給与を、その従業員が所属する部門の平均給与と比較しています。
副問合せを効率的に使用するためのポイント:
-- 非効率な例
SELECT *
FROM orders o
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE country = 'Japan'
)
-- 効率的な例
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.country = 'Japan'
これらの最適化により、クエリのパフォーマンスを大幅に向上させることができます。