SQL · Postgres

Учебная база: интернет-магазин

Одна схема на весь курс. Держи эту страницу открытой рядом — все упражнения работают с этими таблицами.

Как читать

Шесть таблиц данных + одна пустая-по-товарам категория. Стрелка → означает внешний ключ (foreign key): значение столбца ссылается на строку другой таблицы. В данные намеренно вшиты «ловушки» (NULL-ы, заказы без оплат, категория без товаров) — на них строятся глубокие темы.

Связи (кто на кого ссылается)

customers ──< orders ──< order_items >── products >── categories
                 │
                 └──< payments

«──<» читается как «один ко многим»:
  один customer  → много orders
  один order     → много order_items и (0..1) payments
  один product   → много order_items
  одна category  → много products

customers — покупатели

СтолбецТипЗаметки
customer_idintPK
nametextNOT NULL
emailtextUNIQUE · у Jack Wilson (id 10) — NULL
countrytextNULL у Dmitry (4) и Grace (7)
created_atdateдата регистрации

10 строк. Jack Wilson (id 10) не имеет ни одного заказа — удобен для анти-join.

categories — категории товаров

СтолбецТипЗаметки
category_idintPK
nametextNOT NULL

7 строк: Electronics, Books, Clothing, Home, Toys, Sports, Garden. У Garden нет товаров — удобна для LEFT JOIN.

products — товары

СтолбецТипЗаметки
product_idintPK
nametextNOT NULL
category_idint→ categories.category_id
pricenumeric(10,2)цена за единицу
stockint0 у Headphones (4) и Jeans (10) — нет на складе

18 строк.

orders — заказы

СтолбецТипЗаметки
order_idintPK
customer_idint→ customers.customer_id
statustextодно из: paid, shipped, pending, cancelled
created_atdateдата заказа

14 строк (id 100–113). Только paid и shipped заказы имеют строку в payments. pending/cancelled — без оплаты.

order_items — позиции заказа

СтолбецТипЗаметки
order_item_idintPK
order_idint→ orders.order_id
product_idint→ products.product_id
quantityintкол-во
unit_pricenumeric(10,2)цена на момент заказа (обычно = price)

24 строки. Сумма позиции = quantity * unit_price.

payments — оплаты

СтолбецТипЗаметки
payment_idintPK
order_idint→ orders.order_id
amountnumeric(10,2)= сумма позиций заказа
methodtextcard, paypal, wire
paid_atdateдата оплаты

10 строк — по одной на каждый paid/shipped заказ.

Подсмотреть данные

Любую таблицу можно посмотреть в любом уроке: напиши в редакторе SELECT * FROM orders; и нажми «Выполнить». Полную DDL и вставки см. в assets/seed.js.