WHERE 절에서 하위 쿼리 작성
이 단계에서는 SQL 쿼리의 WHERE 절 내에서 서브쿼리를 사용하는 방법을 배우게 됩니다. 서브쿼리는 내부 쿼리 또는 중첩 쿼리라고도 하며, 다른 쿼리 내에 포함된 쿼리입니다. 서브쿼리는 메인 쿼리에서 검색할 데이터를 추가로 제한하는 조건으로 사용될 데이터를 반환하는 데 사용됩니다.
WHERE 절에서 서브쿼리 이해하기
WHERE 절의 서브쿼리는 일반적으로 열의 값을 서브쿼리의 결과와 비교하는 데 사용됩니다. 서브쿼리가 먼저 실행되고, 그 결과는 외부 쿼리에서 사용됩니다.
기본 구문:
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)는 값 집합을 반환합니다. 그런 다음 외부 쿼리는 table_name에서 column_name이 해당 집합에 있는 행을 선택합니다.
시나리오:
employees 및 departments의 두 테이블이 있다고 가정해 보겠습니다. employees 테이블에는 employee_id, employee_name, department_id를 포함한 직원 정보가 포함되어 있습니다. departments 테이블에는 department_id 및 department_name을 포함한 부서 정보가 포함되어 있습니다.
'Sales' 부서에서 근무하는 모든 직원을 찾고 싶습니다.
1 단계: 테이블 생성 및 데이터 삽입
먼저 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 단계: 서브쿼리 작성
이제 WHERE 절에서 서브쿼리를 사용하여 'Sales' 부서에서 근무하는 모든 직원을 찾는 쿼리를 작성해 보겠습니다.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
설명:
- 서브쿼리
(SELECT department_id FROM departments WHERE department_name = 'Sales')는 department_name이 'Sales'인 departments 테이블에서 department_id를 선택합니다. 이 경우 1을 반환합니다.
- 외부 쿼리는 서브쿼리에서 반환된 집합 (단지
1임) 에 department_id가 있는 employees 테이블에서 employee_name을 선택합니다.
3 단계: 쿼리 실행 및 결과 보기
psql 터미널에서 쿼리를 실행합니다. 다음 출력이 표시되어야 합니다.
employee_name
---------------
Alice
Charlie
(2 rows)
이는 Alice 와 Charlie 가 'Sales' 부서에서 근무하는 직원임을 보여줍니다.
4 단계: 서브쿼리와 함께 EXISTS 사용하기
WHERE 절에서 서브쿼리를 사용하는 또 다른 방법은 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 연산자를 사용합니다.
설명:
- 서브쿼리
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales'는 'Sales'라는 이름의 부서가 현재 직원의 department_id와 동일한 department_id를 가지고 있는지 확인합니다.
- 서브쿼리가 행을 반환하면 (즉, 동일한
department_id를 가진 'Sales' 부서가 있는 경우) EXISTS 연산자는 true 를 반환하고 직원의 이름이 선택됩니다.
psql 터미널에서 쿼리를 실행합니다. 이전과 동일한 출력이 표시되어야 합니다.
employee_name
---------------
Alice
Charlie
(2 rows)
이제 WHERE 절에서 서브쿼리를 사용하여 다른 테이블의 조건을 기반으로 데이터를 성공적으로 필터링했습니다. 또한 서브쿼리와 함께 EXISTS 연산자를 사용하는 방법을 배웠습니다.