group by
이거는 그룹별로 묶는 것이다. 즉 여러개의 데이터를 한개의 그룹으로 묶어서 나타내게 하는것이다. 여기서 주의할점은 group by 로 묶은 것과 sum이나 count 이런 함수를 쓰지 않은 컬럼을 함께 쓸수 없다는 것이다. 왜냐하면 group by로 묶으면 해당 컬럼은 한개로 변환된다. 같은 것끼리 한곳에 묶여서 순서대로 나오는 것이 아니라 그냥 한개의 데이터가 되어버린다. 그래서 데이터 갯수가 맞는거 끼리 출력을 해줘야 된다.
select * from employees group by department_id order by job_id;
이거는 명백히 잘못된것이다. 이것을 쓴 나는 처음에 department_id로 묵고 그안에서는 job_id로 순서대로 정렬해서 전체를 출력 할 생각 이었다. 하지만 이것은 내가 개념을 잘못 이해 하고 있던것이다.group by로 묶인것은 데이터가 한개로 변환된다. select * from employees order by department_id , job_id; 이렇게 써야지 내가 처음에 계획한것이 나오게 된다.
select department_id,sum(salary) from employees group by department_id order by department_id;
이런식으로 그룹별로 데이터가 한개만 나올수 있는 컬럼만 사용해서 검색을해야지 제대로 된다.
goup by에도 having이라는 조건이 있다.
having
그룹을 막 묶을 것이아니라 특정 조건에 따라 묶고 싶을때가 있다.
select department_id,sum(salary) from employees group by department_id order by department_id;
여기에 한번 조건을 넣어봅시다. department_id; 가 10~50까지만 뽑아보겠습니다.
select department_id,sum(salary) from employees group by department_id having department_id between 10 and 50 order by department_id;
select department_id,sum(salary) from employees where department_id between 10 and 50 group by department_id order by department_id ;
이렇게 where도 같은 효과입니다. 하지만 where이 더좋습니다. 왜냐하면 순서를 보면 이해가 됩니다. 우선 where이 먼저 실행 됩니다. 그럼 일단 범위를 줄이고 그룹을 묶습니다. 하지만 having을쓰면 일단다뽑고 그룹을 묶고 젤 마지막에 해당데이터를 제외 시키게 됩니다. 즉 자원을 더 많이 쓰게 되므로 where을 쓸수 있으면 where 을 쓰는게 더좋습니다.
join
join은 두개의 테이블을 합치기 위한 것입니다. 두개의 데이터를 함께 사용해야될때 쓰는데 어려울수 있습니다.
inner join 은 서로 공통된 부분만 있는 거만 묶어 줍니다.
outer join 한쪽을 기준으로 한쪽은 모두 포함하는걸 전제로 반대쪽은 한쪽과 연관되어있는거만 묶어서 출력합니다.
cross join 연관 관계를 생각하지 않고 모든 경우의 수를 출력하개 됩니다. 즉 4개 6개있으면 24개가 출력이 됩니다. 왼쪽 1개를 오른쪽6개와 모두 한번씩 연결하는 식입니다.
join은 이걸말고도 다양하게 있지만 전 가장 중요한 이 3가지를 설명하겠습니다.