이전 포스트:
2025.02.13 - [자격증/SQLD] - [SQLD] Chapter 3-2 GROUP BY & HAVING & ORDER
[SQLD] Chapter 3-2 GROUP BY & HAVING & ORDER
1. GROUP BY 개념GROUP BY 절은 데이터를 특정 기준에 따라 그룹화하여 집계 연산을 수행할 때 사용됩니다. SUM(), AVG(), COUNT(), MAX(), MIN()과 같은 집계 함수(Aggregate Function)와 함께 사용됩니다.1.1 GROUP BY
rnasterofmysea.tistory.com
SQLD Chapter 3-3: JOIN (조인)
1. JOIN 개념
JOIN은 두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법입니다. 관계형 데이터베이스에서는 여러 테이블에 데이터를 분산 저장하므로, 조인을 활용하여 데이터를 결합하는 것이 필수적입니다.
1.1 JOIN의 기본 구문
SELECT A.열_이름, B.열_이름
FROM 테이블A A
JOIN 테이블B B ON A.공통_열 = B.공통_열;
1.2 JOIN 종류
조인의 종류는 다음과 같이 분류됩니다:
- EQUI JOIN: 동등 비교(=) 연산자를 사용하는 조인
- NON-EQUI JOIN: 동등 비교가 아닌 조건을 사용하는 조인
- TABLE JOIN: 기본적인 테이블 간의 조인
- INNER JOIN: 일치하는 행만 반환
- OUTER JOIN: 한쪽 테이블의 모든 데이터를 포함하는 조인
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 행 + 일치하는 오른쪽 테이블 행
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행 + 일치하는 왼쪽 테이블 행
- FULL OUTER JOIN: 양쪽 테이블의 모든 행 반환
- 표준 조인 (ANSI JOIN): 표준 SQL 조인 방식
2. EQUI JOIN
EQUI JOIN은 = 연산자를 사용하여 테이블을 조인하는 가장 일반적인 방식입니다.
2.1 EQUI JOIN 예제
테이블: CUSTOMERS
CUSTOMER_ID | NAME |
101 | 홍길동 |
102 | 김철수 |
103 | 이영희 |
테이블: ORDERS
ORDER_ID | CUSTOMER_ID | AMOUNT |
1 | 101 | 500 |
2 | 103 | 1000 |
3 | 102 | 750 |
SELECT C.CUSTOMER_ID, C.NAME, O.ORDER_ID, O.AMOUNT
FROM CUSTOMERS C, ORDERS O
WHERE C.CUSTOMER_ID = O.CUSTOMER_ID;
결과
CUSTOMER_ID | NAME | ORDER_ID | AMOUNT |
101 | 홍길동 | 1 | 500 |
102 | 김철수 | 3 | 750 |
103 | 이영희 | 2 | 1000 |
3. NON-EQUI JOIN
NON-EQUI JOIN은 = 이외의 비교 연산자(<,>,<=,>= 등)를 사용하여 데이터를 조인하는 방식입니다.
3.1 NON-EQUI JOIN 예제
테이블: EMPLOYEES
EMPLOYEE_ID | EMPLOYEE_NAME | SALARY |
1 | 홍길동 | 3000 |
2 | 김철수 | 4500 |
3 | 이영희 | 6000 |
테이블: SALARY_GRADE
GRADE | MIN_SALARY | MAX_SALARY |
A | 2000 | 3999 |
B | 4000 | 5999 |
C | 6000 | 7999 |
SELECT E.EMPLOYEE_NAME, S.GRADE
FROM EMPLOYEES E
JOIN SALARY_GRADE S ON E.SALARY BETWEEN S.MIN_SALARY AND S.MAX_SALARY;
결과
EMPLOYEE_NAME | GRADE |
홍길동 | A |
김철수 | B |
이영희 | C |
4. INNER JOIN
INNER JOIN은 두 테이블 간 공통된 값이 있는 경우에만 해당 데이터를 결합합니다.
테이블: EMPLOYEES
EMPLOYEE_ID | EMPLOYEE_NAME | DEPARTMENT_ID |
1 | 홍길동 | 101 |
2 | 김철수 | 102 |
3 | 이영희 | 101 |
테이블: DEPARTMENTS
DEPARTMENT_ID | DEPARTMENT_NAME |
101 | 영업부 |
102 | 인사부 |
SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
INNER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
결과
EMPLOYEE_NAME | DEPARTMENT_NAME |
홍길동 | 영업부 |
김철수 | 인사부 |
이영희 | 영업부 |
5. OUTER JOIN
OUTER JOIN은 한쪽 테이블에 데이터가 없는 경우에도 모든 데이터를 포함합니다.
테이블: EMPLOYEES
EMPLOYEE_ID | EMPLOYEE_NAME | DEPARTMENT_ID |
1 | 홍길동 | 101 |
2 | 김철수 | 102 |
3 | 이영희 | NULL |
테이블: DEPARTMENTS
DEPARTMENT_ID | DEPARTMENT_NAME |
101 | 영업부 |
102 | 인사부 |
5.1 LEFT OUTER JOIN
SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
LEFT OUTER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
결과
EMPLOYEE_NAME | DEPARTMENT_NAME |
홍길동 | 영업부 |
김철수 | 인사부 |
이영희 | NULL |
5.2 RIGHT OUTER JOIN
SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
RIGHT OUTER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
결과
EMPLOYEE_NAME | DEPARTMENT_NAME |
홍길동 | 영업부 |
김철수 | 인사부 |
NULL | 연구개발부 |
5.3 FULL OUTER JOIN
SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
결과
EMPLOYEE_NAME | DEPARTMENT_NAME |
홍길동 | 영업부 |
김철수 | 인사부 |
이영희 | NULL |
NULL | 연구개발부 |
6. CROSS JOIN (교차 조인)
CROSS JOIN은 두 테이블의 모든 행을 서로 곱하여 데카르트 곱(Cartesian Product)을 생성하는 조인 방식입니다.
즉, 조건 없이 모든 조합을 반환하며, 조인하는 두 테이블의 각 행이 모든 조합으로 결합됩니다.
6.1 CROSS JOIN 기본 구문
SELECT A.열_이름, B.열_이름
FROM 테이블A A
CROSS JOIN 테이블B B;
6.2 CROSS JOIN 예제
CUSTOMERS 테이블
CUSTOMER_ID | NAME |
101 | 홍길동 |
102 | 김철수 |
PRODUCTS 테이블
PRODUCT_ID | PRODUCT_NAME |
P1 | TV |
P2 | PHONE |
SELECT C.CUSTOMER_ID, C.NAME, P.PRODUCT_ID, P.PRODUCT_NAME
FROM CUSTOMERS C
CROSS JOIN PRODUCTS P;
결과 (Cartesian Product)
CUSTOMER_ID | NAME | PRODUCT_ID | PRODUCT_NAME |
101 | 홍길동 | P1 | TV |
101 | 홍길동 | P2 | PHONE |
102 | 김철수 | P1 | TV |
102 | 김철수 | P2 | PHONE |
✅ CROSS JOIN 특징
- 조인 조건 없이 두 테이블의 모든 행을 조합하여 반환
- 결과 행 개수 = 첫 번째 테이블 행 개수 × 두 번째 테이블 행 개수
- 실수로 사용하면 데이터 폭발이 발생할 수 있음
7. NATURAL JOIN (자연 조인)
NATURAL JOIN은 두 테이블에서 같은 이름을 가진 열을 자동으로 매칭하여 조인하는 방식입니다.
즉, ON 또는 USING을 명시적으로 지정하지 않아도 공통된 컬럼을 기준으로 자동 조인합니다.
7.1 NATURAL JOIN 기본 구문
SELECT * FROM 테이블A
NATURAL JOIN 테이블B;
7.2 NATURAL JOIN 예제
EMPLOYEES 테이블
EMPLOYEE_ID | NAME | DEPARTMENT_ID |
1 | 홍길동 | 101 |
2 | 김철수 | 102 |
3 | 이영희 | 101 |
DEPARTMENTS 테이블
DEPARTMENT_ID | DEPARTMENT_NAME |
101 | 영업부 |
102 | 인사부 |
103 | 개발부 |
SELECT * FROM EMPLOYEES
NATURAL JOIN DEPARTMENTS;
결과
EMPLOYEE_ID | NAME | DEPARTMENT_ID | DEPARTMENT_NAME |
1 | 홍길동 | 101 | 영업부 |
2 | 김철수 | 102 | 인사부 |
3 | 이영희 | 101 | 영업부 |
✅ NATURAL JOIN 특징
- 공통된 컬럼을 자동으로 찾아서 조인
- ON 조건을 명시하지 않아도 됨
- 동일한 컬럼이 여러 개 존재할 경우, 자동으로 매칭되므로 예기치 않은 오류 발생 가능
- 조인 기준이 명확하지 않을 경우 예상치 못한 결과가 나올 수 있음
8. SELF JOIN (자기 조인, 자기 결합)
8.1. SELF JOIN이란?
SELF JOIN(셀프 조인)은 같은 테이블을 두 번 사용하여 자기 자신과 조인하는 방식입니다.
즉, 같은 테이블 내에서 특정 컬럼을 기준으로 관계를 설정하여 조인하는 것입니다.
📌 주요 사용 사례:
- 조직 구조(부서-상사 관계)
- 제품과 관련 제품 매칭
- 친구 관계 조회 (SNS, 커뮤니티)
8.2. SELF JOIN 기본 구문
SELECT A.열_이름, B.열_이름
FROM 테이블 A
JOIN 테이블 B ON A.공통_열 = B.공통_열;
- 같은 테이블을 두 개의 별칭(A, B)으로 나누어 사용
- 조인 조건을 설정하여 특정 관계만 조인
8.3. SELF JOIN 예제
8.3.1 조직 내 상사-부하 관계 조회
EMPLOYEES 테이블
EMPLOYEE_ID | EMPLOYEE_NAME | MANAGER_ID |
1 | 홍길동 | NULL |
2 | 김철수 | 1 |
3 | 이영희 | 1 |
4 | 박민수 | 2 |
SELECT E1.EMPLOYEE_NAME AS 직원,
E2.EMPLOYEE_NAME AS 상사
FROM EMPLOYEES E1
LEFT JOIN EMPLOYEES E2
ON E1.MANAGER_ID = E2.EMPLOYEE_ID;
결과
직원 | 상사 |
홍길동 | NULL |
김철수 | 홍길동 |
이영희 | 홍길동 |
박민수 | 김철수 |
8.3.2 동일한 제품 카테고리 내 다른 제품 추천
PRODUCTS 테이블
PRODUCT_ID | PRODUCT_NAME | CATEGORY_ID |
1 | 노트북 | 100 |
2 | 데스크탑 | 100 |
3 | 스마트폰 | 200 |
4 | 태블릿 | 200 |
SELECT P1.PRODUCT_NAME AS 제품,
P2.PRODUCT_NAME AS 관련_제품
FROM PRODUCTS P1
JOIN PRODUCTS P2
ON P1.CATEGORY_ID = P2.CATEGORY_ID
AND P1.PRODUCT_ID <> P2.PRODUCT_ID;
결과
제품 | 관련_제품 |
노트북 | 데스크탑 |
데스크탑 | 노트북 |
스마트폰 | 태블릿 |
태블릿 | 스마트폰 |
9. TABLE JOIN
Table Join은 데이터베이스에서 여러 개의 테이블을 조인(JOIN)하여 하나의 결과 집합을 만드는 과정입니다. RDBMS(관계형 데이터베이스)에서는 데이터를 여러 테이블에 나누어 저장하는데, 이를 다시 연결해서 원하는 데이터를 추출하는 것이 Table Join의 목적입니다.
보통 Table Join이란 말은 특정한 조인 방식(예: INNER JOIN, OUTER JOIN 등)을 지칭하기보다는 일반적인 조인(JOIN) 개념을 넓게 포괄하는 용어로 사용됩니다.
9.1. Table Join의 기본 개념
- 여러 테이블을 조합하여 하나의 결과를 만드는 과정
- 조인의 조건을 사용하여 서로 관련 있는 데이터만 결합
- 관계형 데이터베이스에서 중복을 줄이고 정규화를 유지하는 핵심 기능
9.2 Table Join의 기본 구문
SELECT A.열_이름, B.열_이름
FROM 테이블A A, 테이블B B
WHERE A.공통_열 = B.공통_열;
- 테이블A와 테이블B를 조인
- 공통 키(A.공통_열 = B.공통_열)를 기준으로 연결
9.3 Table Join의 예제
CUSTOMERS 테이블
CUSTOMER_ID | NAME |
101 | 홍길동 |
102 | 김철수 |
103 | 이영희 |
ORDERS 테이블
ORDER_ID | CUSTOMER_ID | AMOUNT |
1 | 101 | 500 |
2 | 103 | 1000 |
3 | 102 | 750 |
기본 조인 (EQUI JOIN)
SELECT C.CUSTOMER_ID, C.NAME, O.ORDER_ID, O.AMOUNT
FROM CUSTOMERS C, ORDERS O
WHERE C.CUSTOMER_ID = O.CUSTOMER_ID;
결과
CUSTOMER_ID | NAME | ORDER_ID | AMOUNT |
101 | 홍길동 | 1 | 500 |
102 | 김철수 | 3 | 750 |
103 | 이영희 | 2 | 1000 |
Table Join vs 다른 조인 방법
- Table Join은 단순히 두 개 이상의 테이블을 조합하는 과정을 의미합니다.
- 특정한 유형의 조인(INNER JOIN, OUTER JOIN 등)으로 세분화하여 사용할 수 있습니다.
- 예를 들어, Table Join은 위와 같은 기본 조인의 개념을 포함하지만, 보다 정교한 방식으로 INNER JOIN, OUTER JOIN 등의 기법을 적용할 수 있습니다.
10. 마무리
이번 장에서는 JOIN의 개념과 종류(EQUI JOIN, NON-EQUI JOIN, INNER JOIN, OUTER JOIN, CROSS JOIN, NATURAL JOIN, SELF JOIN, TABLE JOIN, 표준 조인)을 학습했습니다.
- EQUI JOIN: = 연산자로 데이터를 조인
- NON-EQUI JOIN: = 이외의 연산자를 사용하여 데이터 조인
- INNER JOIN: 일치하는 데이터만 반환
- OUTER JOIN: 일치하지 않는 데이터도 포함 (LEFT, RIGHT, FULL)
- CROSS JOIN: 데카르트 곱(Cartesian Product)을 생성하는 조인 방식
- NATURAL JOIN:같은 이름을 가진 열을 자동으로 매칭하여 조인하는 방식
- SELF JOIN: 같은 테이블을 두 번 사용하여 자기 자신과 조인하는 방식
- 표준 조인: ANSI 표준 SQL 조인 방식
- TABLE JOIN: 두 개 이상의 테이블을 조합하는 과정
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 4-1: 서브쿼리 (Subquery) (0) | 2025.02.17 |
---|---|
Part 4: SQL 활용 (Advanced SQL Usage) (0) | 2025.02.16 |
[SQLD] 3-2: GROUP BY & HAVING & ORDER (0) | 2025.02.16 |
[SQLD] 3-1: SELECT 와 WHERE(feat. 연산자 & 함수 & 조건문) (0) | 2025.02.15 |
[SQLD] Part 3: SQL 기본 (1) | 2025.02.14 |