티스토리 뷰


자기결합(셀프조인)
같은 테이블 끼리 결합하는 것이다.
한 테이블에서 두개의 컬럼을 조인해서 사용해야 할 때 사용한다.

a.group_name에는 부모부서가, b.group_name에는 현재부서가 들어간다.

1
2
3
select a.group_name,b.group_name
from tb_groups a join tb_groups b
on a.group_id = b.p_group_id
cs


그런데 그냥 join을 걸면 group_id와 p_group_id가 같지 않은것(?)은 나오지 않는다.
그래서 조인의 조건에 만족되지 않는 행까지도 포함시키는 조인인 OUTER JOIN(외부조인)을 사용한다.
RIGHT OUTER JOIN을 사용한 것은 기준이 되는 행이 오른쪽인 b.group_name이기 때문이다.

1
2
3
select a.group_name,b.group_name
from tb_groups a right outer join tb_groups b
on a.group_id = b.p_group_id
cs


오늘 알게된사실인데 as를 알고있었지만 신기했다.
두번째 쿼리를 돌리면 데이터가 잘 나오지만 어떤게 어떤건지 잘 구분하지 못하겠다. 
왜냐면 둘다 같은 컬럼인 group_name을 가져오기 때문이다.
그래서 as로 이름을 정해주면 쿼리 완전 보기 편하게 나옴!

1
2
3
select a.group_name as "부모그룹" , b.group_name as "현재그룹"
from tb_groups a right outer join tb_groups b
on a.group_id = b.p_group_id
cs


여기에서 더 나아가서 부서아래에 있는 부서(자식부서)가 몇개인지 알려면?
GROUP BY를 사용한다. GROUP BY절은 데이터들을 원하는 그룹으로 합치는 것이다.
그룹화 하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶인다.
중요한 것은 group by 절에서 그룹화 한 컬럼만 select 할수 있다는 것이다.

1
2
3
4
select p_group_id, count(*)
from tb_groups
group by p_group_id
order by count(*);
cs


GROUP BY절을 사용해서 그룹화를 한 다음에 조건을 지정하고 싶을 때 
일반적으로 where조건을 사용하는데 집계함수를 사용하는 경우 where 구를 사용할 수 없다고 한다.
(집계함수는 COUNT(), SUM() 이런것들이다.) 그래서 Select 명령에 HAVING 이라는 구가 있는데 이걸 사용한다.
GROUP BY 뒤에 기술하며 where과 동일하게 조건을 줄 수 있다.

아래의 쿼리는 위의 쿼리의 결과값에서 count가 2 이상인 결과만 보이게 하는 쿼리다.

1
2
3
4
5
select p_group_id, count(*)
from tb_groups
group by p_group_id
having count(*> 1
order by count(*);
cs

GROUP BY로 그룹화 하는 열은 1개만 가능한 것이 아니라 여러개 가능하다.

1
2
3
4
5
select p_group_id, reg_id, count(*), sum(tenant_id)
from tb_groups
group by p_group_id, reg_id
having count(*> 1
order by count(*);
cs


DISTINCT는 중복 데이터를 제거할때 사용된다.
DISTINCT는 제거 GROUP BY는 합친다 라고 생각하면 된다고 하셨다.

1
select distinct p_group_id, reg_id from jdn.tb_groups
cs


댓글