SQLD발행일 2024. 11. 15.원본 https://blog.naver.com/jword_/223662216703 ↗

[SQLD] SQL조인 INNER JOIN, LEFT & RIGHT OUTER JOIN, CROSS JOIN

[SQLD] SQL조인 INNER JOIN, LEFT & RIGHT OUTER JOIN, CROSS JOIN — #SQLD #개발자의도구들 #SQLINNERJOIN #SQLJOIN #SQLLEFTOUTERJOI...

#SQLD#Naver Blog

#SQLD #개발자의도구들 #SQLINNERJOIN #SQLJOIN #SQLLEFTOUTERJOIN #SQLRIGHTOUTHERJOIN #SQLCROSSJOIN #SQL조인

​

24년도 SQLD 제 55회 시험을 대비하며 정리한 글입니다.

\* 본글은 PC버전에 최적화 되어있습니다.

​

**\* **전체 목차는 여기를 참고해주세요.

​

JOIN

SQL자격검정 실전문제

문제를 풀면서 느낀건데 JOIN은 거의 모든 SQL 보기 지문에 포함되어 있습니다. 정말 중요한 내용이니 이번기회에 확실히 정리하였습니다.

​

JOIN 기본

SELF, NATURAL, EQUI, NON EQUI

🗝️ keypoint

👉 핵심정리JOIN은 기본적으로 두 테이블을 하나로 묶는 것을 의미합니다그렇기에 select \* from department, student와 같은 형태도 implicit join이라고 부릅니다.혹은, Cartesian Product​SELF JOIN자기 자신과 JOIN하는 형태를 말합니다.주로 계층형 구조에서 사용아래 코드 참고​NATURAL JOIN두 테이블 간의 동일한 NAME, TYPE에 해당하는 COL을 자동으로 매핑하여 조인조인 조건을 명시하지 않아도 됩니다.전체 col 출력시 중복된 col이 표시 되지 않습니다.아래 코드 참고​EQUI JOINWHERE 혹은 ON 절에서 두 칼럼의 값이 동일한 것 끼리 묶을 때 사용합니다.아래 코드 참고NON EQUI JOIN이건 '=' 외의 비교(<, >, BETWEEN 등)을 적용할 수 있습니다.

SELF JOIN 예시

sql 코드 예제
                                    -- SELF JOIN : board a에 달린 댓글 board의 id 출력
SELECT a.id, b.id
FROM board a, board b -- 별칭으로 관리합니다.
where a.id = b.parent_id; -- EQUI JOIN의 일종

SELCT a.id, b.id
FROM board a,
JOIN ON board b ON a.id = b.parent.id       -- INNER JOIN

NATURAL JOIN 예시

​

employees 테이블:

employee\_idemployee\_namedepartment\_idsalary
101김철수15,000,000
102이영희26,000,000
103박민준26,500,000
104최수지35,500,000
105홍길동NULL4,800,000

departments 테이블:

department\_iddepartment\_name
1인사부
2개발부
3마케팅부
4재무부
sql 코드 예제
                                    SELECT employee_name, department_name
FROM employees
NATURAL JOIN departments;
employee\_namedepartment\_name
김철수인사부
이영희개발부
박민준개발부
최수지마케팅부

​

이름 및 형식이 같은 col을 알아서 찾아서 join을 수행합니다. 홍딜동의 경우 department\_id가 null이라서 조인되지 않습니다.

​

역시나 EQUI조인의 일종으로 볼 수 있습니다.

sql 코드 예제
                                    💡 NATURAL JOIN은 실생활에서 사용되기 힘듭니다.
- NATURAL JOIN은 IMPLICT JOIN으로 분류됩니다.

이유는 여러 테이블간의 COL명이 항상 일치하는 것이 아니기 때문에,
EXPLICIT하게 JOIN하는 것이 좋습니다.

EX) INNER JOIN, LEFT OUTER JOIN ...

INNER JOIN

🗝️ key point

👉 핵심정리 흔히 JOIN으로 사용하면 이 INNER JOIN을 의미합니다특정 조건을 만족하는 값들을 기준으로 JOIN합니다EQUI 일 수 도 아닐 수 도 있습니다.
sql 코드 예제
                                    // 가장 흔한 JOIN 형태입니다.
SELECT *
FROM student s, department d
WHERE s.deptno = d.deptno

SELECT *
FROM student s
INNER JOIN department d ON s.deptno = d.deptno

// 위코드는 모두 INNER JOIN에 해당합니다.

LEFT, RIGHT, FULL OUTER JOIN

🗝️ key point

👉 핵심정리보통 OUTER 키워드가 생략된 형태로 많이 봤을 겁니다.이 두개는 모두 OUTER JOIN입니다.LEFT JOINRIGHT JOIN 전체 col 출력시 중복된 col이 발생 합니다.​LEFT JOIN VS RIGHT JOINLEFT JOIN: 왼쪽을 살립니다.RIGHT JOIN: 오른쪽을 살립니다.ON에는 조건이 들어갑니다.조건이 일치하지 않는 값은 모두 NULL로 처리합니다.

​

LEFT JOIN

employees table

이미지

이미지

사원 테이블/ 부서 테이블

현재 테이블에 홍길동은 DEPARTMENT\_ID가 없는 상황입니다. 이때 모든 사람의 부서이름을 알고 싶다고 가정하겠습니다.

sql 코드 예제
                                    1. 부서 이름을 알려면 부서 테이블에서 가져와야 합니다
2. JOIN을 수행합니다. 여기서는 LEFT JOIN을 사용하겠습니다.
text 코드 예제
                                    SELCT *
FROM employees e
left JOIN departments d on e.department_id = d.department_id

이미지

홍길동의 department\_id 정보는 없기 때문에, 해당 table에 속하는 모든 col이 null 처리가 됩니다. 주의할 점은 department\_id가 중복되어 나타난 다는 것입니다.

​

​

RIGHT JOIN

이번에는 RIGHT JOIN으로 반대로 실행해보겠습니다.

sql 코드 예제
                                    select *
from employees e
right join departments d on e.department_id = d.department_id;

이미지

우측에 위치한 departments의 모든 행이 표기되는 것을 볼 수 있습니다.

​

FULL JOIN

마지막으로 FULL JOIN입니다.

sql 코드 예제
                                    select *
from employees e
FULL join departments d on e.department_id = d.department_id;

이미지

ㅇ

각 각 행이 모두 살아있는 것을 볼 수 있습니다.

CROSS JOIN

​

👉 핵심정리CROSS JOIN = Cartisian Product
sql 코드 예제
                                    select *
from employees
cross join departments ;

select *
from employees, departments

위에서 언급한 대로 join은 두 테이블을 서로 묶는 것이라고 하였습니다. cross join을 사용하지 않고 cartisian product를 수행하려면 두 테이블을 FROM에 넣으면 됩니다.

이미지

이 런식으로 CROSS 되기 때문에 붙은 이름입니다.

NATURAL VS OTHRES

👉 핵심정리NATURAL JOIN 중복행을 포함하지 않습니다조건을 추가할 수 없습니다. (자동) 조건이 까다롭습니다. 칼럼 이름칼럼 형식같아야 합니다.​OHTERS(INNER, OUTTER...)중복행이 포함됩니다.제거하려면 SELECT 에서 DISTICT를 사용하거나, 명시적으로 COL을 따로 적여야 합니다.조건이 자유롭습니다.

오답노트

​