WHERE 句でサブクエリを作成する
このステップでは、SQL クエリの WHERE 句内でサブクエリを使用する方法を学びます。サブクエリは、内部クエリまたはネストされたクエリとも呼ばれ、別のクエリの中に埋め込まれたクエリです。サブクエリは、取得するデータをさらに制限するための条件として、メインクエリで使用されるデータを返すために使用されます。
WHERE 句におけるサブクエリの理解 (Understanding Subqueries in the WHERE Clause)
WHERE 句のサブクエリは通常、カラムの値をサブクエリの結果と比較するために使用されます。サブクエリが最初に実行され、その結果が外部クエリで使用されます。
基本的な構文 (Basic Syntax):
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
ここで、サブクエリ (SELECT column_name FROM another_table WHERE condition) は値のセットを返します。外部クエリは、column_name がそのセットに含まれる table_name から行を選択します。
シナリオ (Scenario):
employees と departments の 2 つのテーブルがあると仮定します。employees テーブルには、employee_id、employee_name、department_id などの従業員に関する情報が含まれています。departments テーブルには、department_id や department_name などの部署に関する情報が含まれています。
「Sales」部署で働くすべての従業員を見つけたいとします。
ステップ 1: テーブルの作成とデータの挿入 (Step 1: Create the Tables and Insert Data)
まず、postgres ユーザーを使用して PostgreSQL データベースに接続します。
sudo -u postgres psql
次に、departments テーブルを作成します。
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
サンプルデータを departments テーブルに挿入します。
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
次に、employees テーブルを作成します。
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
サンプルデータを employees テーブルに挿入します。
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
ステップ 2: サブクエリの作成 (Step 2: Write the Subquery)
次に、WHERE 句でサブクエリを使用して、「Sales」部署で働くすべての従業員を見つけるクエリを作成します。
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
説明 (Explanation):
- サブクエリ
(SELECT department_id FROM departments WHERE department_name = 'Sales') は、department_name が「Sales」である departments テーブルから department_id を選択します。この場合、1 が返されます。
- 外部クエリは、サブクエリによって返されたセット (この場合は
1 のみ) に department_id が含まれる employees テーブルから employee_name を選択します。
ステップ 3: クエリの実行と結果の表示 (Step 3: Execute the Query and View the Results)
psql ターミナルでクエリを実行します。次の出力が表示されます。
employee_name
---------------
Alice
Charlie
(2 rows)
これは、Alice と Charlie が「Sales」部署で働く従業員であることを示しています。
ステップ 4: EXISTS を使用したサブクエリ (Step 4: Using EXISTS with Subqueries)
WHERE 句でサブクエリを使用するもう 1 つの方法は、EXISTS 演算子を使用することです。EXISTS 演算子は、サブクエリ内の行の存在をテストします。サブクエリが行を返す場合は true を返し、それ以外の場合は false を返します。
EXISTS を使用して同じ結果を達成する例を次に示します。
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Sales'
);
このクエリは、前のクエリと同じ結果を達成しますが、IN の代わりに EXISTS 演算子を使用します。
説明 (Explanation):
- サブクエリ
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales' は、現在の従業員と同じ department_id を持つ「Sales」という名前の部署があるかどうかを確認します。
- サブクエリが行を返す場合 (つまり、同じ
department_id を持つ「Sales」部署がある場合)、EXISTS 演算子は true を返し、従業員の名前が選択されます。
psql ターミナルでクエリを実行します。以前と同じ出力が表示されます。
employee_name
---------------
Alice
Charlie
(2 rows)
これで、WHERE 句でサブクエリを使用して、別のテーブルの条件に基づいてデータをフィルタリングすることに成功しました。また、サブクエリで EXISTS 演算子を使用する方法も学びました。