정처기 감자정처기 감자
SQLSQL 문법

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

SQL JOIN과 서브쿼리 - 테이블 결합과 중첩 질의

DBSQLJOIN서브쿼리
읽는데 17분 소요
처음 쓰인 날: 2026-03-30
마지막 수정일: 2026-09-07
조회수: —
선수학습(1개)
  • SQL SELECT 완전 정복 - WHERE, ORDER BY, GROUP BY, 집계함수

요약

SQL JOIN(INNER, CROSS, LEFT/RIGHT/FULL OUTER, 자연 조인)과 서브쿼리(IN, ALL, ANY)를 학습한 뒤, 페이지 하단의 정보처리기사 실기 대비 문제로 연습합니다.

JOIN과 서브쿼리는 실행 결과를 구하는 문제로 출제됩니다
테이블을 합치는 과정을 단계별로 따라가는 연습이 중요합니다. 개념 설명을 읽은 뒤 페이지 하단에 모아 둔 문제를 풀어 보세요.

JOIN 핵심 정리

JOIN은 두 개 이상의 테이블1을 공통 컬럼2을 기준으로 결합하는 연산입니다. 공통 컬럼이란 두 테이블 모두에 존재하는 같은 의미의 컬럼(예: 사원번호)을 말합니다.

JOIN 종류설명
INNER JOIN (동등 조인)두 테이블에서 조건이 일치하는 행만 반환
CROSS JOIN두 테이블의 모든 조합 반환 (카티션 곱3)
LEFT OUTER JOIN왼쪽 테이블의 모든 행 + 오른쪽에서 일치하는 행
RIGHT OUTER JOIN오른쪽 테이블의 모든 행 + 왼쪽에서 일치하는 행
FULL OUTER JOIN양쪽 테이블의 모든 행 반환
NATURAL JOIN (자연 조인)동등 조인에서 중복 컬럼 제거

INNER JOIN - 내부 조인

두 테이블에서 조건이 일치하는 행만 결합하여 반환합니다. 정보처리기사 실기에서 가장 자주 출제되는 조인 유형입니다.

JOIN ... ON 구문

sql
코드 하이라이팅 중…

테이블명.컬럼명은 "어느 테이블의 컬럼인지"를 명시하는 점 표기법4입니다. 두 테이블에 이름이 같은 컬럼이 있을 때 어느 테이블 것인지 구분하기 위해 사용합니다.

JOIN 대신 INNER JOIN이라고 써도 같은 의미입니다.

WHERE 구문 (동등 조인)

sql
코드 하이라이팅 중…
JOIN ... ON과 WHERE 조인은 결과가 같습니다
두 가지 문법 모두 시험에 출제됩니다. FROM에 테이블을 쉼표로 나열하고 WHERE로 조건을 거는 방식도 동등 조인입니다.

예시:

sql
코드 하이라이팅 중…

CROSS JOIN - 교차 조인

두 테이블의 모든 가능한 조합을 생성합니다. A 테이블이 3행, B 테이블이 2행이면 결과는 3 x 2 = 6행입니다.

sql
코드 하이라이팅 중…

예시:

A 테이블 (3행):

NONAME
1SMITH
2ALLEN
3SCOTT

B 테이블 (2행):

RNORULE
1S%
2%T%

CROSS JOIN 결과 (3 x 2 = 6행):

A.NAMEB.RULE
SMITHS%
SMITH%T%
ALLENS%
ALLEN%T%
SCOTTS%
SCOTT%T%

여기에 WHERE A.NAME LIKE B.RULE 조건을 추가하면, 각 조합에서 조건을 만족하는 행만 남습니다. LIKE와 % 패턴 매칭은 sql-select 페이지를 참고하세요.

CROSS JOIN + WHERE LIKE 결과:

A.NAMEB.RULENAME LIKE RULE포함 여부
SMITHS%S로 시작? YES포함
SMITH%T%T 포함? YES포함
ALLENS%S로 시작? NO제외
ALLEN%T%T 포함? NO제외
SCOTTS%S로 시작? YES포함
SCOTT%T%T 포함? YES포함

최종 결과: SMITH/S%, SMITH/%T%, SCOTT/S%, SCOTT/%T% (4행)


OUTER JOIN - 외부 조인

