DevSSOM

SQL - 종류별 JOIN (조인) 알아보기 본문

DataBase

SQL - 종류별 JOIN (조인) 알아보기

데브쏨 2021. 9. 6. 16:22
반응형

JOIN

두 개 이상의 테이블들을 연결 또는 결합해서 데이터를 출력하는 것

연산자에 따라 JOIN 방식을 EQUI JOIN과 Non EQUI JOIN으로 분류함.

 

EQUI JOIN (등가 교집합)

등가 연산자 '=' 를 사용한 조인을 의미. 두 개의 테이블 간에 서로 정확하게 일치하는 경우를 활용하는 조인. 대부분 기본키 - 외래키 관계를 기반으로 발생하지만, 모든 조인이 그런 것은 아님.

 

Non EQUI JOIN (비등가 교집합)

등가 연산자 이외의 연산자들 >, >=, <=, <, BETWEEN 을 사용한 조인을 의미. 두 개의 테이블 간에 서로 정확하게 일치하지 않는 경우를 활용하는 조인.

 

 

FROM절 JOIN 형태

INNER JOIN

내부 조인이라고 하며, 조인 조건에서 동일한 값이 있는 행만 반환. INNER JOIN은 JOIN의 기본값으로 'INNER' 생략 가능.

 

ON 조건절을 활용하면 컬럼명이 다르더라도 조인 조건을 사용할 수 있음.

SELECT * FROM 테이블1 [INNER] JOIN 테이블2    /* INNER JOIN구로 테이블 정의 */
ON 테이블1.컬럼명 = 테이블2.컬럼명;            /* ON구를 사용해 조인 조건 지정 */

 

JOIN을 활용한 쿼리에서도 WHERE문을 이용해서 조건을 걸 수도 있음. 서로 별개니까.

SELECT * FROM 테이블1 (INNER) JOIN 테이블2
ON 테이블1.컬럼명 = 테이블2.컬럼명;
WHERE [조건];    /* 기존과 같이 WHERE문을 이용 */

 

연습문제

1) EMPLOYEE 테이블과 POSITION_T 테이블에는 각 테이블의 구조에 맞도록 사원 정보 및 직급 정보가 담겨 있습니다. EMPLOYEE 테이블의 사원 정보에는 직급의 명칭이 담겨있지 않고, 어떤 직급인지에 대한 직급 ID가 담겨있습니다. 각 사원 정보에 따라서 직급 명칭을 알기 위해 INNER JOIN과 ON을 활용하여 쿼리를 작성해봅시다. EMPLOYEE 테이블과 POSITION_T 테이블의 구조는 다음과 같습니다.

EMPLOYEE테이블과 POSITION_T 테이블에서 직급 ID(POSITION_ID) 가 같은 데이터에 대해 INNER JOIN절 과 ON절을 이용하여 사원 번호(EMPLOYEE_ID), 이름(NAME), 직급 명칭(POSITION_NAME) 을 조회하는 쿼리를 작성하세요. 그리고, 결과에 대해 ORDER BY 를 이용하여 사원 번호를 기준으로 오름차순 정렬을 해주세요.

SELECT EMPLOYEE_ID, NAME, POSITION_NAME
FROM EMPLOYEE
INNER JOIN POSITION_T
ON EMPLOYEE.POSITION_ID = POSITION_T.POSITION_ID
ORDER BY EMPLOYEE_ID ASC;

 

2) STORE 테이블에는 가게 타입 코드와 가게 이름 정보가 담겨 있으며, STORE_TYPE_CODE 테이블에는 가게 타입 코드와 타입 이름 정보가 담겨 있습니다. STORE 테이블에는 어떠한 타입의 가게인지 가게 타입 이름이 저장되어 있지 않고, 가게 타입 코드 정보가 저장되어 있습니다. STORE_TYPE_CODE 테이블을 이용하여 STORE 테이블에서 각 가게가 어떤 가게 타입인지 코드가 아닌 이름으로 표현되도록 쿼리를 작성해봅시다.

 

