데이터베이스

[데이터베이스] JOIN(조인)

Yuco 2024. 7. 10. 19:03


1. Join(조인) 이란?

- 둘 이상의 테이블을 연결하여 하나의 결과를 만들어 내는 것

 

1) 전제조건

- 연결하고자 하는 테이블들이 적어도 하나의 컬럼을 공유하고 있어야 함 (두 테이블의 조인을 위해서는 기본키(PK)와 외래키(FK) 관계로 맺어져야 함)

 

2. Join의 종류

 

출처: https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC

 

 

1) INNER JOIN

  • 교집합
  • 기준 테이블과 JOIN 테이블의 중복된 값
  • 두 테이블에 모두 지정한 열의 데이터가 있어야 함 
# 문법
SELECT *
FROM TABLE_A A INNER JOIN TABLE_B B
	ON A.KEY = B.KEY
WHERE 조건 # JOIN 완료 후 그 다음 조건 따짐

# 단순 문법 - FROM 절에 , 쓰면 INNER JOIN 
SELECT *
FROM TABLE_A A, TABLE_B B
WHERE A.KEY = B.KEY # JOIN 완료 후 그 다음 조건 따짐

 

2) LEFT (OUTER) JOIN

* OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN(Oracle) 세 가지가 있지만, 거의 LEFT OUTER JOIN을 사용하며, FULL OUTER JOIN은 성능상 거의 사용하지 않음

- JOIN 기준 왼쪽에 있는 모든 데이터가 SELECT 됨 , 어느 테이블을 기준으로 LEFT 할 것인지에 따라 레코드 개수가 달라짐,기준 테이블의 레코드는 전부 출력됨

# 문법
SELECT *
FROM TABLE_A A LEFT (OUTER) JOIN TABLE_B  # A 기준으로 LEFT JOIN
	ON A.KEY = B.KEY
WHERE 조건

 

 

 

2-1) LEFT JOIN을 여러번 할 때 주의할 점 

  • INNER JOIN과는 달리 LEFT JOIN은 조인하는 테이블의 순서가 상당히 중요(어떤 순서로 테이블을 조인하는지에 따라 결과 테이블에 조회되는 행의 개수며 구성 등이 달라질 수 있기 때문), 따라서 JOIN 문을 작성할 때, 만약 LEFT JOIN을 할 거라면 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 적어줌
  • 조인을 여러 번 해야하는데 시작을 LEFT JOIN으로 했다면 나머지 조인도 LEFT JOIN을 이어나가야 함 즉, LEFT JOIN을 쓰다가 갑자기 INNER JOIN 이나 다른 조인을 사용하지 않는다는 것

 

2-2) 3중 조인

-- 3개의 테이블을 join하고 한국에대한 정보만 뷰로 생성해라

CREATE VIEW allView AS (
    SELECT A.Name, A.CountryCode 
    FROM city A 
         LEFT JOIN country B 
         ON A.countrycode = B.code -- 테이블 2개 조인 완료
         LEFT JOIN countrylanguage C 
         ON B.code = C.countrycode -- 테이블 3개 조인 완료
    WHERE A.countrycode in ('KOR');
)

 

3) RIGHT (OUTER) JOIN

  • JOIN 기준 오른쪽에 있는 모든 데이터가 SELECT 됨
  • 어느 테이블을 기준으로 RIGHT 할 것인지에 따라 레코드 개수가 달라짐 
  • 기준 테이블의 레코드는 전부 출력됨
# 문법
SELECT *
FROM TABLE_A A RIGHT (OUTER) JOIN TABLE_B  # B 기준으로 RIGHT JOIN
	ON A.KEY = B.KEY
WHERE 조건

 

4) FULL (OUTER) JOIN

  • 합집합
  • 두 테이블의 모든 데이터가 SELECT 됨
  • 대부분 DB는 FULL OUTER JOIN을 지원하지 않지만, 간접적으로 구현하는 방법 존재
# FULL OUTER JOIN 문법 존재 - ORACLE
SELECT * 
FROM topic FULL OUTER JOIN author 
ON topic.auther_id = author.id


# FULL OUTER JOIN 문법 존재 X - MySQL
# LEFT 조인한 테이블과 RIGHT 조인한 테이블을 합집합(UNION) 해주기
SELECT * 
FROM topic LEFT JOIN author 
ON topic.auther_id = author.id

UNION # 중복제거 : UNION ALL은 중복 제거 X

SELECT * 
FROM topic RIGHT JOIN author 
ON topic.auther_id = author.id

 

4-1) UNION

  • 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용
  • 이 때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야하며, 필드의 순서 또한 같아야 함
  • DISTINCT (중복 제거)가 자동으로 포함되어 있음
SELECT 필드이름 FROM 테이블이름
UNION
SELECT 필드이름 FROM 테이블이름

 

4-2) UNION ALL

  • UNION은 DISTINCT 자동 포함이므로, 중복되는 레코드를 제거함
  • 중복되는 레코드까지 모두 출력하고 싶다면, ALL 키워드를 사용하면 됨
SELECT 필드이름 FROM 테이블이름
UNION ALL
SELECT 필드이름 FROM 테이블이름

 

5) EXCLUSIVE LEFT JOIN

  • 만약 테이블 두 개를 JOIN 한다면 둘 중 한가지 테이블에만 있는 데이터를 가져옴
  • 다른 조인들과 다르게 별도의 EXCLUSIVE JOIN 함수가 있는게 아니고 기존의 LEFT JOIN과 WHERE 절의 조건을 함께 사용하여 만드는 JOIN 문법
# 문법
SELECT * 
FROM table1 A LEFT JOIN table2 B
ON A.ID_SEQ = B.ID_SEQ 
WHERE B.ID_SEQ IS NULL 
# 조인한 B 테이블의 ID_SEQ 값이 NULL 일때만 출력하라는 말은, 조인이 안된 A 레코드의 나머지 값만 출력하라는 말

 

6) CROSS JOIN

  • 모든 경우의 수를 전부 표현하는 방식
  • A 테이블의 데이터가 3개, B 테이블의 데이터가 4개인 경우, 총 3 * 4 = 12 개의 데이터가 SELECT 됨
  • CROSS JOIN은 상호 모든 행에 대한 결합이 발생하므로, ON 구문을 사용할 수 없음
# 문법
SELECT *
FROM table1 CROSS JOIN table2;

 

 

6) SELF JOIN

  • 자기 자신과 JOIN 하는 것 
  • 하나의 테이블을 여러번 복사하여 조인하는 것과 같음 
# 예) 모든 사원에 대해 사원의 이름과 직속 상사의 이름을 검색 해라.
# EMPNAME 테이블에 어떤 사원의 MANAGER 번호가 같은 테이블 내에서 어떤 사원의 EMPNO와 같으면 그 사원이 직속 상관

SELECT E.EMPNAME as 사원, M.EMPNAME as 직속상관
FROM EMPLOYEE E, EMPLOYEE M -- inner join
WHERE E.MANAGER = M.EMPNO;

 

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

[데이터베이스] VIEW  (0) 2024.07.10
[데이터베이스] RDBMS, NOSQL  (0) 2024.07.07
[데이터베이스] 기초 개념 정리  (0) 2024.07.07