SQL

JOIN - 테이블을 합치게 해준다

딩관 2022. 5. 12. 20:55

SELECT 문에서 사용한다

  • LEFT JOIN 
  • INNER JOIN
  • FULL JOIN
  • EXCLUSIVE JOIN

예제의 전제

topic , author , profile 3개의 테이블을 먼저 만들어준다.

LEFT JOIN (LEFT OUTER JOIN)

  • LEFT JOIN을 하면 기본적으로 기준테이블이 왼쪽에 표시된다.
  • 왼쪽 기준 테이블에 있는 데이터들을 오른쪽으로 연장 대상테이블에 데이터가 없더라도 연장
  • 왼쪽을 기준으로 오른쪽방향으로 테이블 및 속성을 더하기때문에 LEFT JOIN이다.
SELECT * FROM 테이블1 LEFT JOIN 테이블1 ON 테이블1.속성 = 테이블2.속성

마지막에 나온 테이블1.속성 과 테이블2.속성은 서로 상응하는 관계여야 한다 (보통 뒤쪽의 테이블2.속성은 프라이머리키를 활용)

 

LEFT JOIN의 연속사용

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성 
LEFT JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성

WHERE 문 역시 중첩 가능

SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성 
LEFT JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성 WHERE 조건문

테이블을 합치고 조건에 해당하는 데이터만 가져옴

 

실전 예제

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid

결과

  • JOIN시 상응하는 속성의 데이터 값이 NULL 이면 이후 데이터들은 전부 NULL로 표기된다.

WHERE문 실전예제

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid WHERE author.aid=1;

결과

author.aid 가 1인 데이터들만 불러왔다.

  • JOIN 문같이 여러개의 테이블을 사용시 속성의 이름이 같은경우가 많기에 테이블.속성 으로 명확히 어떤속성인지 기재해야한다.

AS사용 속성이름을 AS로 사용할 수 있다

  • AS사용시 각속성 별로 AS사용후 컴마로 표시
SELECT tid,topic.title,name,city,
profile.title AS profile_title , profile.description AS profile_dsecription 
FROM topic LEFT JOIN author ON topic.author_id = author.aid 
LEFT JOIN profile ON author.profile_id = profile.pid 
WHERE author.aid=1;

결과

INNER JOIN

  • 여러개의 테이블들이 공통적으로 가지고 있는 데이터만 출력
  • NULL = False 값을 가진다.
  • 기본적으로 JOIN이라고 하면 INNER JOIN을 의미함
SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성

연속으로 사용시

SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.속성 = 테이블2.속성
INNER JOIN 테이블3 ON 테이블2.속성 = 테이블3.속성

실전예제

SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid
INNER JOIN profile ON author.profile_id = profile.pid

결과

  • tid값 4를 가진 oracle은 author 테이블에 존재하지 않음으로 출력되지 않는다

FULL JOIN  (FULL OUTER JOIN)

  • 양쪽의 모든 데이터를 결합 기준열이없다
  • UNION + DISTINCT이라는 개념으로 이해하면 좋다
  • 테이블1 기준으로 left join을 하고 그위에 테이블 2를 기준으로 right join 후 중복을 삭제하는것
  • mysql 에서는 FULL JOIN 을 사용하지 않아 UNION과 괄호를 활용하여 사용한다.

기본원리 (Mysql에서는 사용불가)

SELECT * FROM topic FULL OUTER JOIN author on topic.author_id = author.aid

실제 사용코드

(SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid)
UNION (SELECT * FROM topic RIGHT JOIN author ON topic.author_id = author.aid)

결과

관계가 있는 값은 연속적으로 관계가 없는 값은 NULL 값을 채워서 출력되었다

 

EXCLUSIVE JOIN

  • 기준 테이블을 기준으로 기준테이블에만 있는 데이터를 꺼내옴
  • LEFT JOIN 후 WHERE문으로 대상 테이블의 primary key가 NULL인 값을 불러온다
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
WHERE author.aid is NULL

번외 EXPLAIN

  • 실행 계획을 보는 문구
  • JOIN으로 인한 성능 저하시 JOIN문 제일 앞에 붙여서 활용함