한쪽 테이블의 모든 행을 포함하고, 반대쪽에 일치하는 행이 없으면 NULL5로 채웁니다.

예시 테이블:

사원 테이블:

사원번호이름
1김감자
2이고구마
3박옥수수

부서 테이블:

사원번호부서명
1개발팀
2디자인팀

(박옥수수는 아직 부서가 없습니다.)

LEFT OUTER JOIN

sql
코드 하이라이팅 중…

왼쪽 테이블(사원)의 모든 행을 포함합니다. 오른쪽에 일치하는 값이 없으면 NULL이 됩니다.

LEFT OUTER JOIN 결과:

사원.사원번호이름부서.사원번호부서명
1김감자1개발팀
2이고구마2디자인팀
3박옥수수NULLNULL

박옥수수는 부서 테이블에 대응하는 행이 없으므로 오른쪽 컬럼이 NULL로 채워집니다.

RIGHT OUTER JOIN

sql
코드 하이라이팅 중…

오른쪽 테이블(테이블2)의 모든 행을 포함합니다. 왼쪽에 일치하는 값이 없으면 NULL이 됩니다.

FULL OUTER JOIN

sql
코드 하이라이팅 중…

양쪽 테이블의 모든 행을 포함합니다. 어느 쪽에도 일치하지 않는 부분은 NULL로 채웁니다.

미매칭 행만 골라내기 - IS NULL

OUTER JOIN에서 짝이 없어 NULL로 채워진 행만 뽑고 싶을 때가 있습니다. 이때 = NULL이라고 쓰면 안 됩니다. NULL은 '값이 없음'이라 =로 비교하면 참도 거짓도 아닌 '알 수 없음'이 되어 어떤 행도 남지 않습니다. NULL인지 아닌지는 IS NULL / IS NOT NULL로만 확인합니다.

sql
코드 하이라이팅 중…

실행 결과:

사원번호이름
3박옥수수

LEFT OUTER JOIN으로 사원 3명을 모두 남긴 뒤, 부서 쪽이 NULL인 행만 남겨 부서가 없는 사원을 찾았습니다. RIGHT OUTER JOIN이면 반대로 왼쪽 테이블의 컬럼에 IS NULL을 겁니다.

COUNT와 함께 나올 때는 COUNT(*)와 COUNT(컬럼)의 차이를 같이 봐야 합니다. COUNT(*)는 NULL이 있는 행도 세지만, COUNT(부서.부서명)처럼 컬럼을 지정하면 NULL은 세지 않습니다. 위 LEFT OUTER JOIN 결과 3행에서 COUNT(*)는 3, COUNT(부서.부서명)은 2입니다. 2026년 2회 실기는 RIGHT OUTER JOIN, IS NULL, COUNT를 한 문제에 묶어 출제했습니다.


SELF JOIN - 자기 참조 조인

같은 테이블을 두 번 참조하는 조인입니다. 하나의 테이블 안에 서로 연결된 행이 있을 때 사용합니다 (예: 사원 테이블에 상사번호가 같이 들어 있는 경우).

sql
코드 하이라이팅 중…

같은 테이블을 두 번 쓰므로 별칭(AS)으로 구분해야 합니다. 위 구문의 e1·e2는 별칭이며, 같은 사원 테이블을 서로 다른 관점(본인 역할, 상사 역할)으로 사용합니다.

예시:

사원 테이블(상사번호는 같은 테이블의 사원번호를 참조):

사원번호이름상사번호
1김감자3
2이고구마3
3박옥수수NULL
sql
코드 하이라이팅 중…

단계별 풀이:

1단계 e1은 사원 테이블, e2도 같은 사원 테이블이지만 별칭으로 분리되어 서로 다른 테이블처럼 취급됩니다.

2단계 ON e1.상사번호 = e2.사원번호 조건은 "본인(e1)의 상사번호"가 "다른 사원(e2)의 사원번호"와 같은 행끼리 결합합니다.

3단계 결합 결과에서 e1.이름은 사원으로, e2.이름은 상사로 표시됩니다.

SELF JOIN 결과:

사원상사
김감자박옥수수
이고구마박옥수수

박옥수수는 상사번호가 NULL이므로 ON 조건에 일치하는 행이 없어 결과에서 제외됩니다. INNER JOIN이기 때문입니다. 상사 없는 사람도 포함하려면 LEFT OUTER JOIN을 써야 합니다.

