Database

Database - Chapter 4-22. 2) 실습 - mysqlsample data 분석(1/2)

Chansman 2025. 3. 21. 10:28

 

MySQL Sample Database 분석 및 실습 가이드

1. 개요

  • MySQL 샘플 데이터베이스(mysqlsample)를 활용하여 SQL의 다양한 기능을 실습합니다.
  • 테이블 간 관계를 이해하고 기본 조회, 조인, 그룹 쿼리, 서브쿼리, 데이터 수정 등을 학습합니다.

2. ERD (Entity Relationship Diagram)

아래 ERD(개체 관계 다이어그램)는 mysqlsample 데이터베이스의 테이블 구조와 관계를 나타냅니다.

3. 기본 조회 및 필터링

  • 고객 목록 조회: 모든 고객의 정보를 조회합니다.
    SELECT * FROM customers;
    
  • 특정 제품 라인의 제품 조회 (Classic Cars)
    SELECT * FROM products WHERE productLine = 'Classic Cars';
    
  • 최근 10개의 주문 조회 (orderDate 기준 최신순)
    SELECT * FROM orders ORDER BY orderDate DESC LIMIT 10;
    
  • 100달러 이상 결제된 거래 조회
    SELECT * FROM payments WHERE amount >= 100;
    

4. JOIN을 활용한 테이블 결합

  • 고객과 주문 정보 조합
    SELECT o.orderNumber, c.customerName
    FROM orders o
    JOIN customers c ON o.customerNumber = c.customerNumber;
    
  • 제품과 제품 라인 정보 조회
    SELECT p.productName, pl.textDescription
    FROM products p
    JOIN productlines pl ON p.productLine = pl.productLine;
    
  • 직원과 직속 상사(매니저) 정보 조회
    SELECT e1.employeeNumber, e1.firstName, e1.lastName,
           e2.firstName AS ManagerFirstName, e2.lastName AS ManagerLastName
    FROM employees e1
    LEFT JOIN employees e2 ON e1.reportsTo = e2.employeeNumber;
    
  • 특정 사무실에서 근무하는 직원 목록 (San Francisco)
    SELECT e.employeeNumber, e.firstName, e.lastName
    FROM employees e
    JOIN offices o ON e.officeCode = o.officeCode
    WHERE o.city = 'San Francisco';
    

5. 그룹 쿼리 (GROUP BY 활용)

  • 제품 라인별 제품 수 조회
    SELECT productLine, COUNT(*) AS productCount FROM products GROUP BY productLine;
    
  • 고객별 총 주문 금액 계산
    SELECT c.customerNumber, c.customerName, SUM(od.quantityOrdered * od.priceEach) AS totalAmount
    FROM customers c
    JOIN orders o ON c.customerNumber = o.customerNumber
    JOIN orderdetails od ON o.orderNumber = od.orderNumber
    GROUP BY c.customerNumber, c.customerName;
    
  • 가장 많이 팔린 제품 조회
    SELECT p.productName, SUM(od.quantityOrdered) AS totalQuantity
    FROM orderdetails od
    JOIN products p ON od.productCode = p.productCode
    GROUP BY p.productName
    ORDER BY totalQuantity DESC
    LIMIT 1;
    
  • 매출이 가장 높은 사무실 조회
    SELECT o.city, SUM(od.quantityOrdered * od.priceEach) AS totalSales
    FROM orders ord
    JOIN orderdetails od ON ord.orderNumber = od.orderNumber
    JOIN customers c ON ord.customerNumber = c.customerNumber
    JOIN employees e ON c.salesRepEmployeeNumber = e.employeeNumber
    JOIN offices o ON e.officeCode = o.officeCode
    GROUP BY o.city
    ORDER BY totalSales DESC
    LIMIT 1;
    

6. 서브쿼리 활용

  • 500달러 이상의 총 주문 금액을 기록한 주문 조회
    SELECT orderNumber, SUM(quantityOrdered * priceEach) AS totalAmount
    FROM orderdetails
    GROUP BY orderNumber
    HAVING totalAmount > 500;
    
  • 평균 이상 결제 고객 조회
    SELECT customerNumber, SUM(amount) AS totalPayment
    FROM payments
    GROUP BY customerNumber
    HAVING totalPayment > (SELECT AVG(amount) FROM payments);
    
  • 주문이 없는 고객 조회
    SELECT customerName FROM customers WHERE customerNumber NOT IN (SELECT customerNumber FROM orders);
    
  • 최대 매출 고객 조회
    SELECT c.customerName, SUM(od.quantityOrdered * od.priceEach) AS totalSpent
    FROM customers c
    JOIN orders o ON c.customerNumber = o.customerNumber
    JOIN orderdetails od ON o.orderNumber = od.orderNumber
    GROUP BY c.customerName
    ORDER BY totalSpent DESC
    LIMIT 1;
    

7. 데이터 수정 및 관리 (INSERT, UPDATE 활용)

  • 신규 고객 추가
    INSERT INTO customers (customerName, contactLastName, contactFirstName, phone, addressLine1, city, country, salesRepEmployeeNumber, creditLimit)
    VALUES ('New Customer', 'Doe', 'John', '123-456-7890', '123 Main St', 'New York', 'USA', 1002, 50000.00);
    
  • Classic Cars 제품 라인의 모든 제품 가격 10% 인상
    UPDATE products SET buyPrice = buyPrice * 1.10 WHERE productLine = 'Classic Cars';
    
  • 특정 고객 이메일 업데이트
    UPDATE customers SET email = 'newemail@example.com' WHERE customerNumber = 103;
    
  • 특정 직원을 다른 사무실로 이동
    UPDATE employees SET officeCode = '2' WHERE employeeNumber = 1002;