02. RDBMS_MySQL (실습)
Notion 무료로 사용하기

02. RDBMS_MySQL (실습)

1) 실습 - 간단한 스키마 설계하기

(1) user 테이블 만들기
id: 자동으로 생성됩니다. (PK)
password: 4자리 랜덤
name: 한글3자리
gender: male, female 중 랜덤선택
email: 5자리영문@gmail.com
birthday: 6자리 숫자 랜덤하게
age: 2자리 숫자 랜덤
company: [samsung, lg, hyundai]
해설
CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, password VARCHAR(4), name VARCHAR(3), gender ENUM('male', 'female'), email VARCHAR(15), birthday CHAR(6), age TINYINT, company ENUM('samsung', 'lg', 'hyundai') );
ENUM: enumeration
ENUM
타입의 필드는 사전에 정의된 문자열 값 목록 중 하나의 값을 가질 수 있습니다. 이러한 특성 덕분에
ENUM
은 특정 범위의 값만을 허용해야 하는 경우에 유용
(2) board 테이블 만들기
id
title: 5글자
content: 10글자
likes: 1~100사이 숫자
img: “c”
created: 오늘 날짜
user_id (foreign_key)
해설
CREATE TABLE board ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(5), content VARCHAR(10), likes INT CHECK (likes BETWEEN 1 AND 100), img CHAR(1) DEFAULT 'c', created DATE DEFAULT CURRENT_DATE, user_id INT, FOREIGN KEY (user_id) REFERENCES user(id) );

2) 실습 - mysqlsample data 분석

mysqlsampledatabase.sql
191.2KB

기본 조회 및 필터링

고객 목록 조회: 모든 고객의 이름과 이메일을 조회하세요. TABLE: customers
SELECT * FROM customers;
특정 제품 라인의 제품 조회: 'Classic Cars' 제품 라인에 속하는 모든 제품의 이름과 가격을 조회하세요. TABLE: products, COL: productLine
SELECT * FROM products WHERE productLine = 'Classic Cars';
최근 주문: 가장 최근에 주문된 10개의 주문을 주문 날짜(orderDate)와 함께 조회하세요. TABLE: orders, COL: orderDate
SELECT * FROM orders ORDER BY orderDate DESC LIMIT 10;
최소 금액 이상의 결제: 100달러 이상 결제된 거래(amount)만 조회하세요. TABLE: payments, COL: amount
SELECT * FROM payments WHERE amount >= 100;

조인 쿼리

주문과 고객 정보 조합: 각 주문에 대한 주문 번호(orders-orderNumber)와 주문한 고객(customers-customerName)의 이름을 조회하세요.
SELECT o.orderNumber, c.customerName FROM orders o JOIN customers c ON o.customerNumber = c.customerNumber;
제품과 제품 라인 결합: 각 제품의 이름(products-productName)과 속한 제품 라인의 설명(productlines-textDescription)을 조회하세요.
SELECT p.productName, p.productLine, 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.lastName, e.firstName, e.extension, e.email, e.officeCode, e.reportsTo, e.jobTitle FROM employees e JOIN offices o ON e.officeCode = o.officeCode WHERE o.city = 'San Francisco';

그룹쿼리

제품 라인별 제품 수: 각 제품 라인에 속한 제품의 수를 조회하세요.
SELECT productLine, COUNT(*) AS productCount FROM products GROUP BY productLine;
고객별 총 주문 금액: 각 고객별로 총 주문 금액을 계산하세요.
SELECT customers.customerNumber, customers.customerName, SUM(orderdetails.quantityOrdered * orderdetails.priceEach) AS totalAmount FROM customers JOIN orders ON customers.customerNumber = orders.customerNumber JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber GROUP BY customers.customerNumber, customers.customerName;
가장 많이 팔린 제품: 가장 많이 판매된 제품의 이름과 판매 수량을 조회하세요.
SELECT productName, SUM(quantityOrdered) AS totalQuantity FROM orderdetails od JOIN products p ON od.productCode = p.productCode GROUP BY 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;

서브쿼리

특정 금액 이상의 주문: 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;

데이터 수정 및 관리

신규 고객 추가: 'customers' 테이블에 새로운 고객을 추가하는 쿼리를 작성하세요.
INSERT INTO customers (customerName, contactLastName, contactFirstName, phone, addressLine1, addressLine2, city, state, postalCode, country, salesRepEmployeeNumber, creditLimit) VALUES ('New Customer', 'Lastname', 'Firstname', '123-456-7890', '123 Street', 'Suite 1', 'City', 'State', 'PostalCode', 'Country', 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;

챌린지(Chapter14_21) 과제

1. 생성 (CREATE) - 25 문제

2. 읽기 (READ) - 25 문제

3. 갱신 (UPDATE) - 25 문제

4. 삭제 (DELETE) - 25 문제