SQL을 배우다 보면 단순히 데이터를 조회하는 것에서 끝나지 않고,
원하는 조건의 데이터를 계산하고, 범주별로 묶고, 정렬해서 보기 좋게 만드는 과정까지 이어지게 된다.
이번 학습에서는 SUM, AVG, COUNT, MIN, MAX 같은 집계 함수부터
GROUP BY, ORDER BY까지 SQL의 핵심 구조를 익혔다.
엑셀에서 하던 계산을 SQL로 한 번에 처리할 수 있다는 점이 특히 인상적이었다.
SQL은 데이터를 조회하는 언어이지만, 단순 조회만 하는 것은 아니다.
숫자 연산도 가능해서 컬럼끼리 더하거나 빼는 식도 바로 사용할 수 있다.
예를 들어 음식 준비 시간과 배달 시간을 더해서 총 소요 시간을 구할 수 있다.
select food_preparation_time,
delivery_time,
food_preparation_time + delivery_time as total_time
from food_orders
SQL에서 사용할 수 있는 기본 연산자는 다음과 같다.
| 연산자 | 설명 |
|---|---|
| + | 더하기 |
| - | 빼기 |
| * | 곱하기 |
| / | 나누기 |
이처럼 SQL은 단순히 데이터를 보여주는 도구가 아니라,
데이터를 원하는 형태로 계산해서 보여주는 도구라는 점을 알 수 있었다.
엑셀에서 자주 쓰는 합계, 평균, 개수, 최솟값, 최댓값도 SQL에서 바로 구할 수 있다.
이때 사용하는 것이 집계 함수다.
| 함수 | 의미 |
|---|---|
| SUM(컬럼) | 합계 |
| AVG(컬럼) | 평균 |
| COUNT(컬럼) | 개수 |
| MIN(컬럼) | 최솟값 |
| MAX(컬럼) | 최댓값 |
예를 들어 음식 준비 시간의 합계와 배달 시간의 평균은 아래처럼 구할 수 있다.
select sum(food_preparation_time) total_food_preparation_time,
avg(delivery_time) avg_food_delivery_time
from food_orders
이 문법을 보면서 엑셀에서 일일이 계산하던 작업을
SQL 한 줄로 처리할 수 있다는 점이 정말 편리하게 느껴졌다.
데이터를 다루다 보면 “전체 주문 건수는 몇 개일까?”,
“주문한 고객 수는 몇 명일까?” 같은 질문을 자주 하게 된다.
이럴 때는 COUNT를 사용하면 된다.
select count(1) count_of_orders,
count(distinct customer_id) count_of_customers
from food_orders
위 쿼리는 다음 두 가지를 구한다.
여기서 DISTINCT는 중복을 제거하고 고유한 값만 세는 역할을 한다.
집계 함수는 평균이나 합계만 구하는 것이 아니다.
가장 작은 값과 가장 큰 값도 쉽게 확인할 수 있다.
select min(price) min_price,
max(price) max_price
from food_orders
이 쿼리를 통해 주문 가격의 최소값과 최대값을 바로 확인할 수 있다.
데이터의 전체 범위를 파악할 때 매우 유용한 방식이다.
집계 함수는 전체 데이터에만 사용하는 것이 아니라
원하는 조건의 데이터만 골라서 계산할 수도 있다.
예를 들어 주문 금액이 30,000원 이상인 주문 건수를 구하려면 다음과 같이 작성할 수 있다.
select count(order_id) count_of_orders
from food_orders
where price >= 30000
또한 한국 음식 주문의 평균 가격도 구할 수 있다.
select avg(price) as average_price
from food_orders
where cuisine_type = 'Korean'
이 부분을 배우면서 SQL은 단순 조회를 넘어서
조건에 맞는 데이터만 뽑아 의미 있는 숫자로 바꾸는 과정이라는 걸 더 분명히 이해하게 됐다.
조건별로 하나씩 조회하는 것도 가능하지만,
카테고리가 많아질수록 쿼리를 여러 번 작성해야 해서 비효율적이다.
이럴 때 사용하는 문법이 바로 GROUP BY다.
GROUP BY는 특정 기준으로 데이터를 묶어서 범주별 계산을 가능하게 해준다.
예를 들어 음식 종류별 주문 금액 합계를 구하면 다음과 같다.
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
이 쿼리는 음식 종류별로 데이터를 묶은 뒤,
각 그룹의 주문 금액 합계를 계산한다.
| 항목 | 설명 |
|---|---|
| GROUP BY | 같은 값을 가진 행끼리 묶기 |
| 사용 목적 | 범주별 합계, 평균, 개수, 최댓값, 최솟값 계산 |
| 자주 함께 쓰는 함수 | SUM, AVG, COUNT, MIN, MAX |
select restaurant_name,
max(price) "최대 주문금액"
from food_orders
group by restaurant_name
이 쿼리는 음식점 이름을 기준으로 그룹을 나눈 뒤,
각 음식점의 최대 주문금액을 보여준다.
select pay_type "결제타입",
max(date) "최근 결제일"
from payments
group by pay_type
이렇게 GROUP BY를 사용하면 같은 테이블에서도
다양한 기준으로 데이터를 요약해서 볼 수 있다.
SQL 조회 결과는 항상 내가 원하는 순서로 나오지 않는다.
그래서 필요한 것이 ORDER BY다.
ORDER BY를 사용하면 조회 결과를 오름차순 또는 내림차순으로 정렬할 수 있다.
| 정렬 방식 | 설명 | 예시 |
|---|---|---|
| 오름차순 | 작은 값 → 큰 값 | order by price |
| 내림차순 | 큰 값 → 작은 값 | order by price desc |
예를 들어 음식 종류별 주문 금액 합계를 합계 기준으로 정렬하면 아래와 같다.
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
order by sum(price)
select restaurant_name,
max(price) "최대 주문금액"
from food_orders
group by restaurant_name
order by max(price) desc
select *
from customers
order by name
정렬을 추가하니 결과를 훨씬 더 보기 쉽게 만들 수 있었고,
실무에서도 바로 활용할 수 있는 형태라는 생각이 들었다.
이번 학습에서 가장 중요하게 느낀 부분 중 하나는
SQL 문장이 일정한 구조와 순서를 가진다는 점이었다.
기본 구조는 다음과 같다.
select
from
where
group by
order by
즉 SQL은 아무 순서로나 쓰는 것이 아니라,
반드시 조회 → 테이블 → 조건 → 그룹화 → 정렬의 흐름으로 작성해야 한다.
| 순서 | 구문 | 역할 |
|---|---|---|
| 1 | SELECT | 조회할 컬럼 또는 계산식 선택 |
| 2 | FROM | 데이터를 가져올 테이블 지정 |
| 3 | WHERE | 조건 필터링 |
| 4 | GROUP BY | 범주별 그룹화 |
| 5 | ORDER BY | 결과 정렬 |
이 순서를 머릿속에 넣고 문제를 풀면
복잡해 보여도 차근차근 쿼리를 완성할 수 있다.
이번 SQL 학습을 통해 단순 조회를 넘어
계산, 조건 필터링, 그룹화, 정렬까지 한 번에 처리할 수 있다는 점을 배웠다.
특히 인상적이었던 점은 다음과 같다.
WHERE로 원하는 데이터만 골라 계산할 수 있다는 점GROUP BY로 범주별 분석이 가능하다는 점ORDER BY로 결과를 실무에 바로 쓸 수 있게 정리할 수 있다는 점처음에는 문법이 많아 보여 복잡하게 느껴졌지만,
결국은 기본 구조를 이해하고 필요한 기능을 하나씩 붙여가는 과정이라는 생각이 들었다.
이번 챕터에서는 SQL로 데이터를 계산하고,
범주별로 묶고, 정렬하는 흐름까지 배웠다.
핵심만 정리하면 다음과 같다.
| 주제 | 핵심 내용 |
|---|---|
| 집계 함수 | SUM, AVG, COUNT, MIN, MAX |
| 조건 계산 | WHERE와 함께 사용 |
| 그룹화 | GROUP BY |
| 정렬 | ORDER BY |
| 전체 구조 | SELECT → FROM → WHERE → GROUP BY → ORDER BY |
앞으로 SQL을 더 배우게 되면 문법은 더 많아지겠지만,
이번에 익힌 구조가 SQL의 기본 뼈대가 된다는 점에서 매우 중요한 학습이었다.
기초가 탄탄해야 이후 JOIN이나 서브쿼리 같은 내용도 더 쉽게 이해할 수 있을 것 같다.