사이먼's 코딩노트

[DB] GROUP BY, UNION 본문

데이터베이스(DB)

[DB] GROUP BY, UNION

simonpark817 2024. 3. 28. 18:40

[GROUP BY]

  • GROUP BY는 같은 값을 가진 행끼리 하나의 그룹으로 뭉쳐주는 역할을 한다.
  • 행을 그룹해야하는 이유는 GROUP BY 절은 주로 여러 행의 값을 더하거나, 평균값을 내거나, 개수를 세거나, 최고(저)값을 계산하거나 하는 집계 함수에 사용되기 때문에 필요하다.
  • 대표적인 집계 함수는 아래와 같다.
  1. COUNT() : 행의 개수를 카운트한다.
  2. MAX() : 행 안에 있는 값들 중 최대값을 반환한다.
  3. MIN() : 행 안에 있는 값들 중 최소값을 반환한다.
  4. AVG() : 행 안에 있는 값들의 평균값을 반환한다.
  5. SUM() : 행 안에 있는 값들의 합을 반환한다.
  • 먼저 부서가 담겨있는 테이블인 dept와 사원이 담겨있는 테이블인 emp가 있다고 생각해보자.

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 부서 중 하나의 부서의 정보만 조회되게 된다.

GROUP BY를 통해 조회한 부서별 최고연봉

 

[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 문에 ( )을 씌워줘야 한다.

UNION을 사용한 조회 결과

 

 

 

반응형

'데이터베이스(DB)' 카테고리의 다른 글

[DB] 문제풀이  (0) 2024.03.28
[DB] 조인(JOIN)  (0) 2024.03.28
[DB] 기본 쿼리 종류  (2) 2024.03.27
[DB] MySQL 설치 및 기본 세팅  (0) 2024.03.27