
오늘 느낀점
이론과 실무는 정말 다른 것 같다..! 공부했다고 자만하지 말기그리고 눈이 넘 아프다..
테이블을 분석해서 어떻게 분리할지 봐야됨
IF() 나 CASE를 통해 조건에 따라 출력 가능
JOIN ON → SQLD 공부할 때 이론만 열심히 외웠는데 실제로 데이터에 적용해보니 어떻게 쿼리문을 짜야될지 감이 안잡힌다.
외래키를 심어주는 방법
alter table
테이블
add constraint
외래키_이름 foreign key
references
테이블(칼럼)
→ 외래키와 참조하는 기본키는 자료형이 무조건 일치 해야됨
→ 참조하는 칼럼은 반드시 unique 값이 보장돼야함
서브쿼리
select
(
select
st.sort
from
sort_table st
WHERE
st.sort = '전자제품'
) as '품류',
c.nation as '국가',
(
(
select
dc.freight_charge
from
distance_charge dc
left join
culture c
on
c.culture_code = dc.culture_code
where
c.nation = '칠레'
AND
c.culture_code = dc.culture_code
)
+
(
select
sct.special_rate
from
special_charge_table sct
left join
sort_table s
on
sct.is_rush = s.is_rush
where
s.sort = '전자제품'
)
) as '운임'
from
culture c
WHERE
c.nation = '칠레'
;
→ 조인으로 다시 쿼리문 짜보기(도전)

실행하면 결과도 잘 나오는거 확인.

→ 요구사항 분석을 잘 해야됨
ChatGPT가 짜준 요구사항 예제
📌 요구사항 1
한 카페에서 고객들의 주문을 관리하려고 합니다.
이제까지 받은 주문을 저장할 테이블을 설계하고, 데이터를 효율적으로 관리할 수 있도록 해야 합니다.
🎯 요구사항 상세
고객은 고유 ID, 이름, 전화번호 정보를 가집니다.
주문은 주문 ID, 고객 ID, 메뉴명, 가격, 주문 날짜 정보를 가집니다.
한 명의 고객은 여러 개의 주문을 할 수 있습니다.
모든 주문에는 반드시 주문한 고객이 존재해야 합니다.
고객이 탈퇴하면 주문 정보는 남아 있어야 합니다.
최근 주문한 고객을 쉽게 찾을 수 있도록 테이블을 설계하세요.
이제 이 요구사항을 바탕으로 DB 스키마(SQL 테이블 생성문)를 작성해보세요!
다 짜고 보내주시면 제가 피드백을 드리겠습니다. 🚀
CREATE DATABASE `gpt`;
USE `gpt`;
CREATE TABLE `customer`(
`id` INT(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(5) NOT NULL,
`phone_num` VARCHAR(20) NOT NULL
);
SELECT * FROM customer;
CREATE TABLE `order`(
`id` INT(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`customer_id` INT(5) UNSIGNED NOT NULL,
FOREIGN KEY(`customer_id`) REFERENCES customer(`id`),
`menu` VARCHAR(10) NOT NULL,
`price` INT(10) UNSIGNED NOT NULL,
`order_date` DATETIME NOT NULL
);
-- order은 MySQL 예약어이기 때문에 그냥 실행시키면 문법오류가 발생! 백틱으로 감싸서 실행하는게 좋음
SELECT * FROM `order`;
phone_num의 자료형
• VARCHAR(20)을 사용했는데 전화번호는 문자열로 저장하는 것이 맞음.
• 다만, 전화번호에는 ”-“나 공백 같은 형식이 다양하게 들어갈 수 있음.
• 예를 들어 "010-1234-5678" 또는 "010 1234 5678"과 같은 경우가 있음.
• 따라서, 전화번호는 입력할 때 형식을 통일하는 것이 중요함 → 애플리케이션에서 미리 처리하는 게 좋음.
✅ 추천
phone_num VARCHAR(20) NOT NULL CHECK (phone_num REGEXP '^[0-9-]+$')
✅ 좋은 점
• 기본적인 관계형 데이터베이스 구조는 잘 설계됨.
• customer_id를 orders 테이블에서 참조하는 방식도 적절함.
• AUTO_INCREMENT, NOT NULL 등의 제약 조건을 잘 사용함.
📌 요구사항 2 (온라인 강의 플랫폼)
한 스타트업이 온라인 강의 플랫폼을 개발하려고 합니다. 이 플랫폼에서는 강사와 수강생이 회원가입을 하고, 강사는 강의를 개설할 수 있으며, 수강생은 강의를 신청할 수 있습니다.
1. 회원 (Users)
• 회원은 강사(Instructor) 또는 수강생(Student)일 수 있습니다.
• 이메일과 비밀번호로 로그인하며, 이름과 프로필 사진을 가질 수 있습니다.
• 강사는 자신이 개설한 강의를 관리할 수 있습니다.
• 수강생은 자신이 신청한 강의를 볼 수 있습니다.
2. 강의 (Courses)
• 강의는 강사가 개설합니다.
• 강의에는 제목, 설명, 가격, 개설 날짜, 업데이트 날짜가 포함됩니다.
• 하나의 강의에는 여러 개의 강의 영상이 포함될 수 있습니다.
3. 강의 영상 (Lessons)
• 각 강의는 여러 개의 강의 영상으로 구성됩니다.
• 강의 영상에는 제목, 길이(재생시간), 업로드 날짜가 포함됩니다.
• 수강생은 강의 영상을 시청할 수 있습니다.
4. 수강 신청 (Enrollments)
• 수강생은 강의를 신청해야 수강할 수 있습니다.
• 수강 신청 시 결제가 이루어지며, 결제 완료 후 강의를 볼 수 있습니다.
• 수강 신청에는 신청 날짜와 결제 상태가 포함됩니다.
5. 수강 기록 (Progress)
• 수강생이 본 강의 영상에 대한 진도를 기록해야 합니다.
• 수강생이 특정 강의 영상을 끝까지 보면 해당 영상의 수강 완료 여부가 기록됩니다.
• 강의 전체 진도가 몇 %인지 계산할 수 있어야 합니다.
🎯 미션
• 각 요구사항을 반영하여 테이블을 설계하세요.
• 외래키 관계를 고려해서 테이블 간의 관계를 설정하세요.
• 정규화를 고려하여 데이터 중복을 최소화하세요.
• 필요한 제약조건(NOT NULL, UNIQUE, PRIMARY KEY 등)을 설정하세요.
💡 예시 출력 (답안은 제가 따로 가지고 있을게요!)
• CREATE TABLE 문을 작성해도 되고,
• ERD를 간단히 그려서 설명해도 됩니다.
• 다 작성한 후 알려주시면 제가 피드백 드릴게요! 🚀🔥
추후 작성
프로젝트 readme를 작성할 때 어느 부분이 어려웠고 어떻게 해결해는지가 들어가는게 중요
💡프로그램을 종료할 때 단순히 break가 아니라 상태를 boolean으로 두고 while문 조건으로 두는 방법이 있음
this.updatedAt = LocalDate.*now*(); → 작성 당시 현재 시간을 넣어줄 수 있음