사이먼's 코딩노트
[DB] GROUP BY, UNION 본문
[GROUP BY]
- GROUP BY는 같은 값을 가진 행끼리 하나의 그룹으로 뭉쳐주는 역할을 한다.
- 행을 그룹해야하는 이유는 GROUP BY 절은 주로 여러 행의 값을 더하거나, 평균값을 내거나, 개수를 세거나, 최고(저)값을 계산하거나 하는 집계 함수에 사용되기 때문에 필요하다.
- 대표적인 집계 함수는 아래와 같다.
- COUNT() : 행의 개수를 카운트한다.
- MAX() : 행 안에 있는 값들 중 최대값을 반환한다.
- MIN() : 행 안에 있는 값들 중 최소값을 반환한다.
- AVG() : 행 안에 있는 값들의 평균값을 반환한다.
- SUM() : 행 안에 있는 값들의 합을 반환한다.
- 먼저 부서가 담겨있는 테이블인 dept와 사원이 담겨있는 테이블인 emp가 있다고 생각해보자.
- 전 사원에 대하여 부서별, 최고연봉을 조회해봅시다.
- 조건은 IT 부서에 속한 사원이 없으니 해당 부서의 최고연봉을 NULL이 아닌 0으로 표시해봅시다.
SELECT D.name AS 부서명,
IFNULL(MAX(E.salary), 0) AS 최고연봉
FROM dept AS D
LEFT JOIN emp AS E
ON D.id = E.deptId
GROUP BY D.id;
- 위 쿼리를 해석해보자면 먼저 우리가 조회하길 원하는 dept 테이블의 부서명과 emp 테이블의 최고연봉이 있다.
- LEFT JOIN을 통해 왼쪽 테이블인 dept에 맞춰 아직 사원이 없는 IT 부서도 조회가 가능하게 한다.
- 관심있게 봐야할 부분은 최고연봉을 select 할 때 IFNULL(MAX(E.salary), 0)로 작성된 부분이다.
- 이는 사원 테이블의 연봉을 MAX 최고 값을 반환하되, 만약 NULL 값이 있다면 0으로 반환하겠다 라는 뜻이다.
- 이 쿼리문을 쓰게됨으로써 IT 부서의 최고연봉 부분에 NULL이 아닌 0이 반환되게 된다.
- 추가로 마지막에 GROUP BY D.id를 쓰게 되면서 dept 테이블에 있는 id 즉 모든 부서에 대해 그룹화를 짓는다.
- 만약에 GROUP BY를 쓰지 않게된다면 홍보, 기획, IT 부서 중 하나의 부서의 정보만 조회되게 된다.
[UNION]
- 조회한 다수의 SELECT 문을 하나로 합치고 싶을 때 UNION을 사용할 수 있다.
- UNION은 결과를 합칠 때 중복되는 행은 하나만 표시를 해준다.
- UNION ALL은 중복제거를 하지 않고 모두 합쳐서 표시를 해준다.
- 위에서 만들어 놓은 dept 테이블과 emp 테이블을 이용해서 UNION의 예시를 한번 살펴봅시다.
- 우리가 원하는 것은 하나의 쿼리로 최고연봉자와 최저연봉자의 이름과 연봉을 조회하는 것이다.
(
SELECT E.salary AS `연봉`,
E.name AS `사원명`,
'최고연봉자' AS `타입`
FROM emp AS E
ORDER BY E.salary DESC
LIMIT 1
)
UNION
(
SELECT E.salary AS `연봉`,
E.name AS `사원명`,
'최저연봉자' AS `타입`
FROM emp AS E
ORDER BY E.salary ASC
LIMIT 1
)
ORDER BY `타입` ASC
- 위 쿼리를 해석해보자면 먼저 우리가 조회하길 원하는 emp 테이블의 연봉과 사원명이 있다.
- UNION은 여러개의 SELECT 문을 합치는 역할이기 때문에 우리는 최고연봉자와 최저연봉자를 조회하는 SELECT 문을 2개 준비해야한다.
- 먼저 최고연봉자를 조회하는 SELECT 문을 보면 ORDER BY를 통해 연봉의 DESC 즉 내림차순으로 조회하고 LIMIT 1을 작성하여 가장 높은 연봉부터 조회하는데 제한을 1개만 둔다.
- 물론 ORDER BY를 사용하지 않고 MAX를 이용할 수도 있다.
- 그 다음 최저연봉자를 조회하는 SELECT 문을 보면 ORDER BY를 통해 연봉의 ASC 즉 오름차순으로 조회하고 LIMIT 1을 작성하여 가장 적은 연봉부터 조회하는데 제한을 1개만 둔다.
- 마찬가지로 ORDER BY를 사용하지 않고 MIN을 사용해도 무방하다.
- 이렇게 두 개의 SELECT 문을 통해 한번에 조회를 하고 싶다면 SELECT 문 사이에 UNION을 작성한다.
- 이 때 주의할 점은 각 SELECT 문에 ( )을 씌워줘야 한다.
반응형
'데이터베이스(DB)' 카테고리의 다른 글
[DB] 문제풀이 (0) | 2024.03.28 |
---|---|
[DB] 조인(JOIN) (0) | 2024.03.28 |
[DB] 기본 쿼리 종류 (2) | 2024.03.27 |
[DB] MySQL 설치 및 기본 세팅 (0) | 2024.03.27 |