SELF JOIN은 별칭이 필수입니다
같은 테이블을 두 번 쓰기 때문에 컬럼이 어느 쪽 테이블의 것인지 구분할 수 없습니다. 반드시 별칭을 붙여서 e1, e2처럼 구분해야 합니다.

조인의 학술적 분류

조인 종류설명
세타 조인 (Theta Join)모든 비교 연산자(=, >, <, >=, <=, !=)를 사용하는 조인. '세타(θ)'는 비교 연산자를 나타내는 수학 기호6
동등 조인 (Equi Join)세타 조인 중 등호(=)만 사용하는 조인
자연 조인 (Natural Join)동등 조인에서 중복 컬럼을 제거한 조인

세타 조인 ⊃ 동등 조인 ⊃ 자연 조인 순서로 범위가 좁아집니다. (⊃는 "포함한다"는 집합 기호로, 세타 조인이 가장 넓고 자연 조인이 가장 좁은 개념입니다.)

SQL 예시:

sql
코드 하이라이팅 중…

자연 조인의 중복 컬럼 제거:

동등 조인 결과 (부서번호 컬럼이 두 번 나타남):

사원.부서번호이름부서.부서번호부서명
10김감자10개발팀

자연 조인 결과 (중복 컬럼 제거 후):

부서번호이름부서명
10김감자개발팀
자연 조인 = 동등 조인 - 중복 컬럼
자연 조인은 동등 조인의 결과에서 중복된 속성을 하나만 남기는 것입니다. 시험에서 세타/동등/자연 조인의 차이를 묻는 문제가 출제됩니다.

서브쿼리 (Subquery)

다른 SQL문 안에 포함된 SELECT문을 서브쿼리라고 합니다. 먼저 안쪽 서브쿼리가 실행되어 결과를 만들고, 그 결과를 바깥 쿼리에서 사용합니다.

sql
코드 하이라이팅 중…

WHERE ... IN (서브쿼리)

sql
코드 하이라이팅 중…

서브쿼리의 결과 목록에 포함되는 행만 조회합니다.

예시:

sql
코드 하이라이팅 중…

중첩 서브쿼리 해석 순서

서브쿼리가 여러 겹으로 중첩된 경우, 가장 안쪽 서브쿼리부터 바깥쪽으로 순서대로 해석합니다.

sql
코드 하이라이팅 중…

GROUP BY와 HAVING 자세히 보기

풀이 순서: ① → ② → ③

상관 서브쿼리 (Correlated Subquery)

바깥 쿼리의 값을 서브쿼리가 참조하는 형태입니다. 바깥 쿼리의 각 행마다 서브쿼리가 다시 실행되므로, 일반 서브쿼리와 달리 "한 번 실행 후 값 치환" 방식이 아닙니다.

sql
코드 하이라이팅 중…

예시:

사원 테이블:

사원번호이름부서번호급여
1김감자103000
2이고구마104000
3박옥수수203500
4최참외202500
sql
코드 하이라이팅 중…

단계별 풀이:

1단계 바깥 쿼리가 사원 e1의 첫 행(김감자, 부서번호 10, 급여 3000)을 꺼냅니다.

2단계 서브쿼리 실행 — e1.부서번호에 10이 대입되어, 부서번호 = 10인 사원(김감자·이고구마)의 평균 급여를 계산합니다: (3000 + 4000) / 2 = 3500.

3단계 급여(3000) > 3500 → FALSE이므로 김감자는 결과에서 제외됩니다.

4단계 바깥 쿼리가 다음 행(이고구마)을 꺼내고, 서브쿼리는 다시 실행되어 같은 부서 평균 3500을 반환 → 4000 > 3500 → TRUE, 이고구마 포함.

5단계 박옥수수(부서 20): 서브쿼리가 부서 20 사원(박옥수수·최참외)의 평균 3000을 반환 → 3500 > 3000 → TRUE, 포함.

6단계 최참외(부서 20): 평균 3000 → 2500 > 3000 → FALSE, 제외.

최종 결과:

