정보처리기사 SQL 조인 & 서브쿼리: 실기 합격 마스터!

2026. 1. 29. 08:45·정보처리기사



정보처리기사 실기 시험, SQL 문제만 보면 머리가 지끈거리시나요? 복잡한 데이터를 여러 테이블에서 조합하거나 특정 조건에 따라 걸러내는 작업은 데이터베이스 활용의 핵심 역량입니다. 특히 `JOIN`과 `SUBQUERY`는 관계형 데이터베이스에서 데이터를 다루는 가장 기본적인 동시에 강력한 도구로, 실기 시험에서도 빈번하게 출제되는 단골 주제입니다.

이 글을 통해 `JOIN`과 `SUBQUERY`의 기본 개념부터 실제 활용 예시까지 완벽하게 파헤쳐, 정보처리기사 실기 합격은 물론 효율적인 데이터 처리 능력을 한 단계 업그레이드할 수 있도록 도와드립니다.




## SQL 조인(JOIN) 완벽 이해하기: 테이블 간의 연결 고리

관계형 데이터베이스에서는 데이터의 중복을 줄이고 효율적으로 관리하기 위해 여러 테이블로 데이터를 분리하여 저장합니다. 이때, 서로 다른 테이블에 분리된 데이터를 조건에 따라 하나의 결과로 합쳐서 조회할 때 사용하는 것이 바로 `JOIN`입니다. `JOIN`은 데이터베이스의 핵심 기능이자 정보처리기사 실기에서 가장 중요한 SQL 문법 중 하나입니다.

`JOIN`을 설명하기 위해 다음 두 개의 테이블을 사용하겠습니다.

DEPT_NO DEPT_NAME LOCATION
10 인사부 서울
20 개발부 경기
30 영업부 부산
40 기획부 서울



EMP_NO ENAME DEPT_NO SALARY
101 김철수 10 3000
102 이영희 20 3500
103 박민수 20 4000
104 최지혜 30 3200
105 정대호 50 2800



`DEPT` 테이블은 부서 정보를, `EMP` 테이블은 사원 정보를 담고 있으며, `DEPT_NO` 컬럼을 통해 서로 연결됩니다.

###


1. INNER JOIN (내부 조인)




- **설명**: 두 테이블에서 `ON` 절의 조인 조건에 일치하는 행들만 반환합니다. 가장 일반적인 조인 형태이며, 교집합이라고 생각하면 이해하기 쉽습니다.




- **예시**: 각 사원의 이름과 그 사원이 속한 부서 이름을 함께 조회해봅니다.

```sql
SELECT E.ENAME, D.DEPT_NAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO;
```




- **결과**: '정대호' 사원은 DEPT_NO 50에 속하지만, DEPT 테이블에는 DEPT_NO 50이 없으므로 조회되지 않습니다. '기획부' (DEPT_NO 40) 또한 일치하는 사원이 없으므로 조회되지 않습니다.

###


2. LEFT JOIN (LEFT OUTER JOIN, 왼쪽 외부 조인)




- **설명**: 왼쪽 테이블(`FROM` 절에 먼저 오는 테이블)의 모든 행을 반환하고, 오른쪽 테이블에서는 `ON` 절의 조인 조건에 일치하는 행들만 반환합니다. 만약 오른쪽 테이블에 일치하는 행이 없으면, 해당 컬럼들은 `NULL`로 표시됩니다.




- **예시**: 모든 부서의 이름과 해당 부서에 속한 사원의 이름을 조회합니다. (사원이 없는 부서도 모두 포함)

```sql
SELECT D.DEPT_NAME, E.ENAME
FROM DEPT D LEFT JOIN EMP E
ON D.DEPT_NO = E.DEPT_NO;
```




- **결과**: '기획부'는 일치하는 사원이 없지만, 왼쪽 테이블인 DEPT에 존재하므로 조회되며, ENAME은 `NULL`로 표시됩니다.

###


3. RIGHT JOIN (RIGHT OUTER JOIN, 오른쪽 외부 조인)




- **설명**: `LEFT JOIN`과 반대로, 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서는 `ON` 절의 조인 조건에 일치하는 행들만 반환합니다. 일치하는 행이 없으면 `NULL`로 표시됩니다.




- **예시**: 모든 사원의 이름과 그 사원이 속한 부서 이름을 조회합니다. (부서 정보가 없는 사원도 모두 포함)

```sql
SELECT E.ENAME, D.DEPT_NAME
FROM EMP E RIGHT JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO;
```




