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문 제일 앞에 붙여서 활용함