Chapter 9: 첫 번째 SQL 쿼리 작성하기 (엑셀 예제 포함)

시각화: Excel 테이블 → SQL 테이블

SQL 쿼리를 작성하기 전에, 여러분이 익숙한 Excel 테이블과 우리가 쿼리할 SQL 테이블 간의 시각적 연관을 명확히 해봅시다.

다음과 같은 고객 정보가 담긴 Excel 워크시트를 가지고 있다고 상상해 보세요:

Customer_IDFirst_NameLast_NameEmailCityState
1JohnSmithjohn.smith@email.comChicagoIL
2SarahJohnsonsarah.j@email.comNew YorkNY
3MichaelWilliamsmw@email.comLos AngelesCA
4EmmaBrownemma.b@email.comHoustonTX
5JamesJonesjames.jones@email.comPhoenixAZ

SQL 데이터베이스에서는 이 테이블이 customers라는 이름의 테이블로 동일한 구조로 존재하게 됩니다. 컬럼명은 Excel 헤더와 같고, 각 행은 데이터베이스의 하나의 레코드입니다.

우리가 SQL 쿼리를 작성하는 것은, 마치 Excel에서 필터링, 정렬, 분석을 하듯이 이 테이블에 대해 "질문"을 던지는 것입니다.

단계별: 필터, 피벗, 요약의 SQL 버전은?

Excel에서 자주 사용하는 작업들을 SQL에서는 어떻게 표현하는지 알아봅시다.

1. 데이터 필터링 (Excel 필터 → SQL WHERE)

Excel에서:

  1. 데이터 탭 클릭
  2. 필터 선택
  3. "State" 컬럼에서 드롭다운 화살표 클릭
  4. "NY"만 체크하고 확인 클릭

SQL에서:

SELECT *
FROM customers
WHERE state = 'NY';

이 쿼리는 뉴욕에 있는 고객의 모든 컬럼을 반환합니다:

Customer_IDFirst_NameLast_NameEmailCityState
2SarahJohnsonsarah.j@email.comNew YorkNY

2. 특정 컬럼 선택 (Excel 컬럼 숨기기 → SQL SELECT)

Excel에서:

  1. 필요 없는 컬럼을 우클릭
  2. "숨기기" 선택
  3. First_Name, Last_Name, City만 보이게 설정

SQL에서:

SELECT first_name, last_name, city
FROM customers;

모든 고객에 대해 지정된 컬럼만 반환합니다:

First_NameLast_NameCity
JohnSmithChicago
SarahJohnsonNew York
MichaelWilliamsLos Angeles
EmmaBrownHouston
JamesJonesPhoenix

3. 데이터 정렬 (Excel 정렬 → SQL ORDER BY)

Excel에서:

  1. 데이터 범위 선택
  2. 데이터 탭에서 정렬 클릭
  3. Last_Name 기준 오름차순 정렬

SQL에서:

SELECT *
FROM customers
ORDER BY last_name;

고객들을 성 기준으로 알파벳 순으로 정렬한 결과입니다:

Customer_IDFirst_NameLast_NameEmailCityState
4EmmaBrownemma.b@email.comHoustonTX
5JamesJonesjames.jones@email.comPhoenixAZ
2SarahJohnsonsarah.j@email.comNew YorkNY
1JohnSmithjohn.smith@email.comChicagoIL
3MichaelWilliamsmw@email.comLos AngelesCA

4. 요약 만들기 (Excel 피벗 테이블 → SQL GROUP BY)

Excel에서:

  1. 데이터 범위 선택
  2. 삽입 > 피벗 테이블
  3. "State"를 행으로 드래그
  4. "Customer_ID"를 값으로 드래그하여 상태별 고객 수 계산

SQL에서:

SELECT state, COUNT(*) as customer_count
FROM customers
GROUP BY state
ORDER BY customer_count DESC;

각 주(state)별 고객 수를 세고 많은 순으로 정렬한 결과:

Statecustomer_count
NY1
IL1
CA1
TX1
AZ1

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_NameLast_NameCity
SarahJohnsonNew York
MichaelWilliamsLos Angeles

실습: Excel 작업을 SQL 쿼리로 바꾸기

이번에는 조금 더 복잡한 예제를 통해 연습해봅시다. 두 개의 Excel 워크시트가 있다고 가정합니다: ordersproducts

Orders 워크시트:

Order_IDCustomer_IDOrder_DateTotal_Amount
10112025-01-15120.50
10232025-01-2045.99
10322025-01-2575.25
10412025-02-01200.00
10552025-02-0565.75

Products 워크시트:

Product_IDProduct_NameCategoryPrice
P1LaptopElectronics899.99
P2MouseElectronics24.99
P3Coffee MakerKitchen79.99
P4BlenderKitchen49.99
P5HeadphonesElectronics149.99

Order_Items 워크시트 (orders와 products 연결):

Order_IDProduct_IDQuantity
101P21
101P51
102P41
103P31
104P11
105P21
105P41

이제 Excel 작업과 그에 상응하는 SQL을 살펴봅시다:

작업 1: John Smith가 주문한 모든 주문 찾기

Excel에서:

  1. VLOOKUP을 사용하여 customers 시트에서 John Smith의 Customer_ID 찾기
  2. 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_IDCustomer_IDOrder_DateTotal_Amount
10112025-01-15120.50
10412025-02-01200.00

작업 2: 제품 카테고리별 총 매출 계산

Excel에서:

  1. VLOOKUP을 사용하여 Order_Items에 Category 컬럼 추가
  2. 피벗 테이블로 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;

결과:

categorytotal_sales
Electronics1074.97
Kitchen129.98

작업 3: 가장 많이 주문된 인기 상품 찾기

Excel에서:

  1. Order_Items로 피벗 테이블 생성
  2. Product_ID를 행에 추가
  3. Order_ID 개수 계산
  4. 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_nameorder_count
Mouse2
Blender2
Laptop1
Coffee Maker1
Headphones1

작업 4: 총 지출이 $100 이상인 고객 찾기

Excel에서:

  1. Orders로 피벗 테이블 생성
  2. Customer_ID를 행으로
  3. Total_Amount 합계를 값으로
  4. 합계 > 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_namelast_nametotal_spent
JohnSmith320.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 쿼리를 작성할 때 유용한 팁은 다음과 같습니다:

  1. 단순하게 시작하세요: 기본 SELECT 문으로 시작하고 점진적으로 확장하세요.
  2. 의미 있는 별칭(alias)을 사용하세요: customers는 c, orders는 o 등 간단한 별칭으로 가독성을 높이세요.
  3. 쿼리를 깔끔하게 정리하세요: 줄바꿈과 들여쓰기를 사용해 구조적으로 작성하세요.
  4. SELECT로 먼저 테스트하세요: UPDATE나 DELETE 전에 SELECT로 조건을 검증하세요.
  5. 주석을 사용하세요: --를 사용하여 복잡한 로직에 주석을 추가하세요.
  6. 필요한 컬럼만 선택하세요: SELECT * 대신 필요한 컬럼만 지정하세요.
  7. 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이 데이터 생태계에서 어떤 역할을 하는지, 그리고 대시보드나 비즈니스 인텔리전스 툴에서 어떻게 활용되는지를 살펴보겠습니다.