데이터 요약
목차
그룹_함수_사용하기
데이터를 실제로 가져오지 않고 데이터를 요약해야 할 때가 종종 있다. SQL은 이런 목적을 위해 그룹 함수를 제공하고, 분석이나 보고를 목적으로 데이터를 가져올 수 있다.
그룹 함수 사용 환경
- 테이블에 있는 행의 수(또는 조건을 만족하거나 특정한 값을 가진 행의 수)를 확인한다.
- 테이블에 있는 여러 행의 합계를 구한다.
- 테이블에서 가장 큰 값, 가장 작은 값, 평균값을 구한다(모든 행이나 특정 행에 있는)
그룹 함수를 사용하는 목적은 데이터 그 자체가 아닌 데이터의 요약 정보이다.
함수 | 설명 |
---|---|
AVG() | 열의 평균값을 반환한다. |
COUNT() | 열에 있는 행의 개수를 반환한다. |
MAX() | 열의 최댓값을 반환한다. |
MIN() | 열의 최솟값을 반환한다. |
SUM() | 열의 합계를 반환한다. |
AVG() 함수
AVG()
는 테이블에 있는 행의 수와 각 행의 합을 계산해 특정 열의 평균값을 반환한다.
또 모든 열의 평균값을 구하거나 특정 열 또는 행의 평균값을 구할 수 있다.
SELECT AVG(prod_price) AS avg_price FROM Products; SELECT AVG(prod_price) AS avg_price FROM Products WHERE vend_id = 'DLL01';
[!NOTE]
AVG()는 숫자열 하나의 평균값을 구하는 데 사용할 수 있으며, 매개변수로 열 이름을 적어주어야 한다.
여러 열에 대한 평균값을 얻고 싶다면, 여러 개의 AVG() 함수를 사용해야 한다.
여러 열에서 계산된 하나의 값을 가져오는 경우는 예외인데, 이는 추후에 다룬다.AVG() 함수는 NULL 값을 가진 행은 무시한다.
COUNT() 함수
COUNT() 함수
는 말 그대로 행의 개수를 세는 함수이다. COUNT()를 사용해서 테이블에 있는 행의 수나 지정한 조건을 만족하는 행의 수를 구할 수 있다.
COUNT()는 두 가지 방법으로 사용할 수 있다.
- 테이블에 있는 모든 행의 수를 세기 위해
COUNT(*)
를 사용한다. NULL 값을 가진 열을 포함하여 행의 수를 센다. - 지정한 열에 값이 있는 행의 수를 세기 위해
COUNT(열 이름)
를 사용한다. 이 때 NULL 값을 가진 행은 무시된다.
SELECT COUNT(*) AS num_cust
FROM Customers;
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
MAX() & MIN() 함수
MAX() 와 MIN()
은 각각 지정항 열에서 가장 큰 값과 작은 값을 반환한다. 아래 예시 처럼 열 이름을 명시해야 한다.
SELECT MAX(prod_price) AS max_price
FROM Products;
SELECT MIN(prod_price) AS min_price
FROM Products;
[!NOTE]
MAX() 나 MIN()은 보통 숫자나 날짜 데이터에서 가장 크거나 작은 값을 구하기 위해 사용하지만,
많은 DBMS는 문자열 데이터가 있는 열에서도 MAX() 와 MIN()을 지원한다.
문자열 데이터에 위 함수를 사용하면 MAX()는 데이터가 열로 졍렬된 경우 가장 마지막에 있는 행을,
MIN()은 가장 처음에 있는 행을 반환한다.MAX() 와 MIN() 함수는 NULL 값을 가진 행을 무시한다.
SUM() 함수
SUM()
은 지정한 열의 합을 구한다.
SELECT SUM(quantity) AS item_ordered
FROM OrderItems
WHERE order_num = 20005;
SELECT SUM(item_price * quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;
[!NOTE]
모든 그룹 함수는 표준 수학 연산자를 사용하여 여러 열에 대한 계산을 수행할 수 있다.SUM() 함수 역시 NULL 값을 가진 행을 무시한다.
중복되는_값에_대한_그룹_함수
다섯 개의 그룹 함수 모두 두 가지 방법으로 사용할 수 있다.
- ALL을 쓰거나 아무런 키워드도 쓰지 않으면 모든 행에 대해 계산을 수행한다.
(ALL이 기본값이기 때문에 아무런 키워드도 쓰지 않으면 ALL로 인식한다.) - 중복되는 값을 제거하기 위해
DISTINCT
키워드를 쓴다.
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
[!NOTE]
COUNT(*)
와DISTINCT
는 같이 사용할 수 없다.
DISTINCT는 COUNT()에 열 이름이 지정된 경우에만 함께 사용할 수 있다.
즉,COUNT(*)
와는 함께 사용할 수 없다.
또 한, 계산이나 수식과는 함께 사용할 수 없고 반드시 열 이름과 함께 사용해야 한다.MIN(), MAX()에서 DISTINCT 사용
엄밀히 따지면 MIN(), MAX() 함수에서 DISTINCT를 사용할 수 있지만,
실제로는 중복을 포함하든, 포함하지 않든 최솟값과 최댓값은 똑같기 때문에 큰 의미가 없다.추가 그룹 함수 키워드
앞서 보았던 DISTINCT와 ALL 외에
몇 몇 DBMS는 쿼리 결과에서 일부분을 계산할 수 있게 해주는 TOP, TOP PERCENT와 같은 키워드를 추가로 지원한다.
그룹_함수_결합하기
그룹 함수는 SELECT 문에서 필요한 만큼 사용할 수 있다.
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
[!NOTE]
그룹 함수의 결과를 저장할 별칭을 지정할 때는 테이블에 있는 실제 열 이름은 사용하지 않는게 좋다.
실제 사용하는 열 이름을 사용하는게 잘못된 것은 아니지만,
많은 DBMS에서 이를 지원하지 않기 때문에 에러 메시지를 출력할 수도 있다.
추가 예제
SELECT SUM(quantity) AS items_ordered
FROM OrderItems;
SELECT SUM(quantity) AS items_ordered F
ROM OrderItems
WHERE prod_id = 'BR01';
SELECT MAX(prod_price) AS max_price
FROM Products
WHERE prod_price <= 10;