1. cross join
cross join 은 테이블간의 데이터 곱으로 말할수 있습니다.
즉 각부서별 직위를 모두 뽑아보고 싶다고 할때
mysql> select * from team, post;
아래와 같이 뽑아 볼수 있으며 join 한 결과는 team 데이터 5개 * post 데이터 5개 = 25개가 되는겁니다.
이런 cross join 은 실무에서는 거의 사용하지 않습니다.
2. inner join
일반적으로 가장 많이 사용하는 조인으로 각 테이블간의 일치되는 데이터를 찾을때 사용합니다.
mysql> select * from user_info, team where user_info.t_cd=team.t_cd
mysql> select * from user_info join team on user_info.t_cd=team.t_cd
mysql> select * from user_info inner join team on user_info.t_cd=team.t_cd
위 3가지 쿼리는 user_info(회원정보테이블)의 t_cd(부서코드) 데이터와 team(부서정보테이블)의 t_cd 가
서로 일치하는 값만을 결과로 뿌려줍니다.
그런데 나과장의 데이터가 보이질 않네요. 이는 나과장의 부서코드가 0006 인데
부서테이블에서 부서코드가 0006 인 데이터가 존재하지 않기 때문에 출력이 되지 않는겁니다.
반대로 부서테이블에 부서코드가 "0001" 이고 부서명이 "비서실" 이란 데이터가 하나가 추가된다면
아래와 같은 형태로 출력될것입니다.
mysql> INSERT INTO `team` VALUES ('0001', '비서실');
mysql> select * from user_info, team where user_info.t_cd=team.t_cd
참고로 조인하는 필드의 이름이 동일하다면
a. on user_info.t_cd=team.t_cd 이부분을 using(t_cd) 로 변경하셔도 됩니다.
이런경우 위의 결과와는 조금 다르게 user_info.t_cd 와 team.t_cd 가 따로 출력되지 않고
t_cd 로 하나로 합쳐져 출력됩니다.
b. select * from user_info natural join team 와 같이 하셔도 동일한 결과값으로 적용이 됩니다.
3. outer join
그런데 위의 조인의 경우 사원 리스트와 team 명을 출력하기에는 뭔가 문제가 있습니다.
사원은 5명이지만 testtest2 란 사원이 빠졌기 때문입니다.
그럼 사원리스트를 출력하기 위해서는 어떻게 해야 할까요?
사원을 모두 출력하고 그 사원에 맞는 팀정보를 출력하는것입니다.
만약 팀정보가 없다면 팀정보는 없다라고 인식을 해야겠죠.
이럴때 사용하는것이 outer join 입니다.
mysql> select * from user_info left join team on user_info.t_cd=team.t_cd group by user_info.uid
mysql> select * from user_info left join team using(t_cd) group by user_info.uid
mysql> select * from user_info natural left join team group by user_info.uid
left join 문구를 기준으로 왼쪽에 있는 user_info 를 기준으로 team테이블을 붙인거라고 보시면 되겠네요.
해당 sql 을 right join 으로 바꾼다면
mysql> select * from team right join user_info using(t_cd) group by user_info.uid
이렇게 표현할수도있습니다. left 냐 right 냐는 outer join 의 기준테이블을 왼쪽으로 잡느냐 오른쪽으로
잡느냐하는 것일뿐 차이는 없습니다.
group by 절을 적용시킨것은 앞전에 예제에서 팀테이블에서 t_cd 가 0001 고 t_name 이 비서실이라는
레코드를 생성했기 때문입니다. 그래서 group by 절을 빼면 실제로는 결과값이 박부장의 레코드가 2개 나오며 총 결과값이 6개가 나오게 됩니다. 이런 박부장의 중복된 정보를 처리하기위해 user_info.uid 에 group by 절을 적용시킨것입니다.
글이 약간 중간으로 빠졌는데 여하튼 해당데이터를 보시면 inner join 과는 다르게 나과장 데이터의 부서명(t_name) 에 (Null) 이란게 보입니다. 이 Null 은 값 자체가 없다는 것입니다. 빈값과 Null 은 다릅니다.
그럼 이렇게 가정해 봅시다. t_cd(부서명)이 0006 은 없어진 부서이다라고.. 그렇다면 없어진 부서의
직원들을 찾을때는 where team.t_cd is null 가 추가 됩니다.
mysql> select * from user_info left join team using(t_cd) where team.t_cd is null group by user_info.uid
참고로 left join 의 정식 sql 문은 left outer join 입니다.
4. self join
self join 은 말 그대로 자신을 조인하는 방법입니다.
user_info(회원테이블)의 rec_uid 는 해당 사원을 추천한 사람의 ID 입니다.
우리는 사원 ID, 사원명과 입사추천을 한사원명, 사원 ID을 한줄로 보고 싶습니다.
그러면 user_info 라는 테이블이 2개가 있다면 outer join 또는 inner join 을 사용하여 확인하겠지만
해당 테이블은 2개가 아니라 1개 입니다. 이때 사용하는방법을 self join 이라고 합니다.
self join 이라고 별도의 방법이 있는건 아니라 단지 자신을 join 한다하여 self join 이라고 합니다.
사용방법은 아래와 같습니다.
mysql> select A.uid as '사원ID', A.u_name as '사원명', B.uid as '추천사원ID', B.u_name as '추천사원명' from user_info as A left join user_info as B on A.rec_uid=B.uid
|