この記事では、OracleデータベースのDML (Data Manipulation Language) 操作において副問い合わせ(サブクエリ)を使用する方法について解説します。DML操作とは、データの挿入 (INSERT)、更新 (UPDATE)、削除 (DELETE) の操作のことです。
副問い合わせは、1つのSQL文の中で別のSQL文を使用してデータを取得する方法です。これにより、より柔軟で高度なデータ操作が可能になります。
この記事を読むことで、以下のことが分かります。
- 副問い合わせの基本的な使い方
- INSERT、UPDATE、DELETE文への応用例
- 実用的なビジネスシナリオでの活用方法
使用する表として、employees 表と departments 表を作成し、これらを例に副問い合わせを使用したDML操作を説明します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
使用する表の作成
以下の employees 表と departments 表を使用します。これらの表は、従業員と部門に関するデータを管理するものと想定します。
departments 表の作成とデータ挿入
departments 表は、部門IDと部門名を管理します。
CREATE TABLE departments (
department_id NUMBER PRIMARY KEY,
department_name VARCHAR2(50) NOT NULL
);
INSERT INTO departments (department_id, department_name) VALUES (10, 'Sales');
INSERT INTO departments (department_id, department_name) VALUES (20, 'Engineering');
INSERT INTO departments (department_id, department_name) VALUES (30, 'HR');
employees 表の作成とデータ挿入
employees 表は、従業員の情報を管理します。
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
employee_name VARCHAR2(50) NOT NULL,
salary NUMBER(10, 2),
department_id NUMBER,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
INSERT INTO employees (employee_id, employee_name, salary, department_id) VALUES (1, 'Alice', 5000, 10);
INSERT INTO employees (employee_id, employee_name, salary, department_id) VALUES (2, 'Bob', 6000, 20);
INSERT INTO employees (employee_id, employee_name, salary, department_id) VALUES (3, 'Charlie', 5500, 10);
INSERT INTO employees (employee_id, employee_name, salary, department_id) VALUES (4, 'David', 7000, 20);
INSERT INTO employees (employee_id, employee_name, salary, department_id) VALUES (5, 'Eve', 4500, 30);
INSERT文に副問い合わせを使用する
他の表のデータを基にデータを挿入する場合、INSERT文に副問い合わせを使用できます。
例1: 別の表からデータを挿入する
以下の例では、employees 表から Sales 部門 (department_id = 10) の従業員を、給与が5000以上の従業員のみ high_salary_employees 表に挿入します。
high_salary_employees 表の作成
CREATE TABLE high_salary_employees (
employee_id NUMBER PRIMARY KEY,
employee_name VARCHAR2(50),
salary NUMBER(10, 2)
);
INSERT文の実行
INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE department_id = 10 AND salary >= 5000;
この例では、副問い合わせによって employees 表から条件を満たすデータを取得し、それを新しい表に挿入しています。
UPDATE文に副問い合わせを使用する
UPDATE文に副問い合わせを使用することで、他の表の情報を基にデータを更新できます。
例2: 他の表のデータを基に従業員の給与を更新する
以下の例では、departments 表の部門名が Engineering の従業員の給与を、employees 表内の最大給与に更新します。
UPDATE employees
SET salary = (SELECT MAX(salary) FROM employees)
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Engineering');
このSQL文では、副問い合わせを使用して Engineering 部門の department_id を取得し、その部門に属する従業員の給与を最大給与に更新しています。
DELETE文に副問い合わせを使用する
DELETE文に副問い合わせを使用すると、他の表の情報を基に特定のレコードを削除できます。
例3: 別の表の条件を基にデータを削除する
以下の例では、departments 表の部門名が HR の従業員を employees 表から削除します。
DELETE FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'HR');
このSQL文では、副問い合わせを使用して HR 部門の department_id を取得し、その部門に属する従業員を削除しています。
実用的なシナリオ
- 報告書の生成: 他の表の情報を基に条件を満たすデータを収集し、新しい表を作成。
- データ修正: 部門や条件に応じて給与やステータスを変更。
- メンテナンス: 古いデータや不要なデータを他の条件と照合して削除。
まとめ
DML文に副問い合わせを使用することで、他の表の情報を基に柔軟なデータ操作が可能になります。INSERT、UPDATE、DELETEそれぞれの操作で副問い合わせを活用することで、効率的かつ動的なデータ管理が実現できます。
この記事で紹介した例を基に、自分の環境で試してみてください。また、副問い合わせを組み合わせたさらに高度なクエリについても学習を進めてみましょう!
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント