DBMS/개념

18_ 조인(Join)과 서브쿼리(Subquery)

seungwon-1 2025. 10. 14. 16:09

1. 조인 (Join)

조인은 두 개 이상의 테이블을 공통된 컬럼(키) 을 기준으로 묶어서 하나의 결과로 보여주는 방법이다.
데이터베이스에서 가장 많이 사용되는 연산 중 하나다.

 

 

ㅇ 주요 조인 종류

종류 설명

INNER JOIN 양쪽 테이블에서 공통된 데이터만 조회
LEFT OUTER JOIN 왼쪽 테이블의 모든 데이터 + 오른쪽 테이블의 일치하는 데이터
RIGHT OUTER JOIN 오른쪽 테이블의 모든 데이터 + 왼쪽 테이블의 일치하는 데이터
FULL OUTER JOIN 양쪽 테이블의 모든 데이터를 합침 (일치하지 않아도 포함)
CROSS JOIN 두 테이블의 모든 행을 조합 (카테시안 곱)
SELF JOIN 같은 테이블을 자기 자신과 조인

 

예제: INNER JOIN

 
SELECT e.employee_id, e.first_name, d.department_name
FROM employees e
INNER JOIN departments d
    ON e.department_id = d.department_id;
  • employees 테이블과 departments 테이블을 조인해서
    직원의 이름과 소속 부서를 함께 출력한다.
  • ON 절에서 조인의 기준 컬럼(department_id)을 지정한다.

예제: LEFT OUTER JOIN

SELECT e.first_name, d.department_name
FROM employees e
LEFT JOIN departments d
    ON e.department_id = d.department_id;
  • 부서가 없는 직원도 누락되지 않고 모두 조회된다.
  • 조인 대상이 없는 경우 NULL 값으로 표시된다.

 

2. 서브쿼리 (Subquery)

서브쿼리(Subquery) 는 말 그대로 쿼리 안의 쿼리다.
하나의 SELECT 문 안에서 또 다른 SELECT 문을 실행해서, 그 결과를 기준으로 메인 쿼리가 동작하게 만든다.

서브쿼리의 주요 형태

구분설명
단일 행 서브쿼리 결과가 1개의 값만 반환될 때 (=, <, >, <=, >= 사용 가능)
다중 행 서브쿼리 결과가 여러 개일 때 (IN, ANY, ALL 등과 함께 사용)
상관 서브쿼리 (Correlated Subquery) 외부 쿼리의 값을 내부 쿼리에서 참조하는 형태

예제 1: 단일 행 서브쿼리

SELECT first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
  • 전체 직원의 평균 급여보다 높은 급여를 받는 직원을 조회한다.
  • 괄호 안의 SELECT 문이 먼저 실행된 뒤, 그 결과값이 메인 쿼리의 조건에 사용된다.

예제 2: 다중 행 서브쿼리

SELECT first_name, department_id
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
  • location_id가 1700인 부서에 속한 모든 직원을 출력한다.
  • 서브쿼리가 여러 개의 부서 ID를 반환하므로 IN을 사용한다.

3. 조인 vs 서브쿼리 — 언제 어떤 걸 쓸까?

구분특징
조인(Join) 여러 테이블의 데이터를 하나의 결과로 합칠 때 적합
서브쿼리(Subquery) 조건에 따라 특정 데이터를 필터링하거나 비교할 때 유용
성능 측면 조인이 일반적으로 더 빠름 (하지만 상황에 따라 다름)
가독성 서브쿼리는 논리적으로 명확하지만 복잡해질 수 있음

실무에서는 조인과 서브쿼리를 적절히 섞어서 사용한다.
특히 데이터 분석 쿼리에서는 조인으로 결합 → 서브쿼리로 조건 제어 하는 패턴이 많다.

'DBMS > 개념' 카테고리의 다른 글

20_ 서브쿼리  (0) 2025.10.18
19_ 조인(Join)  (0) 2025.10.16
17_ 뷰(view)  (0) 2025.10.11
16_ 트랜잭션 (Transaction)  (0) 2025.10.09
15_ 인덱스(Index)  (0) 2025.10.07