JOIN
JOIN은 두 개 이상의 테이블을 연결 혹은 결합하여 데이터를 출력하는 것이다.
- 일반적으로 PK와 FK의 연관에 의해 성립된다. 없어도 논리적인 값들의 연관으로 성립이 가능하다.
- 대표적인 조인의 종류로 내부조인, 외부조인, ANSI조인이 있다.
- ORM에서 FK키를 참조할 때 발생하는 SQL문이다.
Oracle 문법에서는 `JOIN`이라는 명령어를 사용하지 않고 WHERE 조건절에서 JOIN을 지정한다.
반면, ANSI 표준 문법은 다른 SQL 프로그램에서도 공통적으로 사용 가능한 문법으로 JOIN 명령어를 사용 가능하다.
내부 조인(INNER)
EQUI JOIN(=)
2개의 테이블 간 컬럼이 정확하게 일치하는 경우 사용하는 JOIN이다.
SELECT A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A, DEPT B
WHERE A.DEPT_ID = B.DEPT_ID;
ANSI 문법으로 명시적 표현
SELECT A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;
NON-EQUI JOIN
값을 비교하는 연산자를 이용해 두 테이블을 연결하는 JOIN이다. 반드시 투 컬럼의 값이 일치하지 않더라도 JOIN을 할 수 있는 경우이다.
`BETWEEN` 말고도 `<>=`등 연산자를 사용해도 된다.
SELECT A.USER_NAME, B.GRADES
FROM USER A, GRADE B
WHERE A.SCORE BETWEEN B.MINSCORE AND B.MAXSCORE;
ANSI 문법으로 명시적 표현
SELECT A.USER_NAME, B.GRADES
FROM USER A JOIN GRADE B ON A.SCORE BETWEEN B.MINSCORE AND B.MAXSCORE
SELF JOIN
한 테이블 내에 두 컬럼이 연관 관계가 있을 때, 동일한 테이블에서 조인하는 것을 말한다.
SELECT A.name, B.name
FROM USER A, USER B
WHERE A.no = B.id;
외부 조인(OUTER)
LEFT JOIN, RIGHT JOIN
같은 값이 없는 경우에도 기준이 되는 테이블의 모든 레코드를 출력하는 JOIN이다.
예를 들어, LEFT 기준이라면 RIGHT의 값에는 값이 없더라도 LEFT의 모든 레코드를 출력하는 것이다.
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A, DEPT B
WHERE A.DEPT_ID = B.DEPT_ID(+);
해당 JOIN은 `USER` 테이블에 대한 LEFT JOIN이다. 그러므로 다음과 같이 출력될 수 있다.
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A LEFT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;
FULL JOIN
모든 데이터를 읽어 JOIN하고 중복데이터는 삭제하는 방식이다.
MYSQL에서는 명시적인 SQL 문법을 지원하지 않기 때문에 `UNION` 명령어를 사용해 완전 외부 조인을 수행할 수 있다.
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A LEFT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
UNION
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A RIGHT JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;
해당 JOIN은 `USER` 테이블에 대한 LEFT JOIN이다. 그러므로 다음과 같이 출력될 수 있다.
SELECT A.USER_ID, A.USER_NAME, B.DEPT_ID, B.DEPT_NAME
FROM USER A FULL JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID;
집합 연산자
집합 연산자는 두개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 때 사용한다.
• UNION : 합집합, 중복행은 1개로 정렬
• UNION ALL : 합집합, 중복행도 표시
• INTERSECT : 교집합, 중복행은 1개로
• EXCEPT : A에 대해 B를 차(-)한 집합 중복행 은 1개로(A-B), Oracle은 MINUS를 사용한다.
• CROSS JOIN : 곱집합(Product)
CROSS JOIN
두 테이블에 대해 카타시안 곱을 수행한 JOIN이다.
두 테이블의 행의 모든 조합을 반환한다고 생각하면 된다.
- 레코드의 수 : 테이블 A의 레코드 X 테이블 B의 레코드
SELECT *
FROM STUDENT, BELONGING;
JOIN 알고리즘
Nested Loop Join
선행 테이블의 처리 범위를 하나씩 접근하면서 추출된 값으로 연결할 테이블을 조인하는 방식을 말한다.
다음 SQL 질의문을 보자.
먼저, 학과(DEPT)의 아이디 중 2라는 데이터를 찾아 추출하고 추출한 2를 바탕으로 `USER` 테이블을 조인하는 것으로 이해할 수 있다.
SELECT *
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
WHERE B.DEPT_ID LIKE '2'
Sort Merge Join
양쪽 테이블의 처리범위를 각자 접근한 다음, 정렬 결과를 차례대로 SCAN하면서 조건으로 Merge하는 방식을 말한다.
SELECT *
FROM USER A JOIN DEPT B ON A.DEPT_ID = B.DEPT_ID
WHERE B.DEPT_ID =2 AND A.SCORE > 60
Hash Join
해시 조인은 해시 값을 이용해 테이블을 조인하는 방식이다.
오늘도 저의 포스트를 읽어주셔서 감사합니다. ☕️
설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.
'SQLD' 카테고리의 다른 글
[SQLD] 인덱스 (0) | 2024.03.11 |
---|---|
[SQLD] 정규화의 필요성 (0) | 2024.03.02 |
[SQL] 터미널로 MySQL, PostgreSQL 설치하기 (MacOS) (0) | 2024.02.27 |
[SQLD] 윈도우 함수 (0) | 2024.01.27 |
[SQL/DB]NoSQL과 SQL는 무슨 차이가 있는 걸까? (0) | 2024.01.08 |