SQL - サブクエリ
こんにちは、SQLの熱心な学習者さんたち!今回は、SQLのサブクエリの世界に踏み込む興奮する旅のガイドをお手伝いします。コンピュータサイエンスを多年間教えてきた者として、サブクエリはあなたのSQLスキルをgoodからgreatに引き上げる秘密の調味料のようなものだと言えます。それでは、一緒にサブクエリの神秘を解き明かしましょう!
SQL サブクエリ
サブクエリとは?
サンドイッチを作るとき、パンがメインのクエリですが、それを本当に美味しくするのは中の具材です。それがサブクエリです!SQLの言葉で言えば、サブクエリは他のクエリの中に埋め込まれたクエリです。質問の中に質問をすることで、単一のクエリでは不可能な複雑な操作を行うことができます。
簡単な例を見てみましょう:
SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');
このクエリでは、括弧の中の部分がサブクエリです。マーケティング部門のdepartment_idを探し出し、それを外側のクエリが使用してその部門の全従業員を探します。
遵守すべき規則
深く掘り下げる前に、サブクエリを使用する際の重要な規則をいくつかおさらいしましょう:
- サブクエリは括弧で囲む必要があります。
- サブクエリのSELECT句は通常一つの列しか返さない、除非主クエリに複数の列が比較される場合。
- ORDER BY命令はサブクエリでは使用できませんが、主クエリでは使用できます。
- 複数行を返すサブクエリは、IN演算子などの複数値演算子と一緒に使用する必要があります。
以下の表にこれらの規則をまとめました:
规則 | 説明 |
---|---|
括弧 | サブクエリは括弧で囲む |
単一列 | サブクエリのSELECTは通常一つの列を返す |
ORDER BY不可 | ORDER BYはサブクエリでは使用不可 |
複数行 | 複数行を返すサブクエリは複数値演算子を使用 |
SELECT 文とサブクエリ
サブクエリは最も一般的にSELECT文で使用されます。動的な条件に基づいてデータを取得するのに非常に強力です。もっと複雑な例を見てみましょう:
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
このクエリは、全商品の平均価格よりも高い価格を持つすべての商品を選択します。サブクエリは平均価格を計算し、主クエリはこの結果を使って商品をフィルタリングします。
以下はSELECT句内でサブクエリを使用する別の例です:
SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;
このクエリは、各従業員の名前と給料だけでなく、全従業員の平均給料も各行に含めています。各従業員のためのミニレポートのようです!
INSERT 文とサブクエリ
サブクエリはINSERT文でも使用して、テーブルに他のテーブルからのデータを populate することができます。以下はその例です:
INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);
このクエリは、平均給料の1.5倍以上の給料を持つすべての従業員をhigh_salary_employeesテーブルに挿入します。優れた従業員のVIPリストを作成するようなものです!
UPDATE 文とサブクエリ
サブクエリを使うとUPDATE文がもっと強力になります。以下はその例です:
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
このクエリは、電子機器カテゴリのすべての商品の価格を10%増加させます。サブクエリは「電子機器」カテゴリのcategory_idを探し出し、それを主クエリが使用して正しい商品を更新します。
DELETE 文とサブクエリ
最後に、DELETE文でサブクエリを使用する例を見てみましょう:
DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);
このクエリは、最後の注文が1年以内にない顧客のすべての注文を削除します。サブクエリはそのような顧客を探し出し、主クエリはその注文を削除します。
そして、ここまでがサブクエリの世界の旅です!基本的な概念からより高度な応用までを一緒に旅しました。実践が斯達を磨く、 therefore 自分のデータベースでこれらのクエリを試してみてください。
いつも私の生徒たちに言うように、SQLはスイスアーミーナイフのようで、サブクエリはその隠された刃のように、困難な状況から抜け出すことができます。 therefore 探索を続け、クエリを続け、最も重要なことは学びを続けましょう!
Credits: Image by storyset