SQLab
УчёбаПрактикаЗадачиАренаРейтинг
© 2026 SQLab · Ташкент
SQLab

Учите SQL прямо в браузере — ничего не нужно устанавливать.

Платформа

  • Учёба
  • Практика
  • Задачи
  • Арена
  • Рейтинг

Для кого

  • Студентам
  • Преподавателям
  • Университетам
© 2026 SQLab. Все права защищены.Сделано в Узбекистане для студентов.
УчёбаПрактикаЗадачиАренаРейтинг
0/26

Основы

  • Что такое база данных?
  • Первый SELECT
  • WHERE: отбор нужных строк
  • IN, BETWEEN, LIKE и NULL
  • Сортировка, LIMIT и DISTINCT

Вычисления

  • Выражения, функции и CASE
  • Работа с датами
  • COUNT, SUM, AVG, MIN, MAX
  • GROUP BY и HAVING

Соединение таблиц

  • Ключи и связи
  • INNER JOIN
  • LEFT JOIN и строки без пары
  • Несколько таблиц и self join

Сложные запросы

  • Подзапросы
  • UNION, INTERSECT, EXCEPT
  • WITH: именованные запросы
  • Оконные функции

Создание и изменение таблиц

  • CREATE TABLE: типы и ограничения
  • INSERT, UPDATE, DELETE
  • ALTER, DROP, TRUNCATE
  • Как правильно спроектировать базу

Профессиональный уровень

  • Индексы и EXPLAIN
  • Транзакции и ACID
  • VIEW: сохранённые запросы
  • Функции, процедуры, триггеры
  • Пользователи, права и резервные копии
Учёба/Создание и изменение таблиц

Как правильно спроектировать базу

219 мин

В хорошо спроектированной базе каждый факт хранится в одном месте. В плохо спроектированной одно и то же повторяется десятки раз и со временем начинает противоречить самому себе. В этом уроке — как правильно разделить базу.

Плохой пример

Магазин ведёт всё в одной таблице:

order_id customer customer_phone products total
1 Aziz Karimov 901112233 iPhone 15, AirPods 3 13 880 000
2 Aziz Karimov 901112233 Quvvatlagich 20W 190 000
3 Malika Yusupova 935556677 iPhone 15 11 490 000

Проблемы:

  • Повторы — телефон Азиза записан в каждом заказе заново. Сменится телефон — менять везде; забудете одно место — база будет «знать» два разных телефона.
  • Список в одной ячейке — в products несколько товаров. На вопрос «сколько продано iPhone?» средствами SQL не ответить.
  • Вычисляемое значение — total выводится из цен товаров; они могут перестать совпадать.

Нормальные формы

Правила правильного устройства базы называются нормальными формами. На практике хватает первых трёх.

1НФ — в каждой ячейке одно значение. Никаких списков и повторяющихся столбцов (phone1, phone2, phone3). Товары разносятся по отдельным строкам.

2НФ — каждый столбец зависит от всего ключа. Если ключ составной (например, order_id + product_id), то название товара зависит только от product_id — значит, ему место в другой таблице (products).

3НФ — столбцы не зависят друг от друга. Телефону покупателя не место в заказе — он относится не к заказу, а к покупателю. Всё о покупателе — в таблице customers.

Правильная структура

Как в нашей базе shop:

  • customers — покупатели (имя, телефон — один раз);
  • products — товары (название, цена);
  • orders — заказ: кто и когда (customer_id);
  • order_items — состав заказа: какого товара сколько (order_id, product_id, quantity).

Теперь «телефон Азиза» хранится в одном месте, а «сколько продано iPhone» — простой запрос:

shop· Попробуйте изменить
SELECT p.name, SUM(oi.quantity) AS sold
FROM order_items oi JOIN products p ON p.id = oi.product_id
WHERE p.brand = 'Apple'
GROUP BY p.name
ORDER BY sold DESC;

Почему цена есть и в order_items?

products.price — текущая цена, order_items.unit_price — цена на момент продажи. Это не повтор: если цена завтра изменится, сумма прошлого заказа меняться не должна. Нормализация — это не «ничего не повторять», а «один смысл — в одном месте».

Денормализация

Иногда ради скорости данные повторяют намеренно: например, users.xp — готовое число вместо того, чтобы каждый раз суммировать xp_events. Это должно быть осознанным решением с понятным способом поддерживать значение актуальным.

Практические советы по проектированию

  1. Сначала определите сущности: студент, группа, предмет, оценка.
  2. Каждая — отдельная таблица, в каждой id.
  3. «Один ко многим» — внешний ключ на стороне «многих».
  4. «Многие ко многим» — промежуточная таблица.
  5. Имена столбцов понятные и в одном стиле: created_at, student_id.
1Упражнение

Выведите состав заказа номер 1 из order_items: название товара (products.name), quantity и unit_price.


Запомните

  • Один смысл — одно место: повторы ведут к ошибкам.
  • 1НФ — одно значение в ячейке; 2НФ — зависимость от всего ключа; 3НФ — столбцы зависят только от ключа.
  • Историческое значение (цена на момент продажи) — не повтор.
Предыдущий урокALTER, DROP, TRUNCATEСледующий урокИндексы и EXPLAIN

Содержание

  • Плохой пример
  • Нормальные формы
  • Правильная структура
  • Почему цена есть и в order_items?
  • Денормализация
  • Практические советы по проектированию
  • Запомните
УчёбаПрактикаЗадачиАренаРейтинг

SQLab