본문 바로가기

IT

**정보처리기사 실기: SQL 조인·서브쿼리 완벽 가이드**



정보처리기사 실기 시험을 준비하시면서 SQL의 핵심 개념인 조인(JOIN)과 서브쿼리(Subquery) 때문에 막막함을 느끼신 적 있으신가요? 많은 분들이 이 두 가지 개념을 어려워하지만, 사실 원리만 알면 누구보다 쉽게 이해하고 활용할 수 있습니다.

이 글에서는 SQL 조인과 서브쿼리의 개념을 실제 시험에 나올 법한 예시와 함께 쉽고 명확하게 설명해 드립니다. 복잡하게 얽힌 데이터들을 효율적으로 조회하는 방법을 익히고, 실기 시험은 물론 실제 개발 환경에서도 강력한 데이터 핸들링 능력을 갖출 수 있도록 도와드릴게요. 이 가이드를 통해 정보처리기사 합격에 한 걸음 더 다가가세요!




안녕하세요, IT/경제 전문 블로그 에디터입니다. 오늘은 정보처리기사 실기 단골 문제인 SQL 조인(JOIN)과 서브쿼리(Subquery)를 완벽하게 이해하는 시간을 가져보겠습니다. 복잡해 보이는 SQL 쿼리도 이 두 가지 개념만 확실히 잡으면 능숙하게 다룰 수 있게 됩니다.

**


1. 조인(JOIN)이란 무엇인가요?**

조인은 두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 SQL 명령어입니다. 관계형 데이터베이스의 핵심 개념이며, 서로 다른 테이블에 분산되어 있는 관련 데이터를 하나의 결과 집합으로 합쳐서 보여주는 역할을 합니다.

예를 들어, 회사의 `직원` 테이블에는 직원의 ID, 이름, 소속 부서 ID가 있고, `부서` 테이블에는 부서 ID와 부서명이 있다고 가정해봅시다. 직원 이름과 그 직원이 속한 부서명을 함께 보고 싶다면, 두 테이블을 연결해야 합니다. 이때 조인을 사용합니다.

**


● 예시 테이블:**

직원 (EMPLOYEES)   부서 (DEPARTMENTS)  
직원ID 직원명 부서ID 부서명
101 홍길동 D1 D1 영업부
102 김철수 D2 D2 마케팅부
103 이영희 D1 D3 개발부
104 박민지 D4    



**


● 주요 조인(JOIN) 유형:**




1. **INNER JOIN (내부 조인)**
* 두 테이블에서 조인 조건에 일치하는 행들만 반환합니다. 가장 일반적으로 사용되는 조인 방식입니다.
* **예시**: 모든 직원의 이름과 소속 부서명을 조회합니다. (부서에 소속되지 않은 직원이나, 직원이 없는 부서는 제외됩니다.)

```sql
SELECT E.직원명, D.부서명
FROM EMPLOYEES E INNER JOIN DEPARTMENTS D
ON E.부서ID = D.부서ID;
```




2. **LEFT JOIN (LEFT OUTER JOIN


- 왼쪽 외부 조인)**
* 왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에서는 조인 조건에 일치하는 행을 반환합니다. 만약 일치하는 행이 없으면, 오른쪽 테이블의 컬럼은 NULL 값으로 채워집니다.
* **예시**: 모든 직원의 이름과 소속 부서명을 조회합니다. (부서에 소속되지 않은 직원도 포함됩니다.)

```sql
SELECT E.직원명, D.부서명
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.부서ID = D.부서ID;
```




3. **RIGHT JOIN (RIGHT OUTER JOIN


- 오른쪽 외부 조인)**
* 오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에서는 조인 조건에 일치하는 행을 반환합니다. 일치하는 행이 없으면, 왼쪽 테이블의 컬럼은 NULL 값으로 채워집니다.
* **예시**: 모든 부서의 이름과 해당 부서에 소속된 직원의 이름을 조회합니다. (직원이 없는 부서도 포함됩니다.)

```sql
SELECT E.직원명, D.부서명
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.부서ID = D.부서ID;
```




4. **FULL OUTER JOIN (완전 외부 조인)**
* 두 테이블의 모든 행을 반환합니다. 조인 조건에 일치하는 행이 없으면, 다른 테이블의 컬럼은 NULL 값으로 채워집니다. (일부 데이터베이스에서는 FULL OUTER JOIN을 지원하지 않을 수 있습니다.)
* **예시**: 모든 직원의 이름과 부서명, 그리고 모든 부서의 정보와 그에 속한 직원 정보를 조회합니다.

```sql
SELECT E.직원명, D.부서명
FROM EMPLOYEES E FULL OUTER JOIN DEPARTMENTS D
ON E.부서ID = D.부서ID;
```

**


2. 서브쿼리(Subquery)란 무엇인가요?**

서브쿼리는 '하위 쿼리' 또는 '중첩 쿼리'라고도 불리며, 다른 SQL 쿼리 내부에 포함되는 SELECT 문을 의미합니다. 메인 쿼리에 필요한 데이터를 제공하는 역할을 하며, 주로 WHERE 절, FROM 절, SELECT 절 등 다양한 위치에서 사용됩니다.

