공든탑앱 열기

표준 조인(INNER·NATURAL·USING·ON·CROSS)

SQLD (SQL 개발자) · 조인 · 약 13분

쉽게 말하면

표준 조인은 표를 잇는 조건을 FROM 쪽에 따로 적는 방식이에요. 'A 표와 B 표를 이 조건으로 이어라(JOIN … ON)'와 '그중에서 이런 줄만 골라라(WHERE)'가 나뉘어 읽기 쉬워요. 이름이 같은 칸으로 알아서 잇는 NATURAL JOIN, 모든 짝을 다 만드는 CROSS JOIN도 있어요.

시험용 정의

ANSI 표준 조인은 조인 조건을 WHERE가 아니라 FROM 절에 쓴다. INNER JOIN … ON 조건(가장 기본), USING (열)(같은 이름 열로 EQUI 조인), NATURAL JOIN(이름이 같은 모든 열로 자동 EQUI 조인), CROSS JOIN(카티션 곱)이 있다. 조인 조건과 일반 조건이 분리되어 읽기 쉽다.

비유로 이해하기

WHERE에 조인 조건을 섞어 쓰는 방식이 장보기 목록에 '두부, 대파, 그리고 정육점과 채소가게를 같은 날 들를 것'을 섞어 쓴 것이라면, 표준 조인은 '어디와 어디를 잇는지(FROM … JOIN … ON)'와 '무엇을 고를지(WHERE)'를 따로 적은 목록이다.

자세히

먼저 알아 둘 말

말뜻
ANSI 표준미국 표준 협회가 정한 SQL 표준. DBMS가 달라도 같은 문법으로 동작하게 한다
INNER조건에 맞는 짝이 있는 행만 남기는 조인. 생략하고 JOIN만 써도 INNER
공통 열두 테이블에 이름이 같은 열(DEPTNO)

표준 조인 종류

문법조인 조건주의
a [INNER] JOIN b ON 조건ON에 자유롭게 (=, BETWEEN 모두)가장 유연하다. 열 이름이 달라도 된다
a JOIN b USING (열)괄호 안 열 이름으로 = 조인그 열에 접두사 금지. 결과에 한 번만 나온다
a NATURAL JOIN b이름이 같은 모든 열로 = 조인공통 열에 접두사 금지, ON·USING과 함께 못 씀. 자료형이 같아야 한다
a CROSS JOIN b없음 (카티션 곱)행 수 = 곱

SELECT *의 열 순서

USING이나 NATURAL JOIN에서 SELECT *를 하면 공통 열이 맨 앞에 한 번만 나오고, 그 뒤에 첫 테이블의 나머지 열, 두 번째 테이블의 나머지 열이 온다. ON을 쓴 INNER JOIN은 두 테이블의 모든 열이 그대로 나와 DEPTNO가 두 번 보인다.

ON 절과 WHERE 절

INNER JOIN에서는 조건을 ON에 쓰든 WHERE에 쓰든 결과가 같다. 하지만 OUTER JOIN에서는 ON의 조건(짝을 찾는 조건)과 WHERE의 조건(다 만든 결과를 거르는 조건)이 결과를 다르게 만든다. 다음 개념에서 본다.

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. SELECT d.deptno, e.ename FROM emp e JOIN dept d USING (deptno)을 Oracle에서 실행하면?

  1. 정상 실행
  2. 오류: USING에 쓴 열에는 테이블 별칭을 붙일 수 없다
  3. OUTER JOIN 결과
  4. 카티션 곱
정답 보기

2번 오류: USING에 쓴 열에는 테이블 별칭을 붙일 수 없다

USING과 NATURAL JOIN의 공통 열은 하나로 합쳐지므로 접두사(별칭)를 붙이면 오류(ORA-25154)다. 그냥 deptno로 쓴다.

Q2. EMP(8열)와 DEPT(3열)를 NATURAL JOIN으로 SELECT * 하면 열은 몇 개인가? (공통 열은 DEPTNO 하나)

  1. 8
  2. 9
  3. 10
  4. 11
정답 보기

3번 10

공통 열 DEPTNO가 한 번만 나와 8 + 3 - 1 = 10.

Q3. NATURAL JOIN에 대한 설명으로 틀린 것은?

  1. ON 절과 함께 쓸 수 있다
  2. 공통 열은 결과에 한 번만 나온다
  3. 이름이 같은 모든 열로 EQUI 조인한다
  4. 공통 열에 테이블 별칭을 붙일 수 없다
정답 보기

1번 ON 절과 함께 쓸 수 있다

NATURAL JOIN은 조건을 자동으로 정하므로 ON·USING을 함께 쓸 수 없다.

Q4. FROM emp e, dept d WHERE e.deptno = d.deptno와 결과가 같은 것은?

  1. FROM emp e FULL JOIN dept d ON e.deptno = d.deptno
  2. FROM emp e JOIN dept d ON e.deptno = d.deptno
  3. FROM emp e CROSS JOIN dept d
  4. FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno
정답 보기

2번 FROM emp e JOIN dept d ON e.deptno = d.deptno

INNER JOIN … ON과 같다.

Q5. EMP 12행과 DEPT 4행을 CROSS JOIN 하면 결과 행 수는?

  1. 4
  2. 12
  3. 16
  4. 48
정답 보기

4번 48

48행이다. CROSS JOIN은 모든 조합을 만드는 카티션 곱이라 12 × 4다.

Q6. FROM emp JOIN dept USING (deptno) 에서 SELECT emp.deptno 라고 쓰면?

  1. DEPT의 값이 나온다
  2. 오류가 난다
  3. NULL이 나온다
  4. 정상 실행된다
정답 보기

2번 오류가 난다

USING의 공통 열에는 테이블 접두사를 붙일 수 없다.

헷갈리기 쉬운 O·X

JOIN 키워드만 쓰고 INNER를 생략하면 OUTER JOIN이 된다.

정답 보기

X JOIN만 쓰면 INNER JOIN이다.

USING 절의 열은 SELECT 결과에 한 번만 나온다.

정답 보기

O 공통 열이 하나로 합쳐진다.

ON 절에는 = 조건만 쓸 수 있다.

정답 보기

X BETWEEN 같은 NON-EQUI 조건도 쓸 수 있다.

함께 보면 좋은 개념