이번에는 Shop(매장) 데이터를 이해해 보도록 하자.
1단계-ERD와 실제 데이터 살펴보기
Shop 테이블을 조회해 데이터를 살펴보자.
-- [SQL-4-4-1] Shop 데이터 살펴보기
SELECT T1.*
FROM startdb.Shop T1
ORDER BY T1.ShopId
LIMIT 5;
ShopId ShopNm ShopSize ShopOperTp TableQty ChairQty OpenTime CloseTime ShopSt ShopStartYmd ShopEndYmd
------ --------------- -------- ---------- -------- -------- -------- --------- ------ ------------ ----------
S001 New York-1st 26 FLAG 3 8 0700 2200 OPEN 20180403 NULL
S002 Los Angeles-1st 27 DIST 4 11 0700 2200 OPEN 20180407 NULL
S003 Chicago-1st 28 FLAG 5 14 0700 2200 OPEN 20180402 NULL
S004 Houston-1st 29 FLAG 6 17 0700 2200 OPEN 20180408 NULL
S005 Phoenix-1st 30 FLAG 8 22 0700 2200 OPEN 20180405 NULL
SQL
복사
Tip. LIMIT
•
일부 데이터를 샘플로 확인하고 싶을 때 SQL 가장 끝에 LIMIT와 조회할 건수를 입력
•
일반적으로 LIMIT 앞에는 ORDER BY를 사용하지만, ORDER BY를 생략 할 수 있다.
ERD와 실제 데이터를 비교하며 구성된 값들을 살펴보면 다음과 같이 정리할 수 있다.
•
ShopId: 매장(Shop)을 구별하는 대표식별자(PK)
•
ShopNm: 매장의 명칭
•
ShopOperTp : 매장운영유형, FLAG, DIST 등이 있네, 코드성 데이터로 보여짐
•
TableQty: 테이블수
•
ChairQty: 의자수
•
OpenTime: 매장오픈시간, 매장을 여는 시간
•
CloseTime: 매장클로즈시간, 매장을 닫는 시간
•
ShopSt: 매장상태, 주로 OPEN이란 값이 많은데 코드성 데이터 같음
•
ShopStartYmd: 매장시작일자, 매장을 최초 개장한 일자 같음
•
ShopEndYmd: 매장종료일자, 매장을 완전히 폐점한 일자 같음
2단계-자료형 살펴보기
DESC 명령어를 통해 테이블의 자료형을 살펴보자. ShopSize와 TableQty, ChairQty는 정수(INT)형 숫자 자료형이다. ShopStartYmd와 ShopEndYmd의 경우 날짜 값을 저장하지만, 문자 형태로 되어 있는 것을 알 수 있다. 그러므로 ShopStartYmd, ShopEndYmd에 조건 값을 줄 때는 문자 형태로 처리해야 한다는 것을 기억할 필요가 있다.
-- [SQL-4-4-2] Shop 테이블 구조 확인하기
DESC startb.Shop;
Field Type Null Key Default Extra
------------ ------------ ---- --- ------- -----
ShopId varchar(40) NO PRI NULL
ShopNm varchar(100) YES NULL
ShopSize int YES NULL
ShopOperTp varchar(40) YES NULL
TableQty int YES NULL
ChairQty int YES NULL
OpenTime varchar(100) YES NULL
CloseTime varchar(100) YES NULL
ShopSt varchar(40) YES NULL
ShopStartYmd varchar(8) YES NULL
ShopEndYmd varchar(8) YES NULL
SQL
복사
3단계-코드성 데이터 추적하기
1단계에서 Shop 데이터를 살펴보니, ShopOperTp(매장운영유형)와 ShopSt(매장상태)는 코드성 데이터로 보였다. BaseCd(기준코드) 테이블을 조회해 코드 별로 의미하는 코드 값을 조회해보자.
-- [SQL-4-4-3]
SELECT T1.*
FROM startdb.BaseCd T1
WHERE T1.BaseCdDv IN ('ShopOperTp','ShopSt');
SQL
복사
4단계-ERD에서 관계 테이블 살펴보기
ERD를 살펴보면 Shop(매장)과 Ord(주문) 간에 관계가 있는 것을 알 수 있다.
Shop 테이블의 PK인 ShopId(매장ID)가 Ord(주문) 테이블에도 있는 것을 알 수 있다. 아래와 같이 ShopId를 조건으로 Ord를 조회할 수 있다. 이를 통해 주문에는 어떤 매장이 주문했는지가 관리되고 있으며 매장별로 주문이 여러건 발생할 수 있다는 사실을 알 수 있다.
-- [SQL-4-4-4]
SELECT T1.*
FROM startdb.Ord T1
WHERE T1.ShopId = 'S001'
LIMIT 5;
OrdNo OrdDtm PrepareCmpDtm PickupDtm MemberId ShopId OrdSt OrdAmt PayTp
----- ------------------- ------------------- ------------------- -------- ------ ----- -------- -----
52 2019-10-02 10:00:00 2019-10-02 10:03:00 2019-10-02 10:04:00 M0250 S001 PKUP 4000.000 CARD
53 2019-10-02 10:00:00 2019-10-02 10:03:00 2019-10-02 10:04:00 M0260 S001 PKUP 4500.000 CARD
54 2019-10-02 10:00:00 2019-10-02 10:03:00 2019-10-02 10:04:00 M0270 S001 PKUP 4500.000 CARD
57 2019-10-02 11:00:00 2019-10-02 11:05:00 2019-10-02 11:06:00 M0252 S001 PKUP 4000.000 CARD
58 2019-10-02 11:00:00 2019-10-02 11:05:00 2019-10-02 11:06:00 M0262 S001 PKUP 2500.000 CARD
SQL
복사
사용자의 언어
사용자(현업)는 아래와 같이 데이터를 요청할 것이다.
•
현재 Open한 매장이면서 플래그쉽 매장을 매장면적 순으로 내림차순 정렬해서 보여주세요.
위 요청을 우리는 데이터와 테이블 관점으로 다음과 같이 해석할 수 있어야 한다.
•
Open한 매장이라는건, ShopSt(매장상태)가 OPEN인 값을 가진 데이터를 뜻하는구나.
•
플래그쉽 매장은, ShopOperTp에 FLAG란 값으로 저장된거 같아. BaseCd를 조회해서 확인해봐야겠네.
•
매장면적은 ShopSize란 컬럼이야.
위와 같은 해석을 통해 아래와 같이 SQL을 작성할 수 있다.
-- [SQL-4-4-5] 현업의 요구에 대한 SQL 작성
SELECT T1.*
FROM startdb.Shop T1
WHERE T1.ShopSt = 'OPEN'
AND T1.ShopOperTp = 'FLAG'
ORDER BY T1.ShopSize DESC;
SQL
복사