- **결과**: 이 예시에서는 DEPT가 오른쪽 테이블이 되므로, LEFT JOIN 예시와 동일한 결과가 나옵니다. 만약 EMP 테이블이 오른쪽 테이블이라면, '정대호' 사원이 조회되고 DEPT_NAME은 `NULL`로 표시될 것입니다. `RIGHT JOIN`은 사실 `LEFT JOIN`의 테이블 순서만 바꾸면 동일한 결과를 얻을 수 있어 활용 빈도는 `LEFT JOIN`보다 적습니다.

###


4. FULL OUTER JOIN (전체 외부 조인)




- **설명**: 두 테이블의 모든 행을 반환합니다. `ON` 절의 조인 조건에 일치하는 행은 함께 표시되고, 일치하지 않는 행은 다른 테이블의 컬럼들이 `NULL`로 표시됩니다. 합집합과 유사합니다. (참고: MySQL은 `FULL OUTER JOIN`을 직접 지원하지 않으며, `LEFT JOIN`과 `RIGHT JOIN`의 `UNION`으로 구현해야 합니다.)




- **예시**: 모든 부서와 모든 사원을 연결하여 조회합니다.

```sql
-


- MySQL에서는 다음과 같이 LEFT JOIN과 RIGHT JOIN을 UNION으로 결합하여 사용
SELECT E.ENAME, D.DEPT_NAME
FROM EMP E LEFT JOIN DEPT D ON E.DEPT_NO = D.DEPT_NO
UNION
SELECT E.ENAME, D.DEPT_NAME
FROM EMP E RIGHT JOIN DEPT D ON E.DEPT_NO = D.DEPT_NO
WHERE E.DEPT_NO IS NULL; -


- 중복 제거를 위해 RIGHT JOIN에서 왼쪽(EMP)에 없는 데이터만 추가
```
(Oracle, PostgreSQL 등에서는 직접 `FULL OUTER JOIN` 사용 가능)

```sql
SELECT E.ENAME, D.DEPT_NAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO;
```




- **결과**: '정대호' 사원의 DEPT_NAME은 `NULL`로, '기획부'의 ENAME은 `NULL`로 표시되며 모든 부서와 사원이 결과에 포함됩니다.

## SQL 서브쿼리(Subquery) 완벽 이해하기: 쿼리 속의 쿼리

`SUBQUERY`는 하나의 SQL 쿼리문 안에 포함되는 또 다른 쿼리문입니다. 메인 쿼리에 필요한 데이터를 동적으로 검색하거나 필터링하는 데 사용되며, 복잡한 조건을 처리하거나 여러 단계의 데이터 처리 로직을 구현할 때 매우 유용합니다.

###


1. WHERE 절 서브쿼리




- **설명**: `WHERE` 절에서 조건을 설정하기 위해 사용됩니다. 주로 단일 값, 단일 컬럼 또는 여러 컬럼의 값을 반환하여 메인 쿼리의 `WHERE` 조건과 비교하는 데 쓰입니다. `IN`, `=`, `>`, `<`, `>=` 등 다양한 연산자와 함께 사용됩니다.




- **예시**: '개발부'에 속한 사원들의 정보를 조회합니다.

```sql
SELECT EMP_NO, ENAME, DEPT_NO
FROM EMP
WHERE DEPT_NO = (SELECT DEPT_NO FROM DEPT WHERE DEPT_NAME = '개발부');
```




- **예시 (IN 연산자)**: 서울에 위치한 부서에 속한 사원들의 정보를 조회합니다.

```sql
SELECT EMP_NO, ENAME, DEPT_NO
FROM EMP
WHERE DEPT_NO IN (SELECT DEPT_NO FROM DEPT WHERE LOCATION = '서울');
```

###


2. FROM 절 서브쿼리 (인라인 뷰, Inline View)




- **설명**: `FROM` 절에 서브쿼리를 사용하여 임시 테이블(뷰)처럼 활용합니다. 메인 쿼리는 이 임시 테이블에서 데이터를 조회하게 됩니다. 복잡한 집계나 중간 계산 결과를 다른 테이블과 조인해야 할 때 유용합니다.




- **예시**: 각 부서별 평균 급여를 계산한 후, 그 결과를 DEPT 테이블과 조인하여 부서 이름과 함께 조회합니다.

```sql
SELECT D.DEPT_NAME, A.AVG_SALARY
FROM DEPT D JOIN (SELECT DEPT_NO, AVG(SALARY) AS AVG_SALARY FROM EMP GROUP BY DEPT_NO) A
ON D.DEPT_NO = A.DEPT_NO;
```

###


3. SELECT 절 서브쿼리 (스칼라 서브쿼리, Scalar Subquery)




- **설명**: `SELECT` 절에서 하나의 컬럼 값처럼 사용되며, 항상 단일 행, 단일 컬럼의 값을 반환해야 합니다. 각 행마다 독립적으로 실행되어 해당 행에 대한 추가 정보를 가져올 때 사용됩니다.




