샘플 쇼핑몰 데이터베이스
모든 예제는 고객, 상품 카탈로그, 주문, 직원을 담은 이 쇼핑몰 데이터베이스에서 실행합니다. 약 5만 행이 있어 그룹화와 인덱스의 동작도 실제와 비슷한 조건에서 볼 수 있습니다.
쿼리를 작성하다 테이블이나 컬럼 이름이 필요하면 이 페이지를 참고하세요. 예제와 다른 쿼리를 직접 작성할 때도 도움이 됩니다.
아래 정보는 샘플 파일에서 읽어 왔으며 앱에 표시되는 구조와 같습니다.
고정폭으로 표시한 컬럼 이름이 SQL에 직접 입력하는 이름입니다. 비고 칸에는 데이터베이스가 각 컬럼에 대해 정의한 정보가 표시됩니다.
- 기본 키 — 그 행을 식별합니다. 중복되지 않고 비어 있을 수 없습니다.
- 필수 — 비워 둘 수 없는 컬럼입니다(NOT NULL). 이 표시가 없는 컬럼은 NULL을 가질 수 있고, 그게 필터 레슨에서 다루는 내용입니다.
- → 테이블.컬럼 — 외래 키입니다. 이 컬럼은 저 테이블의 값을 담고 있고, 조인은 이걸 따라갑니다.
- 고유 — 두 행이 같은 값을 가질 수 없습니다. UPSERT가 충돌을 판단하는 기준이 이것입니다.
- 인덱스 — 데이터베이스가 이 컬럼의 정렬된 사본을 따로 갖고 있어서, 이 컬럼으로 거르거나 정렬하는 것이 빠릅니다. 마지막 레슨에서 설명합니다.
상품
categories 33행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
name | TEXT | 필수, 고유 |
description | TEXT | |
parent_id | INTEGER | → categories.id, 인덱스 |
sort_order | INTEGER | 필수, 기본값 0 |
is_active | INTEGER | 필수, 기본값 1 |
products 400행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
category_id | INTEGER | → categories.id, 필수, 인덱스 |
name | TEXT | 필수 |
description | TEXT | |
sku | TEXT | 필수, 고유 |
price | REAL | 필수, 인덱스, 기본값 0 |
cost | REAL | 필수, 기본값 0 |
stock_quantity | INTEGER | 필수, 기본값 0 |
weight_kg | REAL | |
attributes | TEXT | |
is_active | INTEGER | 필수, 기본값 1 |
created_at | TEXT | 필수 |
updated_at | TEXT | 필수 |
product_images 1,024행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
product_id | INTEGER | → products.id, 필수, 인덱스 |
url | TEXT | 필수 |
alt_text | TEXT | |
sort_order | INTEGER | 필수, 기본값 0 |
is_primary | INTEGER | 필수, 기본값 0 |
tags 15행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
name | TEXT | 필수, 고유 |
product_tags 624행
| 컬럼 | 타입 | 비고 |
|---|---|---|
product_id | INTEGER | 기본 키, → products.id |
tag_id | INTEGER | 기본 키, → tags.id |
suppliers 12행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
name | TEXT | 필수 |
contact_name | TEXT | |
email | TEXT | |
phone | TEXT | |
country | TEXT | |
rating | REAL | |
is_active | INTEGER | 필수, 기본값 1 |
product_suppliers 579행
| 컬럼 | 타입 | 비고 |
|---|---|---|
product_id | INTEGER | 기본 키, → products.id |
supplier_id | INTEGER | 기본 키, → suppliers.id |
supplier_sku | TEXT | |
unit_cost | REAL | 필수 |
lead_time_days | INTEGER | 필수, 기본값 7 |
inventory_logs 11,547행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
product_id | INTEGER | → products.id, 필수, 인덱스 |
change_qty | INTEGER | 필수 |
reason | TEXT | 필수 |
reference | TEXT | |
employee_id | INTEGER | → employees.id |
logged_at | TEXT | 필수, 인덱스 |
고객
customers 1,500행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
first_name | TEXT | 필수, 인덱스 |
last_name | TEXT | 필수, 인덱스 |
email | TEXT | 필수, 고유 |
phone | TEXT | |
birth_date | TEXT | |
country | TEXT | 필수, 인덱스, 기본값 'US' |
marketing_opt_in | INTEGER | 필수, 기본값 0 |
loyalty_points | INTEGER | 필수, 기본값 0 |
created_at | TEXT | 필수 |
updated_at | TEXT | 필수 |
addresses 1,959행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
customer_id | INTEGER | → customers.id, 필수, 인덱스 |
label | TEXT | 필수, 기본값 'home' |
line1 | TEXT | 필수 |
line2 | TEXT | |
city | TEXT | 필수 |
postal_code | TEXT | |
country | TEXT | 필수 |
is_default | INTEGER | 필수, 기본값 0 |
wishlists 2,493행
| 컬럼 | 타입 | 비고 |
|---|---|---|
customer_id | INTEGER | 기본 키, → customers.id |
product_id | INTEGER | 기본 키, → products.id |
added_at | TEXT | 필수 |
reviews 2,992행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
product_id | INTEGER | → products.id, 필수, 고유 |
customer_id | INTEGER | → customers.id, 필수, 고유 |
rating | INTEGER | 필수 |
title | TEXT | |
body | TEXT | |
is_verified | INTEGER | 필수, 기본값 0 |
helpful_votes | INTEGER | 필수, 기본값 0 |
created_at | TEXT | 필수 |
notifications 3,000행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
customer_id | INTEGER | → customers.id, 필수, 인덱스 |
type | TEXT | 필수 |
title | TEXT | 필수 |
body | TEXT | |
is_read | INTEGER | 필수, 인덱스, 기본값 0 |
created_at | TEXT | 필수 |
주문
orders 4,000행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
order_number | TEXT | 필수, 고유 |
customer_id | INTEGER | → customers.id, 필수, 인덱스 |
address_id | INTEGER | → addresses.id |
shipping_method_id | INTEGER | → shipping_methods.id |
coupon_id | INTEGER | → coupons.id |
status | TEXT | 필수, 인덱스 |
subtotal | REAL | 필수, 기본값 0 |
discount | REAL | 필수, 기본값 0 |
shipping_cost | REAL | 필수, 기본값 0 |
total | REAL | 필수, 기본값 0 |
notes | TEXT | |
ordered_at | TEXT | 필수, 인덱스 |
updated_at | TEXT | 필수 |
order_items 12,091행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
order_id | INTEGER | → orders.id, 필수, 고유 |
product_id | INTEGER | → products.id, 필수, 고유 |
quantity | INTEGER | 필수 |
unit_price | REAL | 필수 |
payments 3,651행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
order_id | INTEGER | → orders.id, 필수, 인덱스 |
method | TEXT | 필수 |
amount | REAL | 필수 |
currency | TEXT | 필수, 기본값 'USD' |
status | TEXT | 필수 |
transaction_ref | TEXT | |
paid_at | TEXT |
shipments 2,319행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
order_id | INTEGER | → orders.id, 필수, 인덱스 |
carrier | TEXT | 필수 |
tracking_number | TEXT | |
shipped_at | TEXT | |
delivered_at | TEXT |
shipping_methods 5행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
name | TEXT | 필수, 고유 |
base_cost | REAL | 필수 |
est_days | INTEGER | 필수 |
is_active | INTEGER | 필수, 기본값 1 |
coupons 10행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
code | TEXT | 필수, 고유 |
discount_type | TEXT | 필수 |
discount_value | REAL | 필수 |
min_order | REAL | 필수, 기본값 0 |
starts_at | TEXT | 필수 |
ends_at | TEXT | 필수 |
max_uses | INTEGER | |
used_count | INTEGER | 필수, 기본값 0 |
직원
departments 10행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
name | TEXT | 필수, 고유 |
description | TEXT | |
created_at | TEXT | 필수 |
employees 120행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
department_id | INTEGER | → departments.id, 필수, 인덱스 |
manager_id | INTEGER | → employees.id, 인덱스 |
first_name | TEXT | 필수 |
last_name | TEXT | 필수 |
email | TEXT | 필수, 고유 |
phone | TEXT | |
hire_date | TEXT | 필수 |
salary | REAL | 필수, 기본값 0 |
position | TEXT | |
is_active | INTEGER | 필수, 기본값 1 |
audit_logs 2,000행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | 기본 키 |
employee_id | INTEGER | → employees.id |
action | TEXT | 필수 |
table_name | TEXT | 필수, 인덱스 |
record_id | INTEGER | 인덱스 |
old_values | TEXT | |
new_values | TEXT | |
ip_address | TEXT | |
created_at | TEXT | 필수 |
설정
settings 8행
| 컬럼 | 타입 | 비고 |
|---|---|---|
key | TEXT | 기본 키 |
value | TEXT | 필수 |
description | TEXT | |
updated_at | TEXT | 필수 |
뷰
뷰는 저장된 쿼리를 테이블처럼 사용할 수 있게 한 객체입니다. SELECT로 조회할 수 있지만 행을 따로 저장하지는 않습니다. 아래 네 뷰는 위 테이블의 데이터를 요약합니다.
v_customer_lifetime 1,500행
| 컬럼 | 타입 | 비고 |
|---|---|---|
customer_id | INTEGER | |
customer | TEXT | |
country | TEXT | |
orders | TEXT | |
revenue | TEXT | |
first_order | TEXT | |
last_order | TEXT |
v_low_stock 44행
| 컬럼 | 타입 | 비고 |
|---|---|---|
id | INTEGER | |
sku | TEXT | |
name | TEXT | |
stock_quantity | INTEGER | |
category | TEXT |
v_order_summary 4,000행
| 컬럼 | 타입 | 비고 |
|---|---|---|
order_id | INTEGER | |
order_number | TEXT | |
status | TEXT | |
ordered_at | TEXT | |
customer | TEXT | |
country | TEXT | |
items | TEXT | |
total | REAL |
v_product_sales 400행
| 컬럼 | 타입 | 비고 |
|---|---|---|
product_id | INTEGER | |
name | TEXT | |
sku | TEXT | |
category | TEXT | |
units_sold | TEXT | |
revenue | TEXT | |
avg_rating | TEXT | |
review_count | TEXT |