mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/01/25 ~ 2023/02/01 #39

Open danbi5228 opened 1 year ago

danbi5228 commented 1 year ago

다음 스터디

2023-02-01 pm 10:30 수요일

정리 범위

mojh7 commented 1 year ago

11.4.8 GROUP BY

특정 칼럼의 값으로 레코드를 그루핑하고, 그룹별로 집계된 결과를 하나의 레코드로 조회할 때 사용한다

11.4.8.1 WITH ROLLUP

그루핑된 그룹별로 소계를 가져올 수 있는 ROLLUP 기능

WITH ROLLUP과 함께 사용된 GROUP BY 쿼리의 결과는 그룹별로 소계를 출력하는 레코드가 추가되어 표시됨

97p dept_no 칼럼 1개만 있을 때는 소계가 1개만 존재하고 dept_no 칼럼값은 NULL로 표기

first_name, last_name 칼럼 2개로 늘어나는 예제는 소계가 2단계로 표시

first_name = Aamer 소계

전체 소계

이런식으로 표시됨


8.0 버전부터는 그룹 레코드에 표시되는 NULL을 사용자가 변경할 수 있다

SELECT ...
 IF(GROUPING(first_name), 'ALL first_name', first_name) AS first_name,
...

11.4.8.2 레코드를 칼럼으로 변환해서 조회

GROUP BY나 집합 함수를 통해 레코드를 그루핑할 수 있지만

하나의 레코드를 여러 개의 칼럼으로 나누거나 변환하는 SQL 문법은 없음


SUM(), COUNT() 같은 집합 함수와 CASE WHEN ... END 구문을 이용해 레코드를 칼럼으로 변환하거나

하나의 칼럼을 조건으로 구분해서 2개 이상의 칼럼으로 변환하는 것은 가능


11.4.8.2.1 레코드를 칼럼으로 변환

99p와 같이 쿼리를 작성하면

SELECT dept_no, COUNT(*) AS emp_count
FROM dept_emp
GROUP BY dept_no;

흔히 봤듯이 dept_no 칼럼의 값 별로 개수가 여러 레코드로 출력된다

레포팅 도구나 OLAP 같은 도구에서 레코드를 칼럼으로 변환해야 할 수도 있다

100p 결과처럼 부서 정보와 부서별 사원의 수를 레코드(가로)가 아닌 칼럼(세로)별로 변환됨

변환의 원리는

부서별로 9개의 레코드를 한 건의 레코드로 만들어야 하기 때문에

GROUP BY된 결과를 서브쿼리로 만든 후 SUM() 함수 적용


레코드를 칼럼으로 변환하는 작업은 위에 처럼 COUNT, MIN, MAX, AVG, SUM 등의 집합 함수를 사용하면 됨

11.4.8.2.2 하나의 칼럼을 여러 칼럼으로 분리

SELECT dept_no, COUNT(*) AS emp_count
FROM dept_emp
GROUP BY dept_no;

앞에 99p 쿼리인데 단순히 부서별로 전체 사원의 수만 조회하는 쿼리였다


SELECT de.dept_no,
    SUM(CASE WHEN e.hire_date BETWEEN '1980-01-01' AND '1989-12-31' THEN 1 ELSE 0 END) AS CNT_1980
    ...
    ...
    COUNT(*) AS cnt_total
FROM dept_emp de, employees e
WHERE e.emp_no=de.emp_no
GROUP BY de.dept_no;

해당 쿼리 처럼 SUM(CASE WHEN...) 문장을 통해 소그룹을 특정 조건으로 나눠서 사원의 수를 구하는 용도로 사용할 수 있고 결과는 101p 처럼 1980년도, 1990년도, 2000년도의 부서별 입사 사원의 수를 볼 수 있다


dept_emp 테이블 만으로는 사원의 입사 일자를 알 수 없으므로 employees 테이블을 조인했고

조인된 결과를 dept_emp 테이블의 dept_no별로 GROUP BY 를 실행 했다

그루핑된 부서별 사원의 정보에서 CASE WHEN 으로 사원의 입사 연도를 구분해서 연도별로 합계를 실행하면 원하는 결과를 얻을 수 있다


위와 같은 SQL 문장으로 상당히 많은 프로그램 코드를 줄일 수 있고 앞서나온 WITH ROLLUP 기능을 함께 사용한다면 더 유용한 결과를 만들어 낼 수 있다고 책에 나와있는데

GROUP BY 내용 매우 유익해보이고 실제로도 많이 쓸 듯?

danbi5228 commented 1 year ago

11.4.9 ORDER BY

11.4.9.1 ORDER BY 사용법 및 주의사항

11.4.9.2 여러 방향으로 동시 정렬

11.4.9.3 함수나 표현식을 이용한 정렬