[고객데이터분석] MySQL 실습과제 기록

2022. 5. 6. 17:17
USE sql_test;

-- Q1. customers 테이블에서 customerID, customerName, Country만 선택해서 출력
SELECT customerID, customerName, Country 
FROM customers;

-- Q2. orders 테이블에서 주문일이 1997년 이후인 데이터 선택
SELECT * 
FROM orders 
WHERE OrderDate >= '1997-01-01' 
ORDER BY OrderDate ASC;

-- Q3. customers 테이블 중 country 고유 개수 구하기
SELECT COUNT(DISTINCT country) AS cnt 
FROM customers;

-- Q4. customers 테이블 중 country별 고객 수 구하고, 고객 수 별로 내림차순 정렬
SELECT country, COUNT(*) AS cnt 
FROM customers 
GROUP BY Country 
ORDER BY COUNT(*) DESC;

-- Q5. suppliers 테이블에서 국가별 공급자 수를 구하고, 그 개수가 3 이상인 데이터만 사용
SELECT country, COUNT(*) AS cnt 
FROM suppliers 
GROUP BY country 
HAVING COUNT(*) >= 3 
ORDER BY COUNT(*) DESC;

-- Q6. products 테이블 중 평균가격 이상인 물품을 선택
SELECT *
FROM products
WHERE Price >= (SELECT AVG(Price) FROM products)
ORDER BY ProductID ASC;

-- Q7. employees 테이블에서 직원 이름, 생년월일 출력 및 나이 계산하기
SELECT LastName, FirstName, BirthDate, EXTRACT(YEAR FROM current_time)-EXTRACT(YEAR FROM BirthDate) AS age
FROM employees;

-- Q8. suppliers 테이블 중 공급자 이름에 'ltd'가 들어가는 행 구하기
SELECT *
FROM suppliers
WHERE SupplierName LIKE '%ltd%';

-- Q9. customers 테이블에서 고객 국가가 Sweden, Norway, Denmark, Finland인 데이터 선택
SELECT *
FROM customers
WHERE Country IN ('Sweden', 'Norway', 'Denmark', 'Finland');

-- Q10. orders, order_details, products, categories 테이블을 결합
SELECT o.OrderID, o.customerID, o.employeeID, o.orderdate, od.productid, od.quantity, p.productname, p.price, c.categoryname, c.description
FROM orders AS o
LEFT OUTER JOIN order_details AS od
	ON o.OrderID = od.OrderID
LEFT OUTER JOIN products AS p
	ON od.ProductID = p.ProductID
LEFT OUTER JOIN categories AS c
	ON p.CategoryID = c.CategoryID;
    
-- Q11. suppliers 테이블에서 국가, 도시 별 공급자 개수 및 합계와 소계 구하기
SELECT country, city, Count(*) AS cnt
FROM suppliers
GROUP BY Country, City WITH ROLLUP;

-- Q12. orderID별 주문 금액의 합계를 구하고, orderID별로 정렬하기
SELECT orderID, SUM(quantity*price) AS sum
FROM order_details AS od
JOIN products AS p
	ON od.ProductID = p.ProductID
GROUP BY OrderID
ORDER BY OrderID;

-- Q13. 매 월 별, 주문 금액에 대한 국가별 순(내림차순) 계산. 그 후 년도, 월, 순위 순으로 정렬하며, NULL은 제외
SELECT
	country,
	EXTRACT(year FROM OrderDate) AS y,
	EXTRACT(month FROM OrderDate) AS m,
    SUM(Quantity*Price) AS sum,
    RANK() OVER(PARTITION BY EXTRACT(year FROM OrderDate), EXTRACT(month FROM OrderDate) ORDER BY SUM(Quantity*Price) DESC) AS rnk
FROM customers AS c
LEFT OUTER JOIN orders AS o
	ON c.CustomerID = o.CustomerID
LEFT OUTER JOIN order_details AS od
	ON o.OrderID = od.OrderID
LEFT OUTER JOIN products AS p
	ON od.ProductID = p.ProductID
GROUP BY Country, y, m
HAVING Country OR y OR m IS NOT NULL
ORDER BY y, m, rnk;

위의 코드는 이전에 과제하면서 작성한 것들.

교수님께서 미천한 나의 실력을 아시는지 힌트를 많이 주셔서 수월하게 작성할 수 있었다.

혼자 알아서 하라고 했으면 눈물콧물 질질 흘렸겠지

조인, 윈도우 함수, 케이스 등 구체적인 기능 독학하자

조건만 명확하게 구분하면 문장 작성하는 건 어렵지 않다.

역시 중요한 건 '무엇을' 끌어올지 정하는 판단능력과 지식인 것 같다.

 

코드를 배우면서 느끼는 건 영어 등 다른 언어도 마찬가지지만

읽기는 어느정도 되고 심지어 좀 쉬운데

그 쉬운 걸 혼자 생각해내서 작성하는 건 프리토킹과 같이 쉽게 되지 않는다는 것이다.

예제를 통째로 기억했다가 써먹는 방법으로 익숙해지는 수밖에 없는 것 같다.

완전 영어 공부랑 똑같다.

 

능숙해지는 그날까지 화이팅!

BELATED ARTICLES

more