서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되어 결과를 메인 쿼리에 전달하거나, 메인 쿼리와 연동하여 실행될 수 있습니다.

**


● 예시 테이블:**

고객 (CUSTOMERS)   주문 (ORDERS)    
고객ID 고객명 주문ID 고객ID 주문금액
C1 강감찬 O1 C1 50000
C2 을지문덕 O2 C2 120000
C3 이순신 O3 C1 70000
C4 유관순 O4 C3 30000



**


● 주요 서브쿼리 유형:**




1. **스칼라 서브쿼리 (Scalar Subquery)**
* 단 하나의 행과 단 하나의 열을 반환하는 서브쿼리입니다. 주로 SELECT 절이나 WHERE 절에서 사용됩니다.
* **예시**: 모든 주문의 평균 주문 금액보다 높은 주문을 한 고객의 주문 정보를 조회합니다.

```sql
SELECT 주문ID, 고객ID, 주문금액
FROM ORDERS
WHERE 주문금액 > (SELECT AVG(주문금액) FROM ORDERS);
```




2. **다중 행 서브쿼리 (Multi-row Subquery)**
* 여러 개의 행을 반환하는 서브쿼리입니다. 주로 WHERE 절의 IN, ANY, ALL, EXISTS 연산자와 함께 사용됩니다.
* **예시**: 주문을 한 적이 있는 고객들의 이름을 조회합니다.

```sql
SELECT 고객명
FROM CUSTOMERS
WHERE 고객ID IN (SELECT DISTINCT 고객ID FROM ORDERS);
```




3. **연관 서브쿼리 (Correlated Subquery)**
* 내부 서브쿼리가 외부(메인) 쿼리의 컬럼을 참조하여 동작하는 서브쿼리입니다. 외부 쿼리의 한 행이 처리될 때마다 내부 쿼리가 반복적으로 실행되므로, 성능에 영향을 줄 수 있습니다.
* **예시**: 각 고객별로 자신의 평균 주문 금액보다 높은 주문을 한 고객의 주문 정보를 조회합니다.

```sql
SELECT A.고객명, B.주문ID, B.주문금액
FROM CUSTOMERS A, ORDERS B
WHERE A.고객ID = B.고객ID
AND B.주문금액 > (SELECT AVG(X.주문금액)
FROM ORDERS X
WHERE X.고객ID = A.고객ID);
```

**


3. JOIN과 서브쿼리, 언제 무엇을 사용해야 할까요? (비교)**

조인과 서브쿼리는 모두 여러 테이블의 데이터를 결합하거나 필터링하는 데 사용될 수 있지만, 각각의 장단점과 적합한 상황이 다릅니다.

* **JOIN**:
* **장점**: 두 테이블 간의 관계가 명확하고, 많은 양의 데이터를 한 번에 가져와야 할 때 성능이 좋습니다. 일반적으로 조인이 서브쿼리보다 빠르게 동작합니다.
* **단점**: 복잡한 다중 조인은 가독성을 떨어뜨릴 수 있습니다.
* **사용 시점**: 주로 테이블 간의 관계를 바탕으로 데이터를 합쳐서 보고자 할 때 사용합니다. (예: 직원과 부서 정보, 게시글과 작성자 정보 등)

* **서브쿼리**:
* **장점**: 복잡한 조건 필터링, 데이터 집계, 또는 존재 여부 확인 등 특정 조건을 만족하는 데이터를 추출하는 데 유용하며, 쿼리 작성이 더 직관적일 수 있습니다.
* **단점**: 특히 연관 서브쿼리의 경우, 외부 쿼리의 행 수만큼 내부 쿼리가 반복 실행되어 성능 저하의 원인이 될 수 있습니다.
* **사용 시점**: 주로 '특정 조건에 해당하는 데이터'를 먼저 찾아 그 결과를 바탕으로 메인 쿼리를 실행할 때 사용합니다. (예: 평균 이상 주문 고객, 특정 상품을 구매한 고객 등)

정보처리기사 실기에서는 두 가지 모두 출제될 수 있으므로, 각 개념을 정확히 이해하고 문제에서 요구하는 바에 따라 적절한 방식을 선택하는 것이 중요합니다.




지금까지 SQL의 핵심인 조인(JOIN)과 서브쿼리(Subquery)에 대해 자세히 알아보았습니다. 이 두 가지 개념은 관계형 데이터베이스를 다루는 데 있어 필수적인 요소이며, 정보처리기사 실기 시험 합격의 당락을 좌우할 만큼 중요합니다.

가장 중요한 것은 직접 실습해보는 것입니다. 오라클(Oracle), MySQL, PostgreSQL 등 다양한 데이터베이스 환경에서 오늘 배운 조인과 서브쿼리 예시를 직접 실행하며 데이터의 변화를 눈으로 확인해보세요. 반복적인 실습만이 완벽한 이해와 능숙한 활용을 가능하게 할 것입니다. SQL 마스터의 길, 지금 바로 시작하세요!