DB(4) JOIN 파해치기
어라 이전에는 잘 되던 쿼리가 왜 느려졌을까?
워드 사전 시소로스 관계들을 조인하여 사용하다 갑자기 문제가 발생하였다.
jpql을 dsl 로 변경하다 발생한 문제였는데, 그중에서도 조인 문제였다.
그래서 준비하였다 =조인을 모르고 rdb를 사용하는건 미친짓 아닌가?
가장 기본이면서, 헷갈리는? join을 완벽하게 정리해보자
0. 목차
- 조인이란?
- Inner join
- Left outer join
- Right outer join
- Full outer join
- hibernate fetch join 까지?
1. 조인이란?
wiki인용
join또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나으 ㅣ열로 표현한 것이다. 따라서 조인은 테이블로서 저장되거나 그 자체로 이용할 수 있는 결과 셋을 만들어낸다. 조인은 2개의 테이블에서 각각의 공통값을 이용함으로써 필드를 조합하는 수단이 된다.
SQL server 에서는 조인을 할때 안시 조인을 권장한다, 아래에는 조인(innner join), 아우터 조인(outer join), 크로 조인 (cross join) 정리함
INNER JOIN : 기준 테이블과 조인 테이블 모두 데이터가 존재해야 조회 가능
OUTER JOIN : 기준 테이블에만 데이터가 존재하면 조회 가능
2. Inner Join
보통 조인이라고 하면 inner join 을 생각하게 된다.
Inner join 이란 두 테이블간 조인 조건을 만족하는 행을 반환할 때 사용하는 구문이다.
쉽게 조인하려면 두 테이블의 교집합이라 보면 된다.
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Inner join 방식은 두가지 방식을 사용한다. 명시적 조인과 암시적 조인인데 명시적 조인은 어떤 join을 쓰겠다고 사전에 알려주는 방식이고, 암시적 조인은 from절에서 콤마를 사용하여 이후 where 절에서 조건절로 표현해주는 방식이다.
- 명시적 조인 (explicit)
SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.컬럼1 = 테이블2.컬럼1 [AND 테이블1.컬럼2 = 테이블2.컬럼2 ... ]
- 암시적 조인 (implicit)
SELECT * FROM 테이블1 , 테이블2 WHERE 테이블1.컬럼1 = 테이블2.컬럼1 [AND 테이블1.컬럼2 = 테이블2.컬럼2 ... ]
이 두가지 조인은 사실 퍼포먼스 상에서는 별 차이가 없으나, 암시적 조인 방식은 deprecated 된 조인 방식이므로 유지보수를 위해서라도 명시적 방식을 쓰는것을 권장하고 있다.
3. Outter join
inner join 인이 양쪽 테이블 모두 있는 데이터만 보여주는 join 방법이였다면 outer join 은 조건에 따라 조건의 테이블의 데이터가 있다면 모든 데이트를 가져올수 있게 된다.
Outter join 은 총 3가지의 JOIN 방식이 존재하는데, (LEFT OUTTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN)
1. LEFT OUTER JOIN (왼쪽 외부 결합)
/* 명시적(explicit) LEFT OUTER JOIN 표현 */
SELECT *
FROM 테이블1
LEFT OUTER JOIN 테이블2
ON 테이블1.컬럼1 = 테이블2.컬럼1 [AND 테이블1.컬럼2 = 테이블2.컬럼2 ... ]
/* 암시적(IMPLICIT) LEFT OUTER JOIN 표현 : 오라클 */
SELECT *
FROM 테이블1 , 테이블2
WHERE 테이블1.컬럼1 = 테이블2.컬럼1(+)
[AND 테이블1.컬럼2 = 테이블2.컬럼2(+) ... ]
/* 암시적(IMPLICIT) LEFT OUTER JOIN 표현 : 사이베이스 */
SELECT *
FROM 테이블1 , 테이블2
WHERE 테이블1.컬럼1 *= 테이블2.컬럼1
[AND 테이블1.컬럼2 *= 테이블2.컬럼2 ... ]
2. FULL OUTER JOIN
왼쪽 오른쪽 모두 매칭되는 데이터가 없어도 표현해주는 방식으로 문법은 아래와 같다.
/* 명시적(explicit) FULL OUTER JOIN 표현 */
SELECT *
FROM 테이블1
FULL OUTER JOIN 테이블2
ON 테이블1.컬럼1 = 테이블2.컬럼1
[AND 테이블1.컬럼2 = 테이블2.컬럼2 ... ]
MySQL에서는 full outter join 을 지원하지 않기 떄문에 아래와 같이 풀어서 사용한다.
/* MySQL에서 */
/* 일치하는 것 */
SELECT *
FROM TB_BOARD
INNER JOIN TB_BOARD_COMMENT
ON TB_BOARD.BBS_SEQ = TB_BOARD_COMMENT.BBS_SEQ
/* TB_BOARD_COMMENT의 값이 비어있는 것 */
UNION ALL
참고
https://ko.wikipedia.org/wiki/Join_(SQL) https://mozi.tistory.com/219 https://royzero.tistory.com/60?category=800123