조인(JOIN)에 대해 알아보고 다양한 조인에 대해서 차이점을 알아봅시다.
목차
조인(JOIN)이란
두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것을 말합니다. 실무에서는 대부분이 JOIN을 이용하여 SQL을 작성하게 됩니다. JOIN은 관계형 데이터베이스의 가장 큰 장점이자 대표적인 핵심 기능이라고 할 수 있습니다. 일반적으로는 PK(Primary Key)와 FK(Foreign Key) 값의 연관에 의해서 JOIN이 성립됩니다. 단, 연관관계를 가지고 있지 않는 경우도 JOIN을 할 수 있습니다.
EQUI JOIN 동등 조인 / NON EQUI JOIN 비동등 조인
EQUI JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용됩니다. 대부분 PK-FK 관계를 기반으로 합니다. JOIN의 조건은 WHERE 절에 기술하게 되며 ' = ' 연산을 사용합니다.
SELECT 테이블1.칼럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;
학생 | |
학번 | 이름 |
1 | 심길동 |
2 | 이길동 |
수강 | ||
번호 | 학번 | 수강과목 |
1 | 1 | 컴퓨터 |
2 | 2 | 데이터베이스 |
SELECT 학생.이름 수강.수강과목
FROM 학생, 과목
WHERE 학생.학번 = 수강.학번
학생테이블로는 학생이 어떤 수강과목을 듣고 있는지 확인할 수 없습니다. 수강 테이블로는 수강과목을 듣고 있는 학생의 이름은 알 수 없다. 따라서 두 테이블을 조인을 하여 원하는 결과를 얻을 수 있습니다. 위 SQL 예제는 두 테이블을 조인하여 학생이름과 수강과목을 조회하는 쿼리입니다.
결과 | |
이름 | 수강과목 |
심길동 | 컴퓨터 |
이길동 | 데이터베이스 |
NON EQUI JOIN은 EQUI JOIN과는 다르게 = 연산이 아닌 다른 연산자를 사용하여 조인하는 방법입니다. 연산자로는 BEWEEN, > , >= . <. <= 등이 있습니다. 대표적인 형태는 다음과 같습니다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼러명1 <= 테이블2.컬렴명1
학생 | 학점등급 | ||||
학번 | 이름 | 학점 | 등급 | 최소 | 최대 |
1 | 심길동 | 3.5 | 1 | 3.1 | 4.0 |
2 | 이길동 | 2.0 | 2 | 1.0 | 3.0 |
결과 | |
이름 | 등급 |
심길동 | 1 |
이길동 | 2 |
위와 같은 결과를 얻기 위해서는 학생과 학점등급 테이블을 NON EQUI JOIN 하여 학점 등급의 최소/최대 값에 포함되는 등급을 찾아 출력해야합니다. SQL은 다음과 같습니다.
SELECT 학생.이름, 학점등급.등급
FROM 학생, 학점등급
WHERE 학생.학점 BETWEEN 학점등급.최소 AND 학점등급.최대
INNER JOIN / OUTER JOIN / NATURAL JOIN
INNER JOIN / OUTER JOIN / NATURAL JOIN의 이해를 돕기위해 다음과 같이 학생 테이블과 수강테이블이 구성되어 있습니다. 학생 테이블의 학번과 수강 테이블의 학번은 PK-FK 관계이며 타입과 칼럼명이 동일합니다.
학생 | |
학번 | 이름 |
1 | 심길동 |
2 | 이길동 |
3 | 김길동 |
수강 | ||
번호 | 학번 | 수강과목 |
1 | 1 | 컴퓨터 |
2 | 2 | 데이터베이스 |
3 | 1 | 경제학 |
INNER JOIN은 내부 조인이라고 하며 JOIN 조건에서 동일한 값이 있는 행만 반환됩니다. FROM 절에 JOIN 조건을 정의하며 INNER JOIN은 JOIN의 디폴트 옵션으로 INNER는 생략이 가능합니다.
--INNER JOIN 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 INNER JOIN 수강
ON 학생.학번 = 수강.학번;
--INNER를 생략하여 사용가능
SELECT 학생.이름, 수강.수강과목
FROM 학생 JOIN 수강
ON 학생.학번 = 수강.학번;
-- WHERE 절을 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 수강
WHERE 학생.학번 = 수강.학번;
결과 | |
이름 | 수강과목 |
심길동 | 컴퓨터 |
이길동 | 데이터베이스 |
심길동 | 경제학 |
INNER JOIN의 결과로 수강테이블에 학번이 존재하는 학생들만 출력이 되었고 김길동 학생은 수강테이블에 존재하지 않았기 때문에 출력되지 않았습니다.
OUTER JOIN 내부조인과 달리 JOIN 조건에서 동일한 값이 없는 행 또한 반환 할 수 있습니다.
LEFT OUTER JOIN
조인 수행시 좌측 테이블이 기준이 되어 조인을 진행합니다.
--LEFT OUTER JOIN 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 LEFT OUTER JOIN 수강
ON 학생.학번 = 수강.학번;
--OUTER 생략
SELECT 학생.이름, 수강.수강과목
FROM 학생 LEFT JOIN 수강
ON 학생.학번 = 수강.학번;
결과 | |
이름 | 수강과목 |
심길동 | 컴퓨터 |
심길동 | 경제학 |
이길동 | 데이터베이스 |
김길동 | NULL |
RIGHT OUTER JOIN
조인 수행시 우측 테이블이 기준이 되어 조인을 진행합니다.
--RIGHT OUTER JOIN 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 RIGHT OUTER JOIN 수강
ON 학생.학번 = 수강.학번;
--OUTER 생략
SELECT 학생.이름, 수강.수강과목
FROM 학생 RIGHT JOIN 수강
ON 학생.학번 = 수강.학번;
결과 | |
이름 | 수강과목 |
심길동 | 컴퓨터 |
이길동 | 데이터베이스 |
심길동 | 경제학 |
FULL OUTER JOIN
조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성합니다. 두 테이블의 합집합과 같습니다. 따라서 LEFT OUTER와 RIGHT OUTER 결과에 중복을 제거하여 더한 결과와 같습니다.
--FULL OUTER JOIN 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 FULL OUTER JOIN 수강
ON 학생.학번 = 수강.학번;
--OUTER 생략
SELECT 학생.이름, 수강.수강과목
FROM 학생 FULL JOIN 수강
ON 학생.학번 = 수강.학번;
--LEFT OUTER RIGHT OUTER JOIN 사용
SELECT 학생.이름, 수강.수강과목
FROM 학생 LEFT OUTER JOIN 수강
ON 학생.학번 = 수강.학번
UNION
SELECT 학생.이름, 수강.수강과목
FROM 학생 RIGHT OUTER JOIN 수강
ON 학생.학번 = 수강.학번;
결과 | |
이름 | 수강과목 |
심길동 | 컴퓨터 |
심길동 | 경제학 |
이길동 | 데이터베이스 |
김길동 | NULL |
NATURAL JOIN은 자연조인이라하여 두 테이블에서 칼럼명이 똑같고 타입이 정확히 똑같은 칼럼들을 모두 조인합니다.
NATURAL JOIN의 결과를 보면 학번칼럼이 두 테이블의 공통이기 때문에 학번으로 기준이 되어 조인된 것을 확인할 수 있습니다. JOIN 칼럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없습니다. ( 학생. 학번(X) -> 학번(O) )
SELECT *
FROM 학생 NATURAL JOIN 수강;
자연조인은 동일한 칼럼명과 타입을 가진 모든 칼럼을 가지고 조인을 하지만 USING 구문을 통해서 원하는 칼럼에 대해서만 선택적으로 조인을 할 수 있습니다. USING절 칼럼 부분은 식별자를 가질 수 없습니다.
SELECT *
FROM 학생 JOIN 수강
USING (학번);
위 SQL의 구문처럼 * 를 하여 별도의 칼럼 순서를 지정하지 않으면 조인절의 기준이 되는 칼럼이 제일 먼저 출력되게 됩니다.
결과 | ||
학번 | 번호 | 수강과목 |
1 | 1 | 컴퓨터 |
2 | 2 | 데이터베이스 |
1 | 3 | 경제학 |
CROSS JOIN
CROSS JOIN은 집합 연산자의 PRODUCT의 개념을 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 경우의 데이터 조합을 반환합니다.
학생 | |
학번 | 이름 |
1 | 심길동 |
2 | 이길동 |
3 | 김길동 |
수강 | ||
번호 | 학번 | 수강과목 |
1 | 1 | 컴퓨터 |
2 | 2 | 데이터베이스 |
3 | 1 | 경제학 |
SELECT 학번, 번호
FROM 학생 CROSS JOIN 수강
ORDER BY 학번
학번 | 번호 |
1 | 1 |
1 | 2 |
1 | 3 |
2 | 1 |
2 | 2 |
2 | 3 |
3 | 1 |
3 | 2 |
3 | 3 |
결과도는 모든 경우의 수가 나오게 되어 학생 테이블 행 3개 수강 테이블 행 3개를 곱한 9개의 결과를 반환하게 됩니다.
'IT경험공유 > DataBase' 카테고리의 다른 글
DB/SQL-고급집계함수 ROLLUP, GROUPING SETS, CUBE (0) | 2023.03.14 |
---|---|
[DB/SQL] 윈도우 함수 LEAD/LAG (Feat. Partition by ) (0) | 2023.03.13 |
[DB/ORACLE/MSSQL(SQLSERVER)] NULL의 이해 (NVL,NVL2,NULLIF,COALESCE) (0) | 2023.03.10 |
[DB/ORACLE/SQLSERVER] 테이블 명 변경 / 테이블 칼럼 추가/수정/삭제/변경 하는 방법 - ALTER TABLE / RENAME (0) | 2023.03.08 |
[DB] 국가공인자격증 SQLD (0) | 2023.03.06 |
댓글