개발/SQL

2. 비개발자를 위한 SQL 실무 튜토리얼: JOIN과 GROUP BY로 데이터 분석하기

devbake 2025. 8. 3. 18:07

SQL을 공부하다 보면 단일 테이블에서 SELECT로 데이터를 추출하는 것만으로는 한계가 있다는 걸 금방 느끼게 된다. 예를 들어 고객 정보와 주문 정보가 각각 다른 테이블에 있다면, 두 데이터를 하나로 묶어야만 실무 분석이 가능하다. 바로 이런 상황에서 필요한 것이 JOIN이다. 또한 데이터를 특정 기준으로 묶고 집계해야 할 때는 GROUP BY가 핵심 도구가 된다.

이 글은 비개발자, 마케터, 데이터 담당자가 실무에서 자주 접하는 상황을 가정하여 JOIN과 GROUP BY를 쉽게 이해하고 활용할 수 있도록 구성되었다. AI 없이 직접 SQL을 작성할 수 있도록 직관적인 예제로 설명한다.

 

 

🧱 예제 데이터 구조 설명

비개발자를 위한 SQL 실무 튜토리얼: JOIN과 GROUP BY로 데이터 분석하기

이번에는 두 개의 테이블을 활용한다.

1. users 테이블

필드명 자료형 설명
user_id INT 사용자 고유 ID
user_name TEXT 사용자 이름
signup_date DATE 가입 일자
 

2. orders 테이블

필드명 자료형 설명
order_id INT 주문 고유 번호
user_id INT 주문자 ID (외래키)
amount INT 주문 금액
order_date DATE 주문 날짜

 

 

🔗 JOIN 문법과 실전 예제

JOIN이란?

JOIN은 두 개 이상의 테이블을 공통된 컬럼을 기준으로 연결하는 SQL 구문이다.

기본 문법:

SELECT *
FROM A
JOIN B
ON A.공통컬럼 = B.공통컬럼;

 

예제 1: 주문 정보에 사용자 이름 붙이기

목표: 각 주문에 대해 어떤 사용자가 주문했는지 알아보자.

SELECT 
  orders.order_id,
  users.user_name,
  orders.amount
FROM orders
JOIN users
ON orders.user_id = users.user_id;

 

결과 예시:

order_id user_name amount
101 김철수 120000
102 이영희 90000
103 김철수 150000
이 쿼리는 orders 테이블의 user_id와 users 테이블의 user_id를 기준으로 연결해 사용자 이름을 가져온다.

 

예제 2: 특정 사용자의 주문만 보기

SELECT 
  users.user_name,
  orders.amount,
  orders.order_date
FROM orders
JOIN users
ON orders.user_id = users.user_id
WHERE users.user_name = '김철수';

orders 테이블의 user_id와 users 테이블의 user_id가 동일할 때에, 위와 같은 쿼리로 user_name이 '김철수'인 사용자의 주문량과 주문일자를 확인할 수 있다. 

 

 

 

📊 GROUP BY 문법과 실전 예제

GROUP BY란?

GROUP BY는 특정 컬럼을 기준으로 데이터를 묶고, 그 안에서 SUM, AVG, COUNT 등 집계 함수를 사용할 수 있게 해준다.

기본 문법:

SELECT 컬럼, 집계함수()
FROM 테이블
GROUP BY 컬럼;
 

 

예제 3: 사용자별 총 주문 금액 계산

SELECT 
  users.user_name,
  SUM(orders.amount) AS total_spent
FROM orders
JOIN users
ON orders.user_id = users.user_id
GROUP BY users.user_name;

결과 예시:

user_name total_spent
김철수 270000
이영희 90000

이 쿼리는 각 사용자별로 주문 금액을 합산하여 보여준다.

 

 

예제 4: 월별 주문 건수 분석

SELECT 
  strftime('%Y-%m', order_date) AS order_month,
  COUNT(*) AS order_count
FROM orders
GROUP BY order_month
ORDER BY order_month;

SQLite, PostgreSQL에서는 strftime, MySQL은 DATE_FORMAT을 사용하니 참고.

결과 예시:

order_month order_count
2025-06 4
2025-07 7

 

📌 실전에서의 활용 포인트

  • JOIN은 테이블 간 관계형 데이터 분석의 핵심이다.
  • GROUP BY는 리포트, 매출 분석, 트렌드 파악에 거의 항상 필요하다.
  • 이 둘을 조합하면 거의 모든 실무 데이터 분석을 수행할 수 있다.

 


결론

JOIN과 GROUP BY는 SQL에서 가장 강력한 기능이자, 실무에서 가장 자주 사용되는 쿼리 유형이다. 비개발자라고 해도 테이블 구조만 이해하고 예제를 따라가면 충분히 원하는 데이터를 뽑아낼 수 있다. 실무 데이터와 유사한 예제를 통해 SQL 분석의 실전 감각을 키워보자.
지금까지의 내용을 이해한다면 이제 더 복잡한 조건부 집계, 서브쿼리, 윈도우 함수 등도 배워나갈 준비가 된 것이다.