TIL # 111 : [SQL] Aggregate Functions

셀레스틴 허·2021년 3월 25일
0
post-thumbnail

Aggregate?

테이블에서 여러 row의 calculation 또는 연산을 aggregates이라고 부른다.

Important aggregates

  1. COUNT(): 특정 column row의 개수 세준다
  2. SUM(): 특정 column 속 값들의 합을 구한다
  3. MAX()/MIN(): 특정 column의 가장 큰, 작은 값을 구한다
  4. AVG(): 특정 column의 평균값을 구한다
  5. ROUND(): 특정 column의 값들을 반올림한다

COUNT

 SELECT COUNT(*) 
 FROM products
 WHERE price < 5000;

가격이 5000 이하인 제품만 count해서 개수를 알려준다

SUM

SELECT SUM(reviews)
FROM products;

MAX, MIN

가장 작은, 그리고 큰 가격을 돌려준다

SELECT MAX(price)
FROM products;

SELECT MIN(price)
FROM products;

AVG

SELECT AVG(price)
FROM products;

ROUND

ROUND는 두가지 값을 받는다
1. column 이름
2. decimal 자리수

SELECT ROUND(AVG(price), 2)
FROM products;

제품의 평균 가격대를 2자리 소수까지 반올림한다

GROUP BY

  • SELECT, aggregate 함수와 함께 쓰이는 구문
  • GROUP BY는 WHERE 구문 뒤에 나오지만, ORDER BY 또는 LIMIT 이전에 사용해야 한다
  • 말 그대로 데잍를 그룹할 때 사용되는 구문이다
SELECT AVG(price)
FROM products
WHERE category = 'espresso';

SELECT AVG(price)
FROM products
WHERE category = 'juice';

SELECT AVG(price)
FROM products
WHERE category = 'blended';

... 등등은 매우 비효율적이다!

다음과 같이 GROUP BY를 사용해 더 효율적으로 작성할 수 있다:

SELECT category,
   AVG(price)
FROM products
GROUP BY category
ORDER BY category;

각 카테고리의 평균값을 카테고리로 정렬한다

  • column reference
    선택한 첫번째 column : 1
    선택한 두번째 column : 2
    선택한 세번째 column : 3
SELECT category, 
   price,
   AVG(reviews)
FROM products
GROUP BY 1, 2;

aggregate 함수는 각 그룹에 계산된다

예시
Employee라는 테이블이 있고, 거기에는 id, name, year_of_training, dep, sal 이라는 필드가 선언되어 있다. 우리는 Employee 테이블 속 각 부서의 가장 높은 연봉을 구하고 싶다 .
이 때 SELECT Dep, MAX(sal) FROM Employee GROUP BY Dep으로 구하면 우리는 각 부서의 최고 연봉을 볼 수 있다!

HAVING

  • 그룹을 필터하고 싶을 때 어떤 그룹을 넣을지 뺄지를 정할 수 있다
  • aggregate 함수는 WHERE가 아닌 HAVING으로 필터해야 한다
  • 왜? row를 필터하고싶지 않기 때문이다!
SELECT price, 
   ROUND(AVG(reviews)),
   COUNT(*)
FROM products
GROUP BY price
HAVING COUNT(*) > 10;
  1. 우리는 각 price의 review 평균값, 그리고 개수를 product table에서 가져오고
  2. price으로 그룹이 되어있으며
  3. 그룹된 price 개수가 10개 이하인 항목들은 HAVING을 통해 거른다
profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글