Chapter 9: 첫 번째 SQL 쿼리 작성하기 (엑셀 예제 포함)
시각화: Excel 테이블 → SQL 테이블
SQL 쿼리를 작성하기 전에, 여러분이 익숙한 Excel 테이블과 우리가 쿼리할 SQL 테이블 간의 시각적 연관을 명확히 해봅시다.
다음과 같은 고객 정보가 담긴 Excel 워크시트를 가지고 있다고 상상해 보세요:
Customer_ID | First_Name | Last_Name | City | State | |
---|---|---|---|---|---|
1 | John | Smith | john.smith@email.com | Chicago | IL |
2 | Sarah | Johnson | sarah.j@email.com | New York | NY |
3 | Michael | Williams | mw@email.com | Los Angeles | CA |
4 | Emma | Brown | emma.b@email.com | Houston | TX |
5 | James | Jones | james.jones@email.com | Phoenix | AZ |
SQL 데이터베이스에서는 이 테이블이 customers
라는 이름의 테이블로 동일한 구조로 존재하게 됩니다. 컬럼명은 Excel 헤더와 같고, 각 행은 데이터베이스의 하나의 레코드입니다.
우리가 SQL 쿼리를 작성하는 것은, 마치 Excel에서 필터링, 정렬, 분석을 하듯이 이 테이블에 대해 "질문"을 던지는 것입니다.
단계별: 필터, 피벗, 요약의 SQL 버전은?
Excel에서 자주 사용하는 작업들을 SQL에서는 어떻게 표현하는지 알아봅시다.
1. 데이터 필터링 (Excel 필터 → SQL WHERE)
Excel에서:
- 데이터 탭 클릭
- 필터 선택
- "State" 컬럼에서 드롭다운 화살표 클릭
- "NY"만 체크하고 확인 클릭
SQL에서:
SELECT *
FROM customers
WHERE state = 'NY';
이 쿼리는 뉴욕에 있는 고객의 모든 컬럼을 반환합니다:
Customer_ID | First_Name | Last_Name | City | State | |
---|---|---|---|---|---|
2 | Sarah | Johnson | sarah.j@email.com | New York | NY |
2. 특정 컬럼 선택 (Excel 컬럼 숨기기 → SQL SELECT)
Excel에서:
- 필요 없는 컬럼을 우클릭
- "숨기기" 선택
- First_Name, Last_Name, City만 보이게 설정
SQL에서:
SELECT first_name, last_name, city
FROM customers;
모든 고객에 대해 지정된 컬럼만 반환합니다:
First_Name | Last_Name | City |
---|---|---|
John | Smith | Chicago |
Sarah | Johnson | New York |
Michael | Williams | Los Angeles |
Emma | Brown | Houston |
James | Jones | Phoenix |
3. 데이터 정렬 (Excel 정렬 → SQL ORDER BY)
Excel에서:
- 데이터 범위 선택
- 데이터 탭에서 정렬 클릭
- Last_Name 기준 오름차순 정렬
SQL에서:
SELECT *
FROM customers
ORDER BY last_name;
고객들을 성 기준으로 알파벳 순으로 정렬한 결과입니다:
Customer_ID | First_Name | Last_Name | City | State | |
---|---|---|---|---|---|
4 | Emma | Brown | emma.b@email.com | Houston | TX |
5 | James | Jones | james.jones@email.com | Phoenix | AZ |
2 | Sarah | Johnson | sarah.j@email.com | New York | NY |
1 | John | Smith | john.smith@email.com | Chicago | IL |
3 | Michael | Williams | mw@email.com | Los Angeles | CA |
4. 요약 만들기 (Excel 피벗 테이블 → SQL GROUP BY)
Excel에서:
- 데이터 범위 선택
- 삽입 > 피벗 테이블
- "State"를 행으로 드래그
- "Customer_ID"를 값으로 드래그하여 상태별 고객 수 계산
SQL에서:
SELECT state, COUNT(*) as customer_count
FROM customers
GROUP BY state
ORDER BY customer_count DESC;
각 주(state)별 고객 수를 세고 많은 순으로 정렬한 결과:
State | customer_count |
---|---|
NY | 1 |
IL | 1 |
CA | 1 |
TX | 1 |
AZ | 1 |
5. 여러 작업 조합하기
Excel에서는 특정 주에 대해 필터링하고, Last_Name으로 정렬하고, 일부 컬럼만 보이도록 설정할 수 있습니다. SQL에서는 이 모든 작업을 하나의 쿼리로 결합할 수 있습니다:
SELECT first_name, last_name, city
FROM customers
WHERE state IN ('NY', 'CA')
ORDER BY last_name;
이 쿼리는:
- first_name, last_name, city 컬럼만 선택하고
- NY 또는 CA에 있는 고객만 필터링한 후
- 성(last_name) 기준으로 정렬합니다.
결과:
First_Name | Last_Name | City |
---|---|---|
Sarah | Johnson | New York |
Michael | Williams | Los Angeles |
실습: Excel 작업을 SQL 쿼리로 바꾸기
이번에는 조금 더 복잡한 예제를 통해 연습해봅시다. 두 개의 Excel 워크시트가 있다고 가정합니다: orders
와 products
Orders 워크시트:
Order_ID | Customer_ID | Order_Date | Total_Amount |
---|---|---|---|
101 | 1 | 2025-01-15 | 120.50 |
102 | 3 | 2025-01-20 | 45.99 |
103 | 2 | 2025-01-25 | 75.25 |
104 | 1 | 2025-02-01 | 200.00 |
105 | 5 | 2025-02-05 | 65.75 |
Products 워크시트:
Product_ID | Product_Name | Category | Price |
---|---|---|---|
P1 | Laptop | Electronics | 899.99 |
P2 | Mouse | Electronics | 24.99 |
P3 | Coffee Maker | Kitchen | 79.99 |
P4 | Blender | Kitchen | 49.99 |
P5 | Headphones | Electronics | 149.99 |
Order_Items 워크시트 (orders와 products 연결):
Order_ID | Product_ID | Quantity |
---|---|---|
101 | P2 | 1 |
101 | P5 | 1 |
102 | P4 | 1 |
103 | P3 | 1 |
104 | P1 | 1 |
105 | P2 | 1 |
105 | P4 | 1 |
이제 Excel 작업과 그에 상응하는 SQL을 살펴봅시다:
작업 1: John Smith가 주문한 모든 주문 찾기
Excel에서:
- VLOOKUP을 사용하여 customers 시트에서 John Smith의 Customer_ID 찾기
- Orders 시트에서 해당 Customer_ID로 필터링
SQL에서:
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.first_name = 'John' AND c.last_name = 'Smith';
결과:
Order_ID | Customer_ID | Order_Date | Total_Amount |
---|---|---|---|
101 | 1 | 2025-01-15 | 120.50 |
104 | 1 | 2025-02-01 | 200.00 |
작업 2: 제품 카테고리별 총 매출 계산
Excel에서:
- VLOOKUP을 사용하여 Order_Items에 Category 컬럼 추가
- 피벗 테이블로 Category 행, (Price × Quantity)의 합계 계산
SQL에서:
SELECT p.category, SUM(p.price * oi.quantity) as total_sales
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.category;
결과:
category | total_sales |
---|---|
Electronics | 1074.97 |
Kitchen | 129.98 |
작업 3: 가장 많이 주문된 인기 상품 찾기
Excel에서:
- Order_Items로 피벗 테이블 생성
- Product_ID를 행에 추가
- Order_ID 개수 계산
- Count 기준 내림차순 정렬
SQL에서:
SELECT p.product_name, COUNT(oi.order_id) as order_count
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.product_id, p.product_name
ORDER BY order_count DESC;
결과:
product_name | order_count |
---|---|
Mouse | 2 |
Blender | 2 |
Laptop | 1 |
Coffee Maker | 1 |
Headphones | 1 |
작업 4: 총 지출이 $100 이상인 고객 찾기
Excel에서:
- Orders로 피벗 테이블 생성
- Customer_ID를 행으로
- Total_Amount 합계를 값으로
- 합계 > 100으로 필터링
SQL에서:
SELECT c.first_name, c.last_name, SUM(o.total_amount) as total_spent
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.first_name, c.last_name
HAVING SUM(o.total_amount) > 100;
결과:
first_name | last_name | total_spent |
---|---|---|
John | Smith | 320.50 |
점진적으로 복잡한 쿼리 만들기
SQL의 장점 중 하나는 쿼리를 점진적으로, 간단한 것부터 시작해서 필요에 따라 복잡하게 만들 수 있다는 점입니다. 그 과정을 단계별로 살펴봅시다:
Step 1: 기본 SELECT 문으로 시작
SELECT *
FROM customers;
모든 고객 정보를 반환합니다.
Step 2: 결과 필터링
SELECT *
FROM customers
WHERE state IN ('NY', 'CA');
뉴욕(NY)과 캘리포니아(CA)에 있는 고객만 반환합니다.
Step 3: 특정 컬럼만 선택
SELECT customer_id, first_name, last_name
FROM customers
WHERE state IN ('NY', 'CA');
NY와 CA 고객의 ID 및 이름만 반환합니다.
Step 4: 다른 테이블과 JOIN
SELECT c.customer_id, c.first_name, c.last_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE c.state IN ('NY', 'CA');
NY 또는 CA에 있는 고객의 정보와 해당 고객이 주문한 주문 정보를 함께 반환합니다.
Step 5: 집계 함수 추가
SELECT c.customer_id, c.first_name, c.last_name,
COUNT(o.order_id) as order_count,
SUM(o.total_amount) as total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE c.state IN ('NY', 'CA')
GROUP BY c.customer_id, c.first_name, c.last_name;
NY와 CA에 있는 각 고객의 주문 수(order_count)와 총 지출(total_spent)을 계산합니다.
Step 6: 집계 결과 필터링
SELECT c.customer_id, c.first_name, c.last_name,
COUNT(o.order_id) as order_count,
SUM(o.total_amount) as total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE c.state IN ('NY', 'CA')
GROUP BY c.customer_id, c.first_name, c.last_name
HAVING COUNT(o.order_id) > 0;
주문을 한 건이라도 한 고객만 결과에 포함시킵니다.
Step 7: 결과 정렬
SELECT c.customer_id, c.first_name, c.last_name,
COUNT(o.order_id) as order_count,
SUM(o.total_amount) as total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE c.state IN ('NY', 'CA')
GROUP BY c.customer_id, c.first_name, c.last_name
HAVING COUNT(o.order_id) > 0
ORDER BY total_spent DESC;
총 지출이 많은 순서로 고객을 정렬합니다.
이처럼 SQL 쿼리는 점진적으로 복잡하게 쌓아갈 수 있기 때문에, 작성과 디버깅이 훨씬 수월해집니다.
Excel 사용자에게 유용한 SQL 쿼리 패턴
다음은 Excel 사용자에게 특히 익숙한 SQL 쿼리 패턴들입니다:
패턴 1: "VLOOKUP" JOIN
Excel에서는 VLOOKUP으로 다른 테이블의 데이터를 가져옵니다. SQL에서는 JOIN을 사용합니다:
SELECT o.order_id, o.order_date, c.first_name, c.last_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;
패턴 2: "피벗 테이블" Group By
Excel의 피벗 테이블은 데이터 요약에 강력한 도구입니다. SQL에서는 GROUP BY를 사용합니다:
SELECT
YEAR(order_date) as order_year,
MONTH(order_date) as order_month,
SUM(total_amount) as monthly_sales
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY order_year, order_month;
패턴 3: "필터" WHERE
Excel의 필터 기능과 같은 역할을 SQL에서는 WHERE로 수행합니다:
SELECT *
FROM products
WHERE category = 'Electronics' AND price < 100;
패턴 4: "IF" CASE
Excel의 IF 함수와 같은 조건 처리를 SQL에서는 CASE 문으로 작성합니다:
SELECT
product_name,
price,
CASE
WHEN price < 50 THEN 'Budget'
WHEN price BETWEEN 50 AND 100 THEN 'Mid-range'
ELSE 'Premium'
END as price_category
FROM products;
패턴 5: "CountIf" HAVING
Excel의 COUNTIF 기능은 SQL의 HAVING 절과 함께 GROUP BY로 구현할 수 있습니다:
SELECT category, COUNT(*) as product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 5;
첫 번째 SQL 쿼리를 위한 팁
SQL 쿼리를 작성할 때 유용한 팁은 다음과 같습니다:
- 단순하게 시작하세요: 기본 SELECT 문으로 시작하고 점진적으로 확장하세요.
- 의미 있는 별칭(alias)을 사용하세요: customers는
c
, orders는o
등 간단한 별칭으로 가독성을 높이세요. - 쿼리를 깔끔하게 정리하세요: 줄바꿈과 들여쓰기를 사용해 구조적으로 작성하세요.
- SELECT로 먼저 테스트하세요: UPDATE나 DELETE 전에 SELECT로 조건을 검증하세요.
- 주석을 사용하세요:
--
를 사용하여 복잡한 로직에 주석을 추가하세요. - 필요한 컬럼만 선택하세요:
SELECT *
대신 필요한 컬럼만 지정하세요. - JOIN 조건을 확인하세요: 테이블 간 연결이 정확한지 항상 검증하세요.
마무리
이번 장에서는 SQL 쿼리를 작성하는 법을 익히며, 익숙한 Excel 작업이 SQL에서는 어떻게 표현되는지 살펴보았습니다. 많은 Excel 기능들이 SQL에서도 직접적으로 매핑됩니다:
- Excel 필터 → SQL WHERE
- Excel 정렬 → SQL ORDER BY
- Excel 피벗 테이블 → SQL GROUP BY
- Excel VLOOKUP → SQL JOIN
- Excel 수식 → SQL 함수 및 표현식
기존의 Excel 경험을 활용하면 SQL을 더 쉽게 이해하고 사용할 수 있습니다. 데이터가 커지고 복잡해질수록 SQL의 강력함과 유연성이 빛을 발하게 될 것입니다.
다음 장에서는 SQL이 데이터 생태계에서 어떤 역할을 하는지, 그리고 대시보드나 비즈니스 인텔리전스 툴에서 어떻게 활용되는지를 살펴보겠습니다.