示例商城数据库
课程中的所有例子都在同一个商城数据库中运行,其中包含客户、商品目录、订单和员工数据。约五万行数据足以展示分组和索引在实际数据上的行为。
编写查询时,可在这一页查看表名和列名。
以下内容直接从数据库文件读取,与应用中打开的示例保持一致。
等宽字体写的列名就是你要敲进去的名字。说明一栏标出数据库对这个列知道些什么:
- 主键 — 用来标识这一行。不会重复,也不会为空。
- 必填 — 这个列不能留空(NOT NULL)。没有这个标记的列可以是 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 |