이름급여
이고구마4000
박옥수수3500
상관 서브쿼리는 바깥 쿼리의 각 행마다 실행됩니다
일반 서브쿼리(비상관)는 한 번 실행되고 끝나지만, 상관 서브쿼리는 바깥 쿼리 행의 개수만큼 반복 실행됩니다. 바깥 테이블의 별칭을 서브쿼리 안에서 참조하면 상관 서브쿼리입니다.

인라인 뷰 (Inline View) - FROM 절 서브쿼리

FROM 절 안에 서브쿼리를 넣어 그 결과를 임시 테이블처럼 사용합니다. 외부에서는 진짜 테이블인 것처럼 보이지만, 실제로는 메모리상에만 존재합니다.

sql
코드 하이라이팅 중…

예시:

sql
코드 하이라이팅 중…

단계별 풀이:

1단계 인라인 뷰 먼저 실행 — 사원 테이블을 부서별로 묶어 평균 급여를 계산합니다. 결과가 부서평균이라는 임시 테이블이 됩니다:

부서번호평균급여
103500
203000

2단계 바깥 쿼리가 부서평균을 일반 테이블처럼 조회 — WHERE 평균급여 >= 3000 조건으로 필터링합니다.

최종 결과:

부서번호평균급여
103500
203000
인라인 뷰는 반드시 별칭이 필요합니다
FROM 절의 서브쿼리 뒤에 AS 별칭을 붙여야 합니다. 바깥 쿼리에서 컬럼을 참조할 때 이 별칭으로 접근합니다.

ALL / ANY 연산자

서브쿼리 결과의 모든 값 또는 하나 이상의 값과 비교합니다.

연산자의미
ALL서브쿼리의 모든 값과 비교 (모두 만족해야 참)
ANY (= SOME)서브쿼리의 하나라도 만족하면 참
sql
코드 하이라이팅 중…

ALL 단계별 풀이:

① 서브쿼리 실행: SELECT 무게 FROM 감자 WHERE 농장 = 'A' → 결과: (100, 150)

② 무게 > ALL (100, 150) = 무게 > 100 AND 무게 > 150 = 무게 > 150 (모든 값보다 커야 하므로 가장 큰 값인 150보다 커야 함)

③ 무게가 150보다 큰 감자만 최종 결과에 포함

ANY 예시:

sql
코드 하이라이팅 중…

A농장 감자 무게가 100, 150이면, 무게 > ANY (100, 150) = 무게 > 100 OR 무게 > 150 = 무게 > 100 (하나라도 만족하면 되므로 가장 작은 값인 100보다 크면 됨)

ALL은 '가장 큰 값보다 커야', ANY는 '가장 작은 값보다 크면'
ALL은 서브쿼리 결과 (100, 150)에서 가장 큰 값인 150보다 커야 모든 값보다 큰 것입니다. ANY는 가장 작은 값인 100보다만 크면 하나라도 만족합니다.

정보처리기사 실기 대비 문제

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.

Footnotes

  1. 테이블(Table)은 데이터를 행(가로 줄)과 열(세로 줄)로 구성한 2차원 구조입니다. 엑셀 시트와 같이 생겼으며, 데이터베이스에서 데이터를 저장하는 기본 단위입니다. ↩

  2. 컬럼(Column)은 테이블의 세로 줄 하나로, 같은 종류의 데이터를 담습니다. 예를 들어 사원 테이블에서 '사원번호' 열 전체가 하나의 컬럼입니다. ↩

  3. 카티션 곱(Cartesian Product)은 두 집합의 모든 원소 쌍을 조합하는 수학 연산입니다. A가 3개, B가 2개 원소를 가지면 결과는 3 x 2 = 6개입니다. ↩

  4. 점 표기법(Dot Notation): 테이블명.컬럼명 형식으로 어느 테이블의 컬럼인지 명확히 지정합니다. 예: 사원.사원번호는 사원 테이블의 사원번호 컬럼을 의미합니다. ↩

  5. NULL은 "값이 없음"을 나타내는 특수 표시입니다. 0이나 빈 문자열('')과 다르게, 해당 데이터 자체가 존재하지 않음을 의미합니다. ↩

  6. 관계 대수(Relational Algebra)에서 비교 연산자를 θ(세타)로 표기하는 관례에서 이름이 유래했습니다. θ는 =, ≠, >, <, ≥, ≤ 중 어떤 연산자든 될 수 있습니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999