사이먼's 코딩노트

[DB] 조인(JOIN) 본문

데이터베이스(DB)

[DB] 조인(JOIN)

simonpark817 2024. 3. 28. 18:06

[JOIN]

  • 조인이란 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과와 테이블로 만드는 것을 의미한다.
  • 이를 통해 데이터를 효율적으로 검색하고 처리하는데 도움을 준다.
  • 조인을 사용하는 이유는 데이터베이스에서 테이블을 분리하여 데이터 중복을 최소화하고 데이터의 일관성을 유지하기 위해서다.
  • 조인의 종류는 대표적으로 INNER JOIN, LEFT JOIN, RIGHT JOIN 등이 있으면 각 JOIN 방식에 따라 결과가 달라진다.

 

[INNER JOIN]

  • INNER JOIN은 두 테이블에서 공통된 값을 가지고 있는 행(row)들만 반환한다.
  • 아래는 부서를 표현하는 dept 테이블과 사원을 표현하는 emp 테이블이다.

dept(부서) 테이블
emp(사원) 테이블

 

  • emp 테이블의 deptId 컬럼은 각 부서의 ID이다.
  • 예를 들어 deptId가 1이라면 dept 테이블에서 id가 1인 마케팅 부서인 것이다.
  • 현재 부서는 총 마케팅과 기획 두 개가 존재하고 INNER JOIN을 이용해서 dept 테이블의 id와 emp 테이블의 deptId의 값을 기반으로 공통된 값을 묶어 출력하려한다.

 

SELECT emp.id AS 사원번호,
DATE(emp.regDate) AS 입사날짜,
emp.name AS 사원이름,
dept.name AS 부서명
FROM emp INNER JOIN dept ON emp.deptId = dept.id
ORDER BY emp.id;
  • 위 쿼리문은 두 테이블을 INNER JOIN 한 모습이다.
  • 먼저 우리가 조회하고 싶은 컬럼은 emp 테이블의 id, regDate, name과 dept 테이블의 name이다.
  • 다시 말해 사원번호, 입사날짜, 사원이름, 부서명을 조회하기를 원한다.
  • 여기서 emp. 과 같이 .을 붙히는 이유는 테이블을 구별하기 위해서 붙혔다고 생각하면 좋다.
  • 각 컬럼 뒤에 AS을 붙히고 뒤에 별칭을 붙혀 실제로 select를 했을 때 컬럼명이 아닌 별칭이 표시된다.
  • FROM 부분에서 INNER JOIN을 하게 되는데 emp 테이블과 dept 테이블을 조인해야하기 때문에 emp INNER JOIN dept라고 작성하고, ON을 그 뒤에 작성하고 공통된 값인 emp.deptId = dept.id를 작성한다.
  • 그 다음 ORDER BY를 통해 emp.id인 사원번호 순서에 맞게 정렬한다.
  • 만약 ORDER BY emp.id ASC라고 작성했다면 사원번호의 오름차순으로 정렬을 한다는 것이고 DESC를 작성하면 사원번호의 내림차순으로 정렬을 한다는 뜻이다. 여기서는 기본적으로 차순을 작성하지 않으면 ASC가 적용되기 때문에 오름차순으로 정렬되어 조회된다.

INNER JOIN 결과

 

[LEFT JOIN]

  • LEFT JOIN은 JOIN을 기준으로 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 왼쪽 테이블과 공통된 값을 가지고 있는 행들을 반환한다.
  • 만약 오른쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환한다.
  • 위에서 만든 dept 테이블에 IT 부서가 새로 추가하고 emp 테이블에는 아직 IT 부서인 사원이 없다고 생각해봅시다.
  • emp 테이블에는 연봉(salary)를 추가하였다.

IT 부서가 추가된 dept 테이블
연봉(salary)이 추가된 emp 테이블

 

  • 전처럼 INNER JOIN을 하게된다면 IT 부서에 관한 정보는 조회되지 않는다.
  • 그 이유는 emp 테이블에 IT 부서에 속한 사원이 없기 때문이다.
  • 이럴 때 IT 부서의 사원은 없지만, IT 부서의 존재를 함께 조회하고 싶다면 LEFT JOIN을 사용하면 된다.

 

SELECT D.name AS 부서명,
E.id AS 사원번호,
E.name AS 사원명
FROM dept AS D
LEFT JOIN emp AS E
ON D.id = E.deptId
ORDER BY D.id;
  • 위 쿼리문은 두 테이블을 LEFT JOIN 한 모습이다.
  • 우리가 조회하고 싶은 컬럼은 dept 테이블의 name과 emp 테이블의 id, name이다.
  • 다시 말해 부서명, 사원번호, 사원명을 조회하기를 원한다.
  • JOIN의 조건을 D.id = E.deptId로 똑같이 하고 INNER가 아닌 LEFT를 하게 된다면 JOIN을 기준으로 왼쪽에 있는 테이블인 dept에서 조회하고픈 name의 값들은 모두 조회가 된다.
  • dept 테이블에는 홍보, 기획, IT 총 3개의 부서가 있고 조회했을 때 IT도 함께 조회된다.
  • 하지만 실제로 IT에 속한 사원은 아직 없기 떄문에 사원번호나 사원명은 모두 NULL로 표시된다.
  • 이 때 LEFT OUTER JOIN 이라고도 쓰지만 보통 OUTER는 생략한다.

LEFT JOIN 결과

 

[RIGHT JOIN]

RIGHT JOIN은 LEFT JOIN과 반대로 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 오른쪽 테이블과 공통된 값을 가지고 있는 행들을 반환한다.

만약 왼쪽 테이블에서 공통된 값을 가지고 있는 행이 없다면 NULL 값을 반환한다.

LEFT JOIN에서 예시를 들었던 dept, emp 테이블을 그래도 이용해서 RIGHT JOIN을 통해 조회해봅시다.

 

SELECT D.name AS 부서명,
E.id AS 사원번호,
E.name AS 사원명
FROM emp AS E
RIGHT JOIN dept AS D
ON D.id = E.deptId
ORDER BY D.id;

위 쿼리문은 두 테이블을 RIGHT JOIN 한 모습이다.

우리가 조회하고 싶은 컬럼은 부서명, 사원번호, 사원명이고 JOIN의 조건도 동일하게 맞춰준다.

다만 LEFT JOIN과 다른 점은 이번에는 JOIN을 기준으로 오른쪽에 있는 테이블인 dept에서 조회하고픈 name의 값들이 모두 조회된다.

실제 select 결과는 LEFT JOIN과 같은 결과가 나온다.

이 때 RIGHT OUTER JOIN 이라고도 쓰지만 보통 OUTER는 생략한다. 

RIGHT JOIN 결과

반응형

'데이터베이스(DB)' 카테고리의 다른 글

[DB] 문제풀이  (0) 2024.03.28
[DB] GROUP BY, UNION  (0) 2024.03.28
[DB] 기본 쿼리 종류  (2) 2024.03.27
[DB] MySQL 설치 및 기본 세팅  (0) 2024.03.27