Урок курса
Первая база данных: таблица, строки и первичный ключ
SQL с нуля: бесплатный курс с практикойБаза данных — это не абстракция из учебника, а конкретный файл на диске или область в памяти, где данные хранятся в строгой структуре. Прежде чем писать первый запрос, стоит понять, кто его читает и что с ним делает.
Где живёт база данных и кто выполняет SQL
SQL — это текст. Сам по себе он ничего не делает: нужна программа, которая его прочитает, разберёт и выполнит. В нашем курсе эта программа — SQLite.
SQLite открывает базу данных — файл на диске или структуру в оперативной памяти — и держит там таблицы с данными. Когда вы передаёте SQLite SQL-текст, он разбирает команду, обращается к нужной таблице внутри базы и возвращает результат: либо изменённые данные, либо таблицу строк, которую вы видите как ответ на запрос.
Путь выглядит так: вы пишете SQL-текст → передаёте его SQLite → SQLite выполняет команду над открытой базой → получаете результат.
Внутри базы данные организованы в таблицы. Таблица — это не файл Excel и не список: это структура с фиксированными столбцами, где каждая строка описывает один объект. Реальные базы содержат десятки и сотни таблиц: клиенты, заказы, товары, платежи. В этом уроке мы работаем с одной — products.
Важный момент про результат: таблица, которую возвращает SELECT, не имеет гарантированного порядка строк, если вы не попросили об этом явно. SQLite может вернуть строки в любом порядке — это следствие того, как реляционные базы хранят данные. Порядок в результате и порядок хранения — разные вещи. Об управлении порядком поговорим позже, а пока просто знайте: не рассчитывайте, что строки всегда придут в том порядке, в каком вы их добавили.

CREATE TABLE: задаём форму первой таблицы
Прежде чем добавить хоть одну строку, нужно описать структуру таблицы — какие в ней будут столбцы и какие типы для них объявлены. Это делает команда CREATE TABLE:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
title TEXT,
price INTEGER
);
После выполнения этой команды таблица products существует, но пуста — в ней ноль строк. CREATE TABLE задаёт имена столбцов и их объявленные типы. В обычной SQLite-таблице тип влияет на то, как база обрабатывает значение, но не всегда служит жёстким запретом на значения другого вида; особенности типизации разберём отдельно. Данные появятся позже.
Каждый столбец описывает один атрибут будущих записей. title будет хранить название товара, price — цену. Каждая строка таблицы — это один товар, и у него будет ровно три атрибута в соответствии со схемой.
product_id INTEGER PRIMARY KEY — особый столбец. PRIMARY KEY означает, что значение в нём однозначно идентифицирует строку: не может быть двух товаров с одинаковым product_id. SQLite контролирует это автоматически: если попытаться вставить строку с уже существующим идентификатором, база отклонит вставку и сообщит о нарушении уникальности.
Почему не стоит использовать title как первичный ключ? Названия товаров могут совпадать и со временем меняться. Поэтому вводят отдельный числовой идентификатор: product_id, customer_id, order_id. Его значение назначает программа или сама база, а ограничение PRIMARY KEY заставляет SQLite контролировать уникальность этого значения в таблице.
INSERT INTO: добавляем строки в пустую таблицу
После CREATE TABLE таблица существует, но пустая. Чтобы в ней появились данные, нужен INSERT INTO:
INSERT INTO products (product_id, title, price)
VALUES
(101, 'Ноутбук', 75000),
(102, 'Мышь', 1200),
(103, 'Монитор', 32000);
Часть (product_id, title, price) — это список столбцов, в которые мы пишем значения. Каждая строка после VALUES — это один набор значений в том же порядке: первое число идёт в product_id, строка в одинарных кавычках — в title, второе число — в price.
Одна команда добавляет три строки сразу — для этого достаточно перечислить несколько наборов через запятую. После выполнения в products появится ровно три записи.
Две детали синтаксиса, которые часто путают на старте:
- Текстовые значения берутся в одинарные кавычки:
'Ноутбук', а не"Ноутбук". - Числа пишутся без кавычек:
75000, а не'75000'.
Порядок значений должен совпадать с порядком явно перечисленных столбцов: если поменять местами значения, SQLite не угадает намерение и сопоставит их по позиции. Столбец можно не указывать вместе с его значением — тогда он получит значение по умолчанию или NULL, если схема это разрешает. А если количество перечисленных столбцов и значений различается, команда завершится ошибкой. Явный список столбцов фиксирует соответствие и делает вставку понятнее.
SELECT *: проверяем, что база создана и заполнена
После CREATE TABLE и INSERT INTO можно убедиться, что данные на месте:
SELECT * FROM products;
SQLite вернёт таблицу с тремя столбцами — product_id, title, price — и тремя строками:
| product_id | title | price |
|---|---|---|
| 101 | Ноутбук | 75000 |
| 102 | Мышь | 1200 |
| 103 | Монитор | 32000 |
Звёздочка * означает «все столбцы таблицы». Порядок столбцов в результате совпадает с тем, как они были объявлены в CREATE TABLE.
Важно понимать, что именно вы только что сделали: три команды — три разные роли. CREATE TABLE описал структуру. INSERT INTO заполнил её данными. SELECT прочитал то, что получилось. Это и есть базовый рабочий цикл: описать → заполнить → прочитать.
В учебных задачах этого курса первые две команды часто уже выполнены заранее — это setup-код, который готовит базу для упражнения. Ваша задача в таких случаях — написать только SELECT-запрос. Разница принципиальная: setup создаёт условия, запрос — это то, что вы исследуете и формулируете сами. Когда вы видите готовую таблицу в задаче, она появилась именно так: через CREATE TABLE и INSERT INTO, выполненные до того, как вы открыли упражнение.
Задача 1
В схеме таблицы customers столбец customer_id объявлен как INTEGER PRIMARY KEY, а name и city — как TEXT. Почему customer_id подходит на роль первичного ключа, а name или city — нет?
Задача 2
В таблице orders уже есть строка с order_id = 5. Что произойдёт, если выполнить INSERT INTO с order_id = 5 ещё раз?
Задача 3
Таблица products объявлена со столбцами product_id INTEGER PRIMARY KEY, title TEXT и price INTEGER. Что такое запись (101, 'Ноутбук', 75000) в этой таблице?
Задача 4
В таблице products есть столбцы: product_id, title, price, category. Что верно описывает роль столбца price?
Задача 5
База пока пуста. В каком порядке нужно выполнить команды, чтобы создать таблицу products, добавить в неё строки и затем увидеть их?
Задача 6
Первый запуск: прочитайте таблицу products
База для упражнения уже подготовлена: в ней есть таблица products со столбцами product_id, title и price. Получите все три столбца для единственного товара в проверке именно в этом порядке.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
