SQL에서 사용되는 쿼리에는 유용하게 사용할 수 있는 함수도 많습니다.
집합연산(GROUP BY): 레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산
SELECT * FROM customers
GROUP BY State; // customers 테이블의 모든 레코드를 State에 따라 그룹화
HAVING: GROUP BY로 조회된 결과를 필터링할 수 있습니다.
SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00
invoices 테이블을 CustomerId로 그룹화하고 그 평균이 6을 초과한 결과를 조회
HAVING은 그룹화한 결과에 대한 필터이고, WHERE는 저장된 레코드를 필터링합니다. 따라서 실제로 그룹화 전에 데이터를 필터해야 한다면, WHERE를 사용합니다.
COUNT(): COUNT함수는 레코드의 개수를 헤아릴 때 사용합니다. COUNT 함수의 사용법은 다음과 같습니다.
SELECT , COUNT() FROM customers
GROUP BY State;
위 커맨드를 실제로 실행하면, 각 그룹의 첫 번째 레코드와 각 그룹의 레코드 개수를 집계하여 리턴합니다. 다음과 같이 변경하면, 그룹으로 묶인 결과의 레코드 개수를 확인할 수 있습니다.
SELECT State, COUNT(*) FROM customers
GROUP BY State;
SUM(): SUM 함수는 레코드의 합을 리턴합니다.
SELECT InvoiceId, SUM(UnitPrice)
FROM invoice_items
GROUP BY InvoiceId;
위 커맨드는 invoice_items라는 테이블에서 InvoiceId 필드를 기준으로 그룹하고, UnitPrice 필드 값의 합을 구합니다.
AVG(): AVG 함수는 레코드의 평균값을 계산하는 함수입니다.
SELECT TrackId, AVG(UnitPrice)
FROM invoice_items
GROUP BY TrackId;
MAX(), MIN(): MAX 함수와 MIN 함수는 각각 레코드의 최댓값과 최솟값을 리턴합니다.
SELECT CustomerId, MIN(Total)
FROM invoices
GROUP BY CustomerId
SELECT 실행순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
SELECT CustomerId, AVG(Total)
FROM invoices
WHERE CustomerId >= 10
GROUP BY CustomerId
HAVING SUM(Total) >= 30
ORDER BY 2
위 쿼리문의 실행 순서
1. FROM invoices: invoices 테이블에 접근을 합니다.
2. WHERE CustomerId >= 10: CustomerId 필드가 10 이상인 레코드들을 조회합니다.
3. GROUP BY CustomerId: CustomerId를 기준으로 그룹화합니다.
4. HAVING SUM(Total) >= 30: Total 필드의 총합이 30 이상인 결과들만 필터링합니다.
5. SELECT CustomerId, AVG(Total): 조회된 결과에서 CustomerId 필드와 Total 필드의 평균값을 구합니다.
6. ORDER BY 2: AVG(Total) 필드를 기준으로 오름차순 정렬한 결과를 리턴합니다.