- **예시**: 각 사원의 이름과 함께 해당 사원이 속한 부서의 이름을 조회합니다.

```sql
SELECT E.ENAME,
(SELECT D.DEPT_NAME FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO) AS DEPT_NAME
FROM EMP E;
```

(이 예시는 `INNER JOIN`으로도 구현 가능하며, 성능상 `INNER JOIN`이 더 유리한 경우가 많습니다. `SELECT` 절 서브쿼리는 특히 복잡한 집계나 조건부 계산에 유용합니다.)

### JOIN vs. SUBQUERY: 언제 무엇을 사용할까?




- **JOIN**: 일반적으로 여러 테이블 간의 관계를 바탕으로 데이터를 결합하는 데 최적화되어 있습니다. 대량의 데이터를 결합할 때 성능상 이점을 가집니다. 관계형 데이터 모델의 핵심이죠.




- **SUBQUERY**: 메인 쿼리의 특정 부분(WHERE, FROM, SELECT 절)에 조건을 추가하거나, 특정 값을 계산하여 사용해야 할 때 유용합니다. 특히 조건이 복잡하거나, 임시 집계가 필요할 때 활용도가 높습니다.




- **선택 가이드**:



- 테이블 간의 1:N 또는 N:N 관계를 기반으로 데이터를 통합해야 할 때는 **JOIN**을 우선적으로 고려하세요.



- 메인 쿼리의 결과를 필터링하거나, 각 행에 대한 추가적인 계산 값이 필요할 때는 **SUBQUERY**를 고려할 수 있습니다.



- 경우에 따라 `JOIN`과 `SUBQUERY`는 서로 대체될 수 있지만, 일반적으로 `JOIN`이 성능면에서 우위를 보이는 경우가 많습니다. 가독성과 성능을 고려하여 적절한 방법을 선택하는 것이 중요합니다.




조인(JOIN)과 서브쿼리(SUBQUERY)는 관계형 데이터베이스에서 데이터를 효율적으로 다루는 핵심 기술이자, 정보처리기사 실기 시험 합격을 위한 필수 요소입니다. 각 조인의 종류별 특성과 서브쿼리가 활용되는 위치에 따른 쓰임을 명확히 이해하고 적절하게 구사할 수 있어야 합니다.

이론적인 학습뿐만 아니라, 다양한 예시 쿼리를 직접 작성하고 실행해보는 꾸준한 실습이 중요합니다. 실제 데이터베이스를 활용하여 직접 쿼리를 실행해보고, 결과 값을 예상하며 디버깅하는 과정을 거친다면 SQL 활용 능력과 정보처리기사 실기 시험에 대한 자신감을 크게 향상시킬 수 있을 거예요. 꾸준함이 합격의 지름길입니다!


저작자표시 (새창열림)

'정보처리기사' 카테고리의 다른 글

C언어 포인터 & 배열, 까다로운 문제 완벽 해부!  (0) 2026.02.12
정보처리기사 합격 비법: 데이터 정규화 1~3단계 완전 정복!  (0) 2026.01.28
정보처리기사 합격률 UP! 디자인 패턴 5분 암기법  (0) 2026.01.27
2026 정보처리기사 필기 합격, 초단기 공략법!  (0) 2026.01.15
2024년 정보처리기사 실기 3회 12번 문제 공부 및 풀이  (0) 2025.10.21
'정보처리기사' 카테고리의 다른 글
  • C언어 포인터 & 배열, 까다로운 문제 완벽 해부!
  • 정보처리기사 합격 비법: 데이터 정규화 1~3단계 완전 정복!
  • 정보처리기사 합격률 UP! 디자인 패턴 5분 암기법
  • 2026 정보처리기사 필기 합격, 초단기 공략법!
쿠키키키키
쿠키키키키
개발자의 이거저것입니다.
  • 쿠키키키키
    코딩 공부
    쿠키키키키
  • 전체
    오늘
    어제
    • 분류 전체보기 (357) N
      • 웹1 (19)
      • 파이썬 (4)
      • MySQL (8)
      • 자바 (26)
      • 자바스크립트 (3)
      • 스프링 부트 프로젝트 연습 (17)
        • 스프링 부트 (3)
      • 자바 알고리즘 문제 (175)
      • 코딩 정보 공유 (30) N
      • 정보처리기사 (39)
      • 코딩 영상 리뷰 (9)
      • 개인 프로젝트 (DNW) (20)
  • 블로그 메뉴

    • 링크
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바
    JPA #JAVA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
쿠키키키키
정보처리기사 SQL 조인 & 서브쿼리: 실기 합격 마스터!
상단으로

티스토리툴바