Ord(주문) 데이터를 이해해 보도록 하자.
1단계-ERD와 실제 데이터 살펴보기
Ord 테이블을 조회해 데이터를 하나씩 살펴보자.
-- [SQL-4-5-1] 주문 데이터 살펴보기
SELECT T1.*
FROM startdb.Ord T1
ORDER BY T1.OrdNo
LIMIT 5;
SQL
복사
ERD와 실제 데이터를 비교하며 저장된 값들을 살펴보고 다음과 같이 정리해볼 수 있다.
•
OrdNo: 주문을 구별하는 대표 식별자(PK). 주문 순서대로 번호가 부여 되는 것 같음.
•
OrdDtm: 주문이 입력된 일시 , 데이터를 살펴보니 시분초까지 관리되고 있음.
•
PickupDtm: 픽업이 완료된 일시, 데이터를 살펴보니 시분초까지 관리되고 있음.
•
MemberId: 주문한 회원의 ID 같음.
•
ShopId: 주문을 받은 매장의 ID 같음.
•
OrdSt: 주문상태, 기준코드 테이블 확인 필요.
•
OrdAmt: 주문한 금액
•
PayTp: 주문의 지불방법 같음. 기준코드 테이블 확인 필요
2단계-자료형 살펴보기
DESC 명령어를 통해 테이블의 자료형을 살펴보자. OrdDtm(주문일시), PrepareCmpDtm(제조완료일시), PickupDtm(픽업일시), 이 세 개의 컬럼은 시분초까지 저장되는 DATETIME 자료형인 것을 알 수 있다. PK 컬럼인 OrdNo는 BIGINT UNSIGNED(부호를 허용하지 않는, 양수만 저장)로 구성되어 있다.
-- [SQL-4-5-2]
DESC startb.Ord;
Field Type Null Key Default Extra
------------- --------------- ---- --- ------- -----
OrdNo bigint unsigned NO PRI NULL
OrdDtm datetime YES MUL NULL
PrepareCmpDtm datetime YES NULL
PickupDtm datetime YES NULL
MemberId varchar(40) YES MUL NULL
ShopId varchar(40) YES MUL NULL
OrdSt varchar(40) YES NULL
OrdAmt decimal(18,3) YES NULL
PayTp varchar(40) YES NULL
SQL
복사
3단계-코드성 데이터 추적하기
Ord 테이블의 OrdSt(주문상태)와 PayTp(지불유형)은 코드성 데이터로 보여진다. BaseCd(기준코드) 테이블을 조회해 코드 별로 의미하는 코드 값을 살펴보자.
-- [SQL-4-5-3]
SELECT T1.*
FROM startdb.BaseCd T1
WHERE T1.BaseCdDv IN ('OrdSt','PayTp')
ORDER BY T1.BaseCdDv, T1.SortOrder;
SQL
복사
4단계-ERD에서 관계 테이블 살펴보기
ERD를 살펴보면 Ord(주문) 테이블을 중심으로 많은 테이블이 관계가 있는 것을 알 수 있다. 주문에는 매장 정보와 회원 정보가 관리되고 있으며, 어떤 상품이 주문되었는지가 주문상세(OrdDet) 테이블에서 관리되는 것을 알 수 있다.
시스템에서 주문과 같이 트랜잭션이 많이 발생하는 테이블은 일반적으로 다른 테이블을 많이 참조하게 된다. 하지만 ERD 상에 실제 관계를 표현하지 않는 경우가 많다.
다음과 같이 Ord 테이블을 먼저 조회해보고, 관련된 테이블들을 하나씩 조회해보자.
-- [SQL-4-5-4] OrdNo가 1인 Ord 데이터 확인
SELECT T1.*
FROM startdb.Ord T1
WHERE T1.OrdNo = 1;
OrdNo OrdDtm PrepareCmpDtm PickupDtm MemberId ShopId OrdSt OrdAmt PayTp
----- ------------------- ------------------- ------------------- -------- ------ ----- -------- -----
1 2019-05-04 14:00:00 2019-05-04 14:17:00 2019-05-04 14:18:00 M0318 S047 PKUP 8000.000 CARD
-- [SQL-4-5-5] 앞에서 조회한 주문 데이터의 ShopId 정보 확인
SELECT T1.*
FROM startdb.Shop T1
WHERE T1.ShopId = 'S047';
ShopId ShopNm ShopSize ShopOperTp TableQty ChairQty OpenTime CloseTime ShopSt ShopStartYmd ShopEndYmd
------ --------------- -------- ---------- -------- -------- -------- --------- ------ ------------ ----------
S047 San Antonio-3rd 119 DRCT 18 47 0700 2200 OPEN 20180405 NULL
-- [SQL-4-5-6] 앞에서 조회한 주문 데이터의 MemberId 정보 확인
SELECT T1.*
FROM startdb.Member T1
WHERE T1.MemberId = 'M0318';
MemberId NickNm MobileNo Email JoinDtm MemberGd MemberSt LeaveDtm
-------- ------ --------- --------------- ------------------- -------- -------- --------
M0318 Green6 0318-0318 Green6@mail.com 2019-04-09 00:00:00 PLAT ACTV NULL
-- [SQL-4-5-7] 앞에서 조회한 주문 데이터의 OrdDet 정보 확인
SELECT T1.*
FROM startdb.OrdDet T1
WHERE T1.OrdNo = 1;
OrdNo OrdDetNo ItemId OrdQty SalePrc
----- -------- ------ ------ --------
1 1 AMR 1 4000.000
1 2 IAMB 1 4000.000
SQL
복사
사용자의 언어
사용자(현업)는 아래와 같이 데이터를 요청할 것이다.
•
현재 준비중인 주문을 주문일시 순으로 오름차순 정렬해서 보여주세요.
위 요청을 우리는 데이터와 테이블 관점으로 다음과 같이 해석할 수 있어야 한다.
•
현재 준비중인 주문은 OrdSt가 PREP(준비중)인 데이터를 뜻하는구나.
•
주문일시는 OrdDtm이니까 이 컬럼으로 오름차순 정렬해서 보여주면 되겠구나.
위와 같은 해석을 통해 아래와 같이 SQL을 작성할 수 있다.
-- [SQL-4-5-8]
SELECT T1.OrdNo ,T1.OrdDtm ,T1.ShopId ,T1.MemberId
FROM startdb.Ord T1
WHERE T1.OrdSt = 'PREP'
ORDER BY T1.OrdDtm ASC;
OrdNo OrdDtm ShopId MemberId
------ ------------------- ------ --------
91918 2023-03-31 20:00:00 S138 M3958
91919 2023-03-31 20:00:00 S165 M3988
91920 2023-03-31 20:00:00 S099 M4909
91921 2023-03-31 20:00:00 S106 M4918
91922 2023-03-31 20:00:00 S126 M4939
... 생략 ...
SQL
복사