자격증/SQLD

[SQL 첫걸음] 22강. 그룹화 - GROUP BY

동호다찌 2022. 4. 4. 09:27

그룹화 - GROUP BY

1. GROUP BY로 그룹화

  • GROUP BY구를 통해 지정된 열의 값이 같은 행을 하나의 그룹으로 묶어서 집계함수로 넘겨줄 수 있다.
SELECT name FROM sample51 GROUP BY name;

  • 결과는 DISTINCT와 같다.
  • GROUP BY의 의미는 집계함수와 함께 사용할 때 나타난다.
SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name;

  • GROUP BY에 의해 name이 4개의 그룹으로 나뉘고, 각 그룹별로 COUNT와 SUM의 결과가 반환됐다.

2. HAVING 구로 조건 지정

SELECT 열 FROM 테이블 GROUP BY 열 HAVING 조건
  • WHERE구는 GROUP BY보다 처리 순서가 앞서기때문에 집계함수에서는 WHERE구의 조건식에서는 GROUP BY를 사용할 수 없다.
  • 하지만 그룹화보다 늦게 처리되는 ORDER BY등은 문제없이 사용이 가능하다.
내부처리 순서 :
WHERE → GROUP BY → HAVING → SELECT → ORDER BY
  • 집계한 결과에서 조건에 맞는 값을 따로 걸러낼 때는 HAVING구를 사용한다.
SELECT name,COUNT(name)FROM sample51 GROUP BY name HAVING COUNT(name)=1;

SELECT name AS n,COUNT(name) AS cn FROM sample51 GROUP BY n HAVING cn=1; 같은 명령은 SELECT구가 후순위이기 때문에 원래는 불가능하지만, MySQL에서는 융통성있게 사용이 가능하다.


3. 복수열의 그룹화

  • GROUP BY에 지정한 열 이외의 열은 집계함수 없이 SELECT구에 기술할 수 없다.
  • GROUP BY는 그룹마다 하나의 행만을 반환하는데, 나머지 열에 대에 그룹 중 어떤 값을 반환해야할지 지정되지 않아 에러가 생기는 것이다.
SELECT MIN(no),name,SUM(quantity) FROM sample51 GROUP BY name;

위와 같이 복수의 열을 지정할 때는 집계함수로 하나의 값을 지정해줘야한다.

4. 결과값 정렬

  • GROUP BY로 그룹화 한 후에도 ORDER BY구를 사용해 결과를 정렬할 수 있다.
SELECT name, COUNT(name),SUM(quantity) FROM sample51 GROUP BY name ORDER BY SUM(quantity) DESC;