[mariaDB] JOIN

LDB·2024년 12월 3일
post-thumbnail

JOIN

서비스들중에는 테이블을 참조 안하고 단일테이블로만 이루어져있는 테이블은 아마 거의 없을 것이다. 대부분 테이블을 JOIN하여 2개이상 사용하는 것이 대부분이다.

join을 사용하는 이유는 정규화와 관련있는데 한마디로 편하게 쓰기위해 join을 사용한다. 만약 join을 사용안하고 테이블 관리를 한다면 불필요한 작업이 많아지게 되어 나중에 문제가 생길 수 있다.

JOIN의 종류

JOIN에는 여러가지 종류가 있는데 INNER, LEFT, RIGHT, FULL을 설명할 것이다, 예시에 사용할 테이블은 이렇게 사용할 것이다.

member table

CREATE TABLE `member` (
  `seq` int(11) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
  `age` int(11) DEFAULT NULL COMMENT '나이',
  `name` varchar(255) DEFAULT NULL COMMENT '이름',
  PRIMARY KEY (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

room table

CREATE TABLE `room` (
  `seq` int(11) NOT NULL AUTO_INCREMENT COMMENT '일련번호',
  `member_id` int(11) DEFAULT NULL COMMENT '멤버번호',
  `room_name` varchar(255) DEFAULT NULL COMMENT '방이름',
  PRIMARY KEY (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

테이블 데이터


INNER JOIN

두 테이블의 공통된 부분만 추출한다.

# INNER JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name
from room r1 
inner join member m
on m.seq = r1.member_id

결과

만약 on 조건을 빼고 SQL을 실행하면 총 5 * 6 즉 30줄이 출력된다. 이 것은 CROSS JOIN과 동일하게 동작한다.


LEFT

LEFT OUTER JOIN은 쿼리문을 기준으로 LEFT 왼쪽에 있는 테이블을 중심으로 출력을 하는데 왼쪽 테이블 전체와 on 조건에 해당하는 값을 출력한다.

# LEFT OUTER JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name
from room r1
LEFT join member m
on m.seq = r1.member_id


LEFT JOIN은 쿼리문을 기준으로 LEFT 왼쪽에 있는 테이블을 중심으로 출력을 하는데 왼쪽 테이블 전체와 on 조건에 해당하는 값중에서 오른쪽에 있는 테이블에 포함하는 값은 제외한다.

# LEFT JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name
from room r1
LEFT join member m
on m.seq = r1.member_id
where m.seq is null


RIGHT OUTER JOIN은 쿼리문을 기준으로 RIGHT 오른쪽에 있는 테이블을 중심으로 출력을 하는데 오른쪽 테이블 전체와 on 조건에 해당하는 값을 출력한다.

# RIGHT OUTER JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name
from room r1
RIGHT join member m
on m.seq = r1.member_id


RIGHT JOIN은 쿼리문을 기준으로 RIGHT 오른쪽에 있는 테이블을 중심으로 출력을 하는데 오른쪽 테이블 전체와 on 조건에 해당하는 값중에서 왼쪽에 있는 테이블에 포함하는 값은 제외한다.

# RIGHT JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name
from room r1
RIGHT join member m
on m.seq = r1.member_id
where r1.member_id is null


FULL JOIN

FULL JOIN은 결론부터 말하면 mariaDB에서 시도할경우 사용할 수 없다고 에러가 나온다.

하지만 UNION문을 활용해 같은 결과를 내게 할 수는 있다.


FULL OUTER JOIN은 대상으로 삼는 테이블의 공통되는 부분과 공통되지 않는 부분을 조회한다. 쉽게 생각하면 FULL OUTER JOIN은 다음과 같이 정리가 가능하다.

INNER JOIN + LEFT JOIN + RIGHT JOIN = FULL OUTER JOIN

# FULL OUTER JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name 
from room r1 left join member m on r1.member_id = m.seq 
union
select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name  
from room r1 right join member m on r1.member_id = m.seq


FULL JOIN은 대상으로 삼는 테이블의 공통되지 않는 부분을 조회한다. 쉽게 생각하면 FULL JOIN은 다음과 같이 정리가 가능하다.

LEFT JOIN + RIGHT JOIN = FULL JOIN

select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name 
from room r1 left join member m on r1.member_id = m.seq 
where m.seq is null
union all
select 
	r1.member_id
	, r1.room_name
	, m.age
	, m.name  
from room r1 right join member m on r1.member_id = m.seq
where r1.member_id is null

(위의 SQL문에서는 union all로 했는데 만약 union으로 했으면 중복제거가 되었기 때문에 일부러 union all을 사용했다. union으로 작성했다면 2줄이 나왔지만 공통되는 조건의 데이터가 제외된다는 점은 같다.)


참조 사이트

https://kitty-geno.tistory.com/59

https://gwamssoju.tistory.com/98

https://tragramming.tistory.com/74

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글