STORE테이블과 STORE_TYPE_CODE 테이블에서 가게 타입 코드(store_type_code) 가 같은 데이터에 대해 INNER JOIN절 과 ON절을 이용하여 가게 이름(store_name)과 타입 이름(store_type_name) 을 조회하는 쿼리를 작성하세요. 결과에 대해 ORDER BY 를 이용하여 가게 이름을 기준으로 오름차순 정렬을 해주세요.

SELECT STORE_NAME, STORE_TYPE_NAME 
FROM STORE
INNER JOIN STORE_TYPE_CODE
ON STORE.STORE_TYPE_CODE = STORE_TYPE_CODE.STORE_TYPE_CODE
ORDER BY STORE_NAME ASC;

 

USING 조건절

같은 이름을 가진 컬럼들 중 원하는 컬럼에 대해서만 선택적으로 등가 조인이 가능. SQL Server에서는 지원 X

SELECT * FROM 테이블1 JOIN 테이블2
USING(기준컬럼);  
-- USING 조건절 사용시 컬럼이나 테이블에 별칭을 붙일 수 없음

 

NATURAL JOIN

두 테이블 간에 동일한 이름의 컬럼들을 모두 등가 조인으로 결합시키는 것. INNER JOIN과 달리 별칭 지정 불가.

SELECT * FROM 테이블1 NATURAL JOIN 테이블2
-- 추가로 ON 조건절이나 USING 조건절, WHERE절에서 JOIN 조건 정의 불가 (필요하지도 않음)

 

CROSS JOIN

JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 조회.

SELECT * FROM PERSON
(CROSS) JOIN PUBLIC_TRANSPORT;

CROSS JOIN의 CROSS도 INNER JOIN의 INNER처럼 생략을 할 수 있는데, 그럼 얘네 둘이 다 앞이 생략되면 어떻게 구분하냐? -> INNER JOIN에는 당연히 ON 조건절이나 USING 조건절이 무조건 들어가야 함. 그런데, INNER JOIN에서 ON 조건절이나 USING 조건절을 사용하지 않으면 그거 자체로 CROSS JOIN이 되는거. 조건을 지정해주지 않았으니까 모든 경우의 수가 나오게 됨.

 

 

OUTER JOIN

두 개의 테이블 간에 교집합을 조회하고, 한쪽 테이블에만 있는 데이터도 포함시켜서 조회. 한쪽 테이블에만 있는 데이터도 있으면, 없는 다른 쪽에 빈 곳은 NULL 값으로 출력한다. WHERE 조건절에서 한쪽에만 있는 데이터를 포함시킬 테이블 쪽으로 (+) 기호를 위치시키면 됨.

 

SELECT * FROM USER, CLASS
WHERE USER.CLASS_ID (+)= CLASS.CLASS_ID;

(+) 기호가 왼쪽에 있으니까, 왼쪽에 있는 건 USER 테이블. USER 테이블에 있는 모든 데이터를 출력한다는 뜻. 그리고 그거에 맞춰서 CLASS 테이블이 들어오는데, 값이 없는 애들은 NULL로 조회가 된다.

 

 

SELF JOIN

셀프 조인은 테이블이 다른 테이블이 아니라 자기 자신 테이블과 조인한다는 의미. 셀프 조인을 하면 테이블과 컬럼 이름이 모두 동일하기 때문에 각각을 식별하기 위해선 별칭이 필수.

SELECT ALPHA.컬럼명, BETA.컬럼명, ...
FROM 테이블1 ALPHA, 테이블1 BETA    /* 셀프 조인 시 별칭을 지정해줘야 구분이 가능 */
WHERE ALPHA.컬럼명2 = BETA.컬럼명1;

셀프 조인 예시- 계층형 질의

SELECT ALPHA.사원번호, ALPHA.관리자, BETA.관리자 차상위
FROM 직원 ALPHA, 직원 BETA
WHERE APLHA.관리자 (+)= BETA.사원번호;

 

728x90
반응형
댓글