💡 JOIN 이란? - 데이터베이스에서 ‘두 개 이상의 테이블’을 연결하여 ‘하나의 결과의 테이블’로 만드는 것을 의미하며 이를 통해 데이터를 효율적으로 검색하고 처리하는데 도움을 줍니다.
- JOIN을 사용하는 이유는 데이터베이스에서 테이블을 분리하여 ‘데이터 중복을 최소화’하고 ‘데이터의 일관성’을 유지하기 위함입니다. - 대표적으로 INNER JOIN, OUTER JOIN(LEFT, RIGHT, FULL) 등이 있으며 각각의 JOIN 방식에 따라 결과가 달라집니다.
[ 더 알아보기 ]
💡 ANSI JOIN 방식이란?
- ANSI JOIN은 ANSI SQL 표준에 따라 작성된 코드를 의미하며 데이터베이스 테이블 간의 관계를 맺는 방법 중 하나로 다양한 데이터베이스 관리 시스템에서 동일하게 작동합니다. 이를 통해 코드의 이식성을 높일 수 있습니다. - ANSI JOIN은 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN과 같은 다양한 JOIN 유형을 지원합니다.
💡 ANSI SQL 표준이란?
- ANSI SQL(미국 국립표준협회 SQL)에서 SQL(Structured Query Language)을 표준화한 표준 규격입니다. ANSI SQL은 데이터베이스 관리 시스템(DBMS)과 호환성을 보장하고 데이터베이스에 대한 표준적인 질의 언어를 제공합니다.
💡 (+) 기호는 무엇을 의미하는가?
- SQL에서 (+) 기호는 Oracle 데이터베이스에서 사용되는 구식 조인 문법입니다. 이 기호는 조인 연산자로 사용되며, 특정 테이블의 조인 조건을 설명하는 데 사용됩니다. 조건절에 조인의 기준을 정합니다. - LEFT JOIN 일 경우 왼쪽에 (+) 기호가 붙으며 RIGHT JOIN 일 경우 오른쪽에 (+) 기호가 붙습니다.
- employees 테이블과 departments 테이블을 ‘INNER JOIN' 합니다. - employee의 ‘department_id’ 칼럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’을 기반으로 행을 출력합니다.
-- INNER JOINSELECT employees.name, departments.name
FROM employees
INNERJOIN departments
ON employees.department_id = departments.id;
[ 더 알아보기 ] 💡 Inner Join에서 ON 절 대신에 WHERE 절을 사용할 수 있지 않을까?
- 사용이 가능하지만 WHERE 절은 행들을 제한하기 위한 것이며 ON 절은 조인을 위한 것입니다. ON 절을 사용하면 더 명확하고 효율적으로 쿼리를 작성할 수 있습니다.
1. SELF INNER JOIN
💡 Self Inner Join 이란?
- 하나의 테이블 내에서 다른 열을 참조하기 위해 사용하는 '자기 자신과의 조인' 방법입니다. 이를 통해 데이터베이스에서 한 테이블 내의 레코드를 다른 레코드와 연결할 수 있습니다.
SELECT 테이블1.열, 테이블2.열
FROM 테이블1 t1
JOIN 테이블1 t2
ON 테이블1.열 = 테이블2.열;
2. CROSS INNER JOIN
💡 Cross Inner Join 이란?
- 두 개 이상의 테이블에서 '모든 가능한 조합'을 만들어 결과를 반환하는 조인 방법입니다. 이를 통해 두 개 이상의 테이블을 조합하여 새로운 테이블을 생성할 수 있습니다 - Cross Join은 일반적으로 테이블 간의 관계가 없을 때 사용됩니다. 각 행의 모든 가능한 조합을 만들기 때문에 결과가 매우 큰 테이블이 될 수 있으므로 사용에 주의가 필요합니다.
- Outer Join은 두 테이블에서 ‘공통된 값을 가지지 않는 행들’도 반환합니다. - Left Join, Right Join, Full Join의 종류가 있습니다.
1. LEFT OUTER JOIN
💡LEFT JOIN 이란?
- ’왼쪽 테이블의 모든 행’과 ‘오른쪽 테이블에서 왼쪽 테이블과 공통된 값’을 가지고 있는 행들을 반환합니다. - 만약 오른쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환합니다.
SELECT*FROM 테이블1LEFTJOIN 테이블2ON 테이블1.열 = 테이블2.열;
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘LEFT OUTER JOIN’ 합니다. - employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘emplyoee’의 모든 값을 가져옵니다.
-- LEFT JOINSELECT employees.name, departments.name
FROM employees
LEFTJOIN departments
ON employees.department_id = departments.id;
[ 더 알아보기 ] 💡 Left Join과 Right Join 중 무엇을 많이 사용할까?
- 상황에 따라 다르지만 대체로 'Left Join'을 더 많이 사용합니다. 이는 대부분의 경우 왼쪽 테이블의 데이터를 중심으로 분석하고자 할 때가 많기 때문입니다.
2. RIGHT OUTER JOIN
💡 RIGHT JOIN이란?
- Left Join과 반대로 ‘오른쪽 테이블의 모든 행’과 ‘왼쪽 테이블에서 오른쪽 테이블과 공통된 값’을 가지고 있는 행들을 반환합니다. 만약 왼쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환합니다.
SELECT *
FROM 테이블1RIGHT JOIN 테이블2ON 테이블1.열 = 테이블2.열;
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘RIGHT OUTER JOIN’ 합니다. - employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘departments’의 모든 값을 가져옵니다.
-- RIGTH JOINSELECT employees.name, departments.name
FROM employees
RIGHTJOIN departments
ON employees.department_id = departments.id;
3. FULL OUTER JOIN
💡 FULL OUTER JOIN 이란?
- 두 테이블에서 ‘모든 값’을 반환합니다. 만약 공통된 값을 가지고 있지 않는 행이 있다면 NULL 값을 반환합니다.
- employees 테이블과 departments 테이블을 ‘FULL OUTER JOIN’ 합니다. - employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘emplyoee’와 ‘departments’의 모든 값을 가져옵니다.
-- FULL JOINSELECT employees.name, departments.name
FROM employees
FULLJOIN departments
ON employees.department_id = departments.id;
💡 Join과는 별개로 두 개의 테이블을 합치는 방법에 대해서 확인해 봅니다. 해당 UNION과 UNION ALL은 내/외부 조인과는 관련이 없습니다.
[ 더 알아보기 ]
💡 Full Outer Join과 Union / Union All과의 차이는 무엇인가?
- Full Outer Join과 Union / Union All은 두 개 이상의 테이블에서 ‘레코드(컬럼)’를 결합하는 방법입니다. - Full Outer Join의 경우는 ‘일치하지 않는 레코드(컬럼)도 포함’하는 결과로 반환하며, Union / Union All의 경우는 ‘일치하는 레코드(컬럼)만’ 반환합니다.
- SQL은 데이터베이스에서 정보를 검색, 추가, 수정 및 삭제하는 데 사용되는 언어입니다.
💡 SQL 명령문만 대문자를 작성하는 이유는?
- SQL 명령문은 대소문자를 구분하지 않습니다. 그러나 많은 개발자들이 SQL 명령문을 대문자로 작성합니다.
- 아래와 같은 이유로 SQL 명령문을 대문자로 선택합니다. 1. 가독성: SQL 명령문을 대문자로 작성하면 코드의 가독성이 향상됩니다. 대문자는 작은 글자보다 더욱 눈에 띄기 때문입니다. 2. 표준화: SQL 명령문을 대문자로 작성하면 표준화된 코딩 스타일을 따를 수 있습니다. 이는 코드 유지 보수 및 공유에 유용합니다. 3. 오류 방지: 대문자로 작성된 SQL 명령문은 오타나 실수를 방지할 수 있습니다. 대소문자를 구분하지 않기 때문에 대문자로 작성하면 명령문의 오타를 더 쉽게 찾을 수 있습니다.
- Join은 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과 테이블로 만드는 작업을 의미합니다. 이때 Join 알고리즘을 사용하는데, Inner Join, Outer Join, Cross Join 등이 있습니다. Join은 테이블을 연결하는 작업을 말하고, Join 알고리즘은 그 작업을 수행하는 알고리즘을 의미합니다.
- 하나의 테이블을 루프 하면서 다른 테이블을 루프 하며 두 테이블의 조인 조건이 맞는지 확인합니다. 두 테이블 중 작은 테이블을 먼저 루프 하고, 큰 테이블을 뒤에 루프 하면 효율적입니다. - 하지만 데이터 양이 많을 경우 성능이 좋지 않습니다. 이는 루프 내에서 조인 조건을 비교하기 때문입니다
💡 Block Nested Loop Join 이란?
- Nested Loop Join의 성능을 개선한 알고리즘입니다. Block Nested Loop Join은 두 테이블을 블록 단위로 처리합니다. 블록은 메모리에 올라가는 크기로 결정되며, 블록 단위로 조인을 수행합니다. 이를 통해 Nested Loop Join의 성능 문제를 완화할 수 있습니다. 하지만 블록 크기를 결정하는 것이 어렵기 때문에 최적의 성능을 보장하지 못할 수 있습니다.
💡 Sort Merge Join 이란?
- 두 테이블을 각각 정렬한 다음에 조인하는 알고리즘입니다. 정렬된 데이터를 이용하기 때문에 Nested Loop Join보다 빠른 속도를 보입니다. - 하지만 정렬에 대한 비용이 추가되므로, 조인할 데이터의 크기가 작을 경우에는 Nested Loop Join이 더 빠를 수 있습니다
💡 Index Join 이란?
- Index Join은 Join 대상 테이블의 인덱스를 이용하여 조인하는 알고리즘입니다. Index Join은 인덱스를 이용하기 때문에 매우 빠른 속도를 보입니다. - 하지만 인덱스를 만들어야 하기 때문에 인덱스 생성 비용이 추가됩니다. 또한, 인덱스를 이용할 수 있는 경우가 제한적이기 때문에 모든 경우에 적용할 수 없습니다.
💡 Hash Join 이란?
- 두 테이블을 Hash Table로 변환한 다음에 조인하는 알고리즘입니다. Hash Table을 이용하기 때문에 매우 빠른 속도를 보입니다. 하지만 Hash Table을 만드는 데에는 메모리가 많이 필요하며, 조인할 데이터의 크기가 클 경우에는 디스크 I/O가 많아져 성능이 떨어질 수 있습니다.