Урок курса

Первая база данных: таблица, строки и первичный ключ

SQL с нуля: бесплатный курс с практикой

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

Где живёт база данных и кто выполняет SQL

SQL — это текст. Сам по себе он ничего не делает: нужна программа, которая его прочитает, разберёт и выполнит. В нашем курсе эта программа — SQLite.

SQLite открывает базу данных — файл на диске или структуру в оперативной памяти — и держит там таблицы с данными. Когда вы передаёте SQLite SQL-текст, он разбирает команду, обращается к нужной таблице внутри базы и возвращает результат: либо изменённые данные, либо таблицу строк, которую вы видите как ответ на запрос.

Путь выглядит так: вы пишете SQL-текст → передаёте его SQLite → SQLite выполняет команду над открытой базой → получаете результат.

Внутри базы данные организованы в таблицы. Таблица — это не файл Excel и не список: это структура с фиксированными столбцами, где каждая строка описывает один объект. Реальные базы содержат десятки и сотни таблиц: клиенты, заказы, товары, платежи. В этом уроке мы работаем с одной — products.

Важный момент про результат: таблица, которую возвращает SELECT, не имеет гарантированного порядка строк, если вы не попросили об этом явно. SQLite может вернуть строки в любом порядке — это следствие того, как реляционные базы хранят данные. Порядок в результате и порядок хранения — разные вещи. Об управлении порядком поговорим позже, а пока просто знайте: не рассчитывайте, что строки всегда придут в том порядке, в каком вы их добавили.

Анимация выполнения SELECT: FROM выбирает таблицу products, SELECT выделяет столбцы name и price, после чего строки появляются в результате
FROM выбирает таблицу, SELECT — столбцы результата

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. Получите все три столбца для единственного товара в проверке именно в этом порядке.

РешениеSQL · SQLite

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку