지지 On Air

2-1-8. 표준 조인 [SQL 전문가 가이드] 본문

개발/SQL [SQLD&SQLP]

2-1-8. 표준 조인 [SQL 전문가 가이드]

슈스 지지 2022. 8. 3. 22:08
반응형

 


SQL 포스팅은 오랜만에 올리는것 같네요😅 

드디어 2과목 1장의 마지막, 표준조인입니다 :) 


반응형
과목 II. SQL 기본과 활용
  - 제1장 SQL 기본
    > 제8절 표준조인

 

1. FROM 절 조인 형태

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

- INNER JOIN

- NATURAL JOIN

- USING 조건절

- ON 조건절

- CROSS JOIN

- OUTER JOIN

 

INNER JOIN은 조인의 디폴트 옵션으로 조인 조건을 만족하는 행들만 반환한다.

디폴트이므로 생략이 가능하지만, CROSS JOIN, OUTER JOIN과는 같이 사용할 수 없다.

NATURAL JOIN은 INNER JOIN의 하위개념으로 볼 수 있으며, 두 ㅌ이블간ㅇ 동일한 이름을 갖는 모든 칼럼에 대해 EQUI(=) JOIN을 수행한다. NATURAL INNER JOIN이라고도 표시할 수 있으며 결과는 NATURAL JOIN과 같다.

 

 

2. INNER JOIN

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

INNER 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.PLAYER_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은 디폴트 옵션이므로 다음과 같이 생략해도 된다.

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.PLAYER_NAME, A.BACK_NO, TEAM_ID, B.TEAM_NAME
FROM PLAYER 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나 테이블명 같은 접두사를 쓸 수 없다.

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

 

 

 

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조건절을 필수적으로 사용해야 한다.

 

LEFT OUTER JOIN

테이블 A와 B가 있을때, A를 기준으로 A와 B를 비교해서 V의 조인 칼럼에 조인 조건을 만족하는 값이 있으면 해당 로우의 데이터를 가져오고, 조인조건을 만족하는 값이 없을 때는 B테이블에서 가져오는 칼럼들은 NULL로 채운다.

그리고 LEFT JOIN으로 OUTER 키워드를 생략해서 쓸 수 있다.

SELECT A.STADIUM_NAME, A.STADIUM_ID, A.HOMETEAM_ID, B.TEAM_NAME
FROM STADIUM A LEFT JOIN TEAM B
ON B.TEAM_ID = A.HOMETEAM_ID
ORDER BY A.HOMETEAM_ID;
STADIUM_NAME STADIUM_ID HOMETEAM_ID TEAM_NAME
수원종합운동장 C04 K01 수원FC
수원월드컵경기장 A02 K02 수원삼성
제주월드컵경기장 B01 K03 제주유나이티드FC
일산경기장 F02    
대구시민경기장 F05    

 

RIGHT OUTER JOIN

LEFT JOIN과 반대로 우측 테이블에 기준이 되어 결과를 생성한다.

즉, 테이블A와 B가 있을때 B가 기준이 되어 A와 B를 비교해서 A의 조인 칼럼에 조인 조건을 만족하는 값이 있으면 해당 로우의 데이터를 가져오고, 만족하는 값이 없는 경우에는 A테이블에서 가져오는 칼럼들은 NULL값으로 채운다. 그리고 RIGHT JOIN으로  OUTER키워드를 생략해서 사용할 수 있다.

 

FULL OUTER JOIN

좌측, 우측 테이블의 모든 데이터를 읽어 조인해 결과를 생성한다. 

즉 테이블 A와 B가 있을때, RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다. 단 조인에 성공한 행들은 한번만 표시한다.

FULL JOIN 으로  OUTER키워드를 생략해서 사용할 수 있다.

 


드디어 1장이 끝났습니다!

사실상 이렇게 이론으로 접하는것 보다 직접 해보거나 문제를 풀어보는게 더 도움이 되는데,

이론 포스팅이 끝나면 연습문제도 좀 가져와서 포스팅 해봐야겠습니다 ㅎㅎ

 

2장부터는 내용이 좀 어려워 지는데, 잘 풀어서 포스팅 해보겠습니다!

구독과 좋아요, 댓글은 큰힘이 됩니다 🤩


본 포스팅은 '한국데이터산업진흥원' 에서 발행한 'SQL 전문가 가이드' 를 참고/인용 하였음을 밝힙니다.
반응형

'개발 > SQL [SQLD&SQLP]' 카테고리의 다른 글

2-2-1. 서브쿼리  (6) 2022.09.22
2-1-7. 조인(JOIN) [ SQL 가이드 ]  (15) 2022.07.29
2-1-6. ORDER BY 절  (12) 2022.07.28
2-1-5. GROUP BY, HAVING절  (8) 2022.07.27
2-1-4. WHERE절  (12) 2022.07.23
Comments