반응형
해당 글에서는 데이터베이스의 JOIN에 대해 이해하고 각각의 종류에 대해서 이해를 돕기 위해서 작성한 글입니다.
1) JOIN
💡 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 일 경우 오른쪽에 (+) 기호가 붙습니다.
2) JOIN의 종류
💡 내부/외부 조인을 이해하고 테스트를 위해 SQL 스크립트와 데이터베이스 다이어그램을 포함하였습니다.
💡 SQL 스크립트
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department_id INTEGER
);
CREATE TABLE departments (
id INTEGER PRIMARY KEY,
name TEXT
);
INSERT INTO employees (id, name, department_id)
VALUES (1, 'Alice', 1),
(2, 'Bob', 1),
(3, 'Charlie', 2),
(4, 'Dave', 3);
INSERT INTO departments (id, name)
VALUES (1, 'Sales'),
(2, 'Marketing'),
(3, 'Engineering');
departments 테이블
employees 테이블
[ 더 알아보기 ]
💡 SQL 스크립트(Script)란?
- SQL 스크립트는 SQL 문장들의 모음으로 데이터베이스에 대한 명령어들을 포함합니다. SQL 스크립트를 사용하여 데이터베이스를 생성, 수정, 삭제 및 쿼리 할 수 있습니다.
💡 SQL 다이어그램(Diagram) 이란?
- 데이터베이스 다이어그램은 데이터베이스 내부의 테이블, 열, 관계 등을 시각적으로 표현한 도표입니다.
- 엔티티(테이블): 데이터베이스 내부의 테이블을 나타내는 사각형으로 표현됩니다.
- 속성(컬럼): 테이블 내부의 열을 나타내는 타원형으로 표현됩니다.
- 관계 : 테이블 간의 관계를 나타내며, 일반적으로 화살표로 표현됩니다.
1. 내부 조인(INNER JOIN)
💡 INNER JOIN 이란?
- 두 테이블에서 ‘공통된 값’을 가지고 있는 행들만을 반환합니다.
SELECT *
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.열 = 테이블2.열;
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘INNER JOIN' 합니다.
- employee의 ‘department_id’ 칼럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’을 기반으로 행을 출력합니다.
-- INNER JOIN
SELECT employees.name, departments.name
FROM employees
INNER JOIN 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은 일반적으로 테이블 간의 관계가 없을 때 사용됩니다. 각 행의 모든 가능한 조합을 만들기 때문에 결과가 매우 큰 테이블이 될 수 있으므로 사용에 주의가 필요합니다.
SELECT 테이블1.열, 테이블2.열
FROM 테이블1
CROSS JOIN 테이블2;
2. 외부 조인(OUTER JOIN)
💡 OUTER JOIN 이란?
- Outer Join은 두 테이블에서 ‘공통된 값을 가지지 않는 행들’도 반환합니다.
- Left Join, Right Join, Full Join의 종류가 있습니다.
1. LEFT OUTER JOIN
💡LEFT JOIN 이란?
- ’왼쪽 테이블의 모든 행’과 ‘오른쪽 테이블에서 왼쪽 테이블과 공통된 값’을 가지고 있는 행들을 반환합니다.
- 만약 오른쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환합니다.
SELECT *
FROM 테이블1
LEFT JOIN 테이블2
ON 테이블1.열 = 테이블2.열;
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘LEFT OUTER JOIN’ 합니다.
- employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘emplyoee’의 모든 값을 가져옵니다.
-- LEFT JOIN
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
[ 더 알아보기 ]
💡 Left Join과 Right Join 중 무엇을 많이 사용할까?
- 상황에 따라 다르지만 대체로 'Left Join'을 더 많이 사용합니다. 이는 대부분의 경우 왼쪽 테이블의 데이터를 중심으로 분석하고자 할 때가 많기 때문입니다.
2. RIGHT OUTER JOIN
💡 RIGHT JOIN이란?
- Left Join과 반대로 ‘오른쪽 테이블의 모든 행’과 ‘왼쪽 테이블에서 오른쪽 테이블과 공통된 값’을 가지고 있는 행들을 반환합니다. 만약 왼쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환합니다.
SELECT *
FROM 테이블1
RIGHT JOIN 테이블2
ON 테이블1.열 = 테이블2.열;
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘RIGHT OUTER JOIN’ 합니다.
- employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘departments’의 모든 값을 가져옵니다.
-- RIGTH JOIN
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
3. FULL OUTER JOIN
💡 FULL OUTER JOIN 이란?
- 두 테이블에서 ‘모든 값’을 반환합니다. 만약 공통된 값을 가지고 있지 않는 행이 있다면 NULL 값을 반환합니다.
SELECT *
FROM 테이블1
FULL OUTER JOIN 테이블2
ON 테이블1.열 = 테이블2.열;
[ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘FULL OUTER JOIN’ 합니다.
- employee의 ‘department_id’ 컬럼과 departments의 ‘id’의 키 값을 기반으로 ‘공통된 값’과 ‘emplyoee’와 ‘departments’의 모든 값을 가져옵니다.
-- FULL JOIN
SELECT employees.name, departments.name
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;
3) UNION / UNION ALL
💡 Join과는 별개로 두 개의 테이블을 합치는 방법에 대해서 확인해 봅니다. 해당 UNION과 UNION ALL은 내/외부 조인과는 관련이 없습니다.
[ 더 알아보기 ]
💡 Full Outer Join과 Union / Union All과의 차이는 무엇인가?
- Full Outer Join과 Union / Union All은 두 개 이상의 테이블에서 ‘레코드(컬럼)’를 결합하는 방법입니다.
- Full Outer Join의 경우는 ‘일치하지 않는 레코드(컬럼)도 포함’하는 결과로 반환하며, Union / Union All의 경우는 ‘일치하는 레코드(컬럼)만’ 반환합니다.
1. UNION
💡 UNION 이란?
- 두 개의 테이블에서 ‘중복을 제거하고 합친 모든 행'을 반환합니다.
SELECT 테이블1.컬럼1, 테이블1.컬럼2 FROM 테이블1
UNION
SELECT 테이블2.컬럼1, 테이블2.컬럼2 FROM 테이블2
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘UNION' 합니다.
- employees의 테이블에서 'name' 컬럼과 departments의 테이블에서 'name' 컬럼의 모든 값을 가져와서 중복을 제거하고 합칩니다.
SELECT employees.name FROM employees
UNION
SELECT departments.name FROM departments
2. UNION ALL
💡 UNION All 이란?
- 두 개의 테이블에서 ‘중복을 제거하지 않고 모두 합친 모든 행'을 반환합니다
SELECT 테이블1.컬럼1, 테이블1.컬럼2 FROM 테이블1
UNION ALL
SELECT 테이블2.컬럼1, 테이블2.컬럼2 FROM 테이블2
💡 [ 예시 설명 ]
- employees 테이블과 departments 테이블을 ‘UNION ALL' 합니다.
- employees의 테이블에서 'name' 컬럼과
departments의 테이블에서 'name' 컬럼의 모든 값을 가져와서 중복을 포함하여 합칩니다.
SELECT employees.name FROM employees
UNION ALL
SELECT departments.name FROM departments
4) 기타 궁금증 해결
1. 명령문만 대문자로 작성하는 이유는?
💡 SQL 명령문이란?
- SQL은 데이터베이스에서 정보를 검색, 추가, 수정 및 삭제하는 데 사용되는 언어입니다.
💡 SQL 명령문만 대문자를 작성하는 이유는?
- SQL 명령문은 대소문자를 구분하지 않습니다. 그러나 많은 개발자들이 SQL 명령문을 대문자로 작성합니다.
- 아래와 같은 이유로 SQL 명령문을 대문자로 선택합니다.
1. 가독성: SQL 명령문을 대문자로 작성하면 코드의 가독성이 향상됩니다. 대문자는 작은 글자보다 더욱 눈에 띄기 때문입니다.
2. 표준화: SQL 명령문을 대문자로 작성하면 표준화된 코딩 스타일을 따를 수 있습니다. 이는 코드 유지 보수 및 공유에 유용합니다.
3. 오류 방지: 대문자로 작성된 SQL 명령문은 오타나 실수를 방지할 수 있습니다. 대소문자를 구분하지 않기 때문에 대문자로 작성하면 명령문의 오타를 더 쉽게 찾을 수 있습니다.
2. WHERE 1=1 사용 이유는?
💡 WHERE 1=1 사용 이유는?
- 주로 동적 쿼리를 작성할 때 사용됩니다. 동적 쿼리는 사용자가 선택한 조건에 따라 쿼리의 WHERE 절을 동적으로 생성하는 것을 의미합니다.
- WHERE 1=1을 사용하면 이후에 추가될 조건들을 AND나 OR로 간단하게 연결할 수 있습니다. 또한, WHERE 절에 조건이 없는 경우 WHERE 1=1을 사용하면 전체 데이터를 가져올 수 있습니다.
3. Join 알고리즘
💡 Join 알고리즘 이란?
- Join은 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과 테이블로 만드는 작업을 의미합니다. 이때 Join 알고리즘을 사용하는데, Inner Join, Outer Join, Cross Join 등이 있습니다. Join은 테이블을 연결하는 작업을 말하고, Join 알고리즘은 그 작업을 수행하는 알고리즘을 의미합니다.
4. 간단하게 알아보는 Join 알고리즘
💡 Nested Loop 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가 많아져 성능이 떨어질 수 있습니다.
오늘도 감사합니다. 😀
반응형
'DB > 이론 및 문법' 카테고리의 다른 글
[DB/Postgres] PL/pgSQL 구성하기 -2 : DBeaver 기반 구축 및 활용 (0) | 2023.04.17 |
---|---|
[DB/Postgres] 테이블 스캔 -1 : 전체, 인덱스(전체, 범위, 고유, 루스, 병합) 스캔 (2) | 2023.04.09 |
[DB/Postgres] GROUP BY, ORDER BY, LIMIT 이해하기 -1 (0) | 2023.04.08 |
[DB/Postgres] PL/pgSQL이해하기 -1 : Function, Stored Procedure (0) | 2023.04.08 |
[DB/Postgres] 서브쿼리(Subquery) / WITH 절 이해하기 -1 (0) | 2023.04.06 |