본문 바로가기
데이터베이스(DB)/SQLD

[SQLD 2-1-8] SQL 기본 - 표준 조인

by 송기동 2024. 5. 23.
728x90

1. FROM 절 조인 형태

- ANSI/ISO SQL에서 표시하는 FROM 절의 조인 형태는 다음과 같다.

- INNER JOIN : 조인의 디폴트 옵션으로 조인 조건을 만족하는 행들만 반환 (생략 가능, CROSS, OUTER JOIN과 함께 사용 못함)

- NATURAL JOIN : INNER JOIN의 하위개념, 두 테이블간 동일한 이름을 갖는 모든 컬럼에 대해 EQUI JOIN을 수행한다.

- USING 조건절

- ON 조건절

- CROSS JOIN

- OUTER JOIN


2. INNER JOIN

- INNER JOIN은 OUTER JOIN과 대비해 내부 조인이라고 하며, 조인 조건을 만족하는 행들을 반환한다.

- 전통적인 방식의 조인 문법에서는 WHERE 절에 기술하던 조인 조건을 FROM 절에 정의하겠다는 표시이므로 USING 조건절이나 ON 조건절을 필수적으로 사용해야 한다.

 

# 예시

SELECT A.PLAYER_NAME, A.BACK_NO, B.TEAM_ID, B.TEAM_NAME
FROM PLAYER A, TEAM B
WHERE A.TEAM_ID = B.TEAM_ID;

 

WHERE 절로 작성한 위의 쿼리문은 다음 쿼리문과 같다.

SELECT A.PALYER_NAME, A.BACK_NO, B.TEAM_ID, B.TEAM_NAME
FROM PLAYER A INNER JOIN TEAM B
ON A.TEAM_ID = B.TEAM_ID;

 

또한 INNER JOIN 의 INNER 은 디폴트 옵션이므로 다음과 같이 생략해도 된다.

SELECT A.PLAYER_NAME, A.BACK_NO, B.TEAM_ID, B.TEAM_NAME
FROM PLAYER A JOIN TEAM B
WHERE A.TEAM_ID = B.TEAM_ID;

3. NATURAL JOIN

- NATURAL JOIN 은 두 테이블간에 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI(=) JOIN 을 수행한다.

- NATURAL JOIN 이 명시되면 추가로 USING 조건절, ON 조건절, WHERE 절에서 조인 조건을 정의할 수 없다.

- SQL Server 에서는 지원하지 않는 기능이다.

- 테이블의 데이터 성격(도메인)과 컬럼명 등이 동일해야 하는 제약조건이 있다.

 

# 예시

SELECT A.PALYER_NAME, A.BACK_NO, TEAM_ID, B.TEAM_NAME
FROM PALYER A NATURAL JOIN TEAM B;

 

결과는 다음과 같다.

PLAYER_NAME BACK_NO TEAM_ID TEAM_NAME
이승우 11 K01 수원FC
박배종 1 K01 수원FC
기성용 6 K02 FC서울
홍철 33 K03 대구FC

 

위 SQL문에서 별도의 조인 컬럼을 지정하지 않았지만, 두 개의 테이블에서 TEAM_ID 라는 공통된 컬럼을 자동으로 인식 해 조인을 처리한 것을 볼 수 있다.

조인에 사용된 컬럼들은 같은 데이터 유형이어야 하며, ALIAS 나 테이블명 같은 접두사를 쓸 수 없다.


4. USING 조건절

- NATURAL JOIN 에서는 같은 이름을 가진 모든 칼럼들에 대해 조인이 이루어 지지만, FROM절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다. 

- SQL Server에서는 지원하지 않는다.

SELECT DEPTNO, A.DNAME, A.LOC, B.DNAME, B.LOC
FROM DEPT A JOIN DET_TEMP B
USING (DEPTNO);

 

세개의 칼럼명이 모두 같은 DEPT와 DEPT_TEMP 테이블을 'DEPTNO'칼럼을 이용한 (INNER) JOIN의 USING 조건절로 수행한다.

이때, NATURAL JOIN과 마찬가지로 조인칼럼에 대해서는 ALIAS나 테이블 이름 같은 접두사를 붙일 수 없기 때문에 DEPTNO는 A.DEPTNO나 B.DEPTNO가 아닌 DEPTNO로 표기해야 한다.

 

결과는 다음과 같이 나타난다.

DEPTNO DNAME LOC DNAME LOC
10 ACCOUNTING NEW YORK ACCOUNTING NEW YORK
20 RESEARCH DALLAS CONSULTING DALLAS
30 SALES CHICAGO MARKETING CHICAGO
40 OPERATIONS BOSTON OPERATIONS BOSTON

5. ON 조건절

- 조인 서술부(ON 조건절)와 비 조인 서술부(WHERE 조건절)를 분리해 이해가 쉬우며, 칼럼명이 다르더라도 조인 조건을 사용할 수 있는 장점이 있다.

 

다음과 같이 사용할 수 있다.

SELECT A.EMPNO, A.ENAME, B.DEPNO, B.DNAME
FROM EMP A JOIN DEPT B
ON (B.DEPTNO = A.DEPTNO);

 

NATURAL JOIN의 조인 조건은 기본적으로 같은 이름을 가진 모든 칼럼들에 대한 동등 조건이다. 하지만 임의의 조인 조건을 지정하고, 이름이 다른 칼럼명을 조인 조건으로 사용하고, 조인 칼럼을 명시하기 위해서는 ON 조건절을 사용한다. ON 조건절에 사용된 괄호는 옵션사항이다.

USING 조건절을 이용한 조인에서는 조인 칼럼에 대해 ALIAS나 테이블명 같은 접두사를 사용하면 에러가 발생하지만, 반대로 ON 조건절을 사용한 조인의 경우 이름이 같은 컬럼에 대해 ALIAS나 테이블명 같은 접두사를 명확하게 지정해야 한다.

 

WHERE절과의 혼용

ON 조건절과 WHERE 검색조건은 충돌 없이 사용할 수 있다.

SELECT A.ENAME, A.DEPTNO, B.DEPTNO, B.DNAME
FROM EMP A JOIN DEPT B
ON B.DEPTNO = A.DEPTNO
WHERE B.DEPTNO = 30;

 

부서 번호 30인 부서의 소속 사원 이름 및 소속 부서번호, 부서번호, 부서 이름을 찾는 SQL문을 작성하였다.

 

ON 조건절 + 데이터 검증 조건 추가

ON조건절에 JOIN 조건 외에도 데이터 검색 조건을 추가할 수는 있으나, 검색 조건 목적인 경우는 WHERE절을 사용할 것을 권고한다. (다만, 아우터 조인에서 조인의 대상을 제한하기 위한 목적으로 사용되는 추가 조건의 경우 ON 절에 표기되어야 함)


6. CROSS JOIN

- CROSS JOIN은 테이블 간 조인 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말한다.

- 두 개의 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT 와 같은 표현으로, 결과는 양쪽 집합의 M*N건의 데이터 조합이 발생한다.

다음과 같이 사용한다

SELECT A.ENAME, B.DNAME
FROM EMP A CROSS JOIN DEPT B
ORDER BY A.ENAME;

 

위의 SQL문에서 EMP가 14건, DEPT가 4건이 있다면 14*4 = 총 56건의 데이터가 결과로 출력될 것이다.


7. OUTER JOIN

- 전통적인 방식의 조인 문법에서 Oracle은 조인 칼럼 뒤에 '(+)'를 표시했고, Sybase는 비교 연산자의 앞이나 뒤에 '(+)'를 표시했었다. 조인조건과  WHERE 절 검색 조건의 구분이 불명확하다는 단점, IN이나 OR연산자 사용시 에러 발생, '(+)'표기가 누락된 조인및 검색조건 존재시 OUTER JOIN이 아닌 INNER JOIN으로 수행, FULL OUTER JOIN 미지원 등 불편함이 많았다.

- ANSI/ISO SQL 표준방식의 OUTER JOIN문법을 사용하면 이러한 문제점들을 해결 할 수 있다. 또 대부분의 DBMS에서 지원하므로 높은 호환성을 가지는 장점이 있다.

- OUTER JOIN 역시 조인 조건을 FROM절에서 정의하겠다는 표시이므로 USING조건절이나 ON조건절을 필수적으로 사용해야 한다.

 

728x90