집계 함수와 함계 많이 사용되는 절이 GROUP BY 절이다.
예를 들면, 어떤 테이블에 카테고리 분류 열이 있다면 각 카테고리별로 그룹을 만들 수 있다.
각 카테고리별로 그룹을 묵으면 그룹별 편균 등을 집계하기 좋다.
GROUP은 결국 특정 컬럼을 기준으로 집계를 낸다는 뜻이다.
[1] 기본 형식
SELECT [GROUP BY 절의 지정 컬럼], [집계할 값]
FROM [테이블명]
GROUP [그룹 묶을 컬럼];
[2] titles 테이블에서 각 type 별로 카테고리를 그룹지어서 출력하시오.
SELECT type, AVG(price) AS 평균
FROM dbo.titles
GROUP BY type;
[3] 정렬도 가능하다.
단, 평균으로 정렬시는 주의해야 한다. 특히 집계함수 사용시 주의.
SELECT type, AVG(price) AS ‘각 카테고리별 평균 책값’
FROM dbo.tiles;
GROUP BY type
—ORDER BY AVG(price) DESC:
ORDER BY type ASC
[4] 각 그룹 별로 카운트
SELECT type AS t , COUNT(type) AS ‘그룹별 책 갯수’, AVG(price) AS ap
FROM dbo.tiles
GROUP BY type
ORDER BY ap DESC;
[5] 조건도 가능하다.
이때 HAVING 절을 사용하면 된다.
HAVING은 GROUP BY로 가져온 결과 값에 대해서 조건을 붙여 원하는 값만 출력시킬수 있다.
예) 각 카테고리 별로 그룹을 묶어서 출력시 평균 책값이 15달러 이상만 출력하시오
SELECT type, AVG(price) AS ‘각 카테고리별 평균 책값’
FROM dbo.titles
GROUP BY type
HAVING AVG(price) ≥15;
HVAING 절은 GROUP BY절 뒤에 쓴다.
GROUP BY절로 그룹지어 가져온 결과 값에 대해서 조건을 붙여주는 것 이기때문이다.
[6] WHERE 절과 HAVING 절을 같이 사용할때는 주의해야 한다.
WHERE > GROUP BY > HAVING 절의 순서로 기억하자.
예) 팩 가격이 11달러 이상에서 각 카테고리 타입별로 묶어서 평균 가격이 17달러 이상만 출력하시오.
SELECT type, AVG(price) AS ‘ 각 카테고리별 평균 책값’
FROM dbo.titles
WHERE price ≥11
GROUP BY type
HAVING AVG(price) ≥17;
ORDER BY AVG(price) ASC:
[7] GROUP BY ALL
GROUP BY 로 각 카테고리별 평균을 구할 때 조건에 맞는 값이 없는 경우도 나올 수 있다.
그럼 NULL 값을 가지는데 일반적인 경우 GROUP BY는 그런 NULL을 출력하지 않는다.
ALL은 반대로 그럴 때 사용하며 NULL을 그대로 출력시켜 준다.
따라서 ALL을 사용하면 조건에서 어떤 항목이 제외되었는지를 명확히 알 수 있게 된다.
즉, 어떤 항목이 제외되었는지를 명확히 나타내고자 할 때 사용한다.
SELECT type, AVG(price) AS ‘평균가격’
FROM dbo.titles
WHERE price ≥21
GROUP BY type
SELECT type, AVG(price) AS ‘평균가격’
FROM dbo.titles
WHERE price ≥21
GROUP BY All type
[8] GROUP BY ALL과 NOT IN 사용 쿼리
SELECT type, AVG(price) AS ‘평균가격’
FROM dbo.titles
WHERE type NOT IN('mod_cook', 'psychology', 'trad_cook', 'UNDECIDED')
GROUP BY type
ORDER BY AVG(price) DESC:
SELECT type, AVG(price) AS ‘평균가격’
FROM dbo.titles
WHERE type NOT IN('mod_cook', 'psychology', 'trad_cook', 'UNDECIDED')
GROUP BY All type
ORDER BY AVG(price) DESC: