Основы SQL: от теории баз данных до сложных запросов

Курс предназначен для начинающих и охватывает ключевые аспекты работы с реляционными базами данных, включая структуру таблиц и типы данных [ru.hexlet.io](https://ru.hexlet.io/courses/sql-basics). Вы научитесь писать запросы для выборки, фильтрации и анализа информации, а также освоите модификацию данных и объединение таблиц [netology.ru](https://netology.ru/programs/vvedenie-v-sql-i-rabotu-s-bazoi-dannih).

1. Введение в реляционные базы данных и основные понятия SQL

Введение в реляционные базы данных и основные понятия SQL

Представьте, что вы разрабатываете интернет-магазин. У вас есть тысячи товаров, десятки тысяч пользователей и миллионы заказов. Хранить эту информацию в текстовых файлах или таблицах Excel невозможно: это медленно, небезопасно и неудобно для одновременного доступа множества людей. Здесь на сцену выходят базы данных.

В этой статье мы разберем, как устроены современные системы хранения данных, почему мир до сих пор держится на «таблицах» и что такое язык SQL.

Что такое База Данных и СУБД?

Важно сразу разделить два понятия, которые новички часто путают:

  • База данных (БД) — это само упорядоченное хранилище данных (файлы на диске).
  • СУБД (Система Управления Базами Данных) — это программное обеспечение, которое позволяет создавать базы данных, читать из них информацию и обновлять её.
  • Проще говоря, БД — это библиотека с книгами, а СУБД — это библиотекарь, который точно знает, где лежит нужная книга, и выдает её вам по запросу.

    !Архитектура взаимодействия: Пользователь — СУБД — Данные

    Любая серьезная система состоит из кода (логики) и хранилища. Как отмечают эксперты hexlet.io, СУБД решают критически важные задачи: обеспечивают доступ к данным для множества пользователей одновременно и защищают информацию от сбоев.

    Реляционная модель: мир состоит из таблиц

    В 1970 году Эдгар Кодд предложил реляционную модель данных (от англ. relation — отношение). Несмотря на сложное название, суть её проста: данные хранятся в таблицах, связанных между собой.

    Системы, работающие по этому принципу, называются РCУБД (Реляционные СУБД). Самые популярные из них сегодня: PostgreSQL, MySQL, Microsoft SQL Server и Oracle.

    Структура таблицы

    Любая таблица в реляционной базе данных состоит из трех ключевых элементов:

    * Сущность (Таблица) — объект реального мира (например, «Клиенты» или «Заказы»). * Атрибуты (Столбцы) — характеристики объекта (имя, телефон, цена). * Кортежи (Строки) — конкретные записи с данными.

    С математической точки зрения, строка таблицы (кортеж) может быть описана следующим образом:

    где — это кортеж (строка), — это значения атрибутов (ячеек) в этой строке, а — количество столбцов в таблице. Например, для пользователя это может быть (1, 'Иван', 'ivan@mail.ru').

    Первичные ключи и связи

    Главная сила реляционных баз — в связях. Чтобы отличить одного «Ивана» от другого, используется Первичный ключ (Primary Key) — уникальный идентификатор строки (обычно это столбец id).

    Чтобы связать заказ с пользователем, мы не пишем имя пользователя в таблицу заказов. Мы просто указываем его id. Это называется Внешний ключ (Foreign Key).

    Пример двух связанных таблиц:

    Таблица: Users (Пользователи)

    | id | name | email | | :--- | :--- | :--- | | 1 | Анна | anna@example.com | | 2 | Борис | boris@example.com |

    Таблица: Orders (Заказы)

    | id | user_id | amount | | :--- | :--- | :--- | | 101 | 1 | 5000 | | 102 | 1 | 1200 | | 103 | 2 | 3000 |

    Здесь user_id в таблице заказов ссылается на id в таблице пользователей. Это позволяет хранить данные компактно и избегать дублирования.

    SQL: Язык общения с данными

    Для управления всем этим хозяйством используется язык SQL (Structured Query Language — язык структурированных запросов). Это стандарт, который понимают все реляционные СУБД.

    SQL — это декларативный язык. Это значит, что вы говорите системе, что хотите получить, а не как это сделать. СУБД сама решит, как эффективнее всего найти данные на диске.

    Основные группы команд SQL

    Все команды SQL делятся на несколько логических групп. Две самые важные для начинающих:

  • DDL (Data Definition Language) — язык определения данных. Используется для создания и изменения структуры (скелета) базы.
  • * CREATE — создать таблицу или базу. * ALTER — изменить таблицу (добавить столбец). * DROP — удалить таблицу полностью.

  • DML (Data Manipulation Language) — язык манипулирования данными. Используется для работы с содержимым ячеек.
  • * SELECT — выбрать (прочитать) данные. * INSERT — вставить новые данные. * UPDATE — обновить существующие данные. * DELETE — удалить строки.

    > SQL — это не просто язык программирования, это стандарт взаимодействия с информацией. Как указано в материалах kpfu.ru, изучение SQL часто начинается с теории множеств, так как операции над таблицами (объединение, пересечение) имеют под собой строгую математическую основу.

    Ваш первый запрос

    Самая частая операция — это чтение данных. Для этого используется команда SELECT. Давайте посмотрим на её базовый синтаксис:

    Разберем этот запрос по частям: * SELECT name, email — «Покажи мне столбцы name и email». * FROM users — «Возьми их из таблицы users». * WHERE id > 1 — «Но только для тех строк, где значение id больше 1».

    В результате СУБД вернет нам таблицу, содержащую только нужные данные.

    !Принцип работы оператора WHERE: отсеивание ненужных строк

    Почему SQL и реляционные базы до сих пор актуальны?

    Несмотря на появление новых типов баз данных (NoSQL), реляционные СУБД остаются стандартом де-факто для большинства бизнес-задач. Причина в надежности и предсказуемости.

    Реляционные базы гарантируют целостность данных через набор свойств, называемых ACID (Atomicity, Consistency, Isolation, Durability). Если вы переводите деньги со счета на счет, ACID гарантирует, что деньги не исчезнут на полпути, даже если в момент перевода выключат электричество.

    Как подчеркивают авторы курса на wiki.merionet.ru, знание принципов работы баз данных — это неотъемлемая часть работы IT-специалиста, будь то разработчик, аналитик или администратор.

    Итоги

    Мы сделали первый шаг в мир баз данных. Вот что нужно запомнить:

  • СУБД — это программа для управления данными, а БД — это само хранилище.
  • Реляционные базы хранят данные в таблицах, которые связаны друг с другом через ключи (Primary Key и Foreign Key).
  • SQL — это язык для управления данными. Он декларативный: мы описываем желаемый результат, а не алгоритм поиска.
  • Команды делятся на DDL (структура: CREATE, DROP) и DML (данные: SELECT, INSERT).
  • Строка таблицы называется кортежем, а столбец — атрибутом.
  • В следующей статье мы перейдем от теории к практике и научимся устанавливать окружение для работы с SQL.

    2. Написание базовых запросов на выборку данных с оператором SELECT

    Написание базовых запросов на выборку данных с оператором SELECT

    Оператор SELECT — это фундамент языка SQL. По статистике, 90% времени работы аналитика или бэкенд-разработчика с базой данных занимает именно чтение данных, а не их изменение. Если INSERT или UPDATE меняют состояние мира (добавляют заказ, меняют статус), то SELECT — это способ этот мир увидеть.

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

    Анатомия простого запроса

    Самый простой запрос состоит всего из двух слов: что мы хотим выбрать и откуда.

    * SELECT (Выбрать) — указывает СУБД, какие именно столбцы (атрибуты) нужно вернуть. * FROM (Из) — указывает таблицу, в которой лежат эти данные.

    В терминах реляционной алгебры, о которой мы говорили в прошлой статье, операция выбора конкретных столбцов называется проекцией. Она обозначается греческой буквой «пи»:

    где — оператор проекции, — список выбираемых атрибутов, а — отношение (таблица), к которому применяется операция.

    Выборка всех столбцов

    Иногда вам нужно посмотреть всё содержимое таблицы. Для этого используется символ «звездочка» (*):

    Этот запрос вернет абсолютно все столбцы и все строки таблицы.

    > Важно: Использовать SELECT * в реальном программном коде (продакшене) считается плохой практикой. Как отмечают эксперты metanit.com, это создает избыточную нагрузку на сеть, передавая ненужные данные, и может сломать работу приложения, если в таблицу добавят новые столбцы, которых программа не ожидает.

    Арифметические операции и псевдонимы

    SQL позволяет не просто читать данные, но и преобразовывать их «на лету». Представьте, что у вас есть цена товара (price) и количество на складе (quantity), а вы хотите узнать общую стоимость остатков.

    Результатом будет таблица, где во втором столбце будут посчитанные значения. Однако заголовок этого столбца будет выглядеть странно (например, ?column? или price * quantity). Чтобы дать столбцу понятное имя, используется оператор AS (как):

    Теперь результирующая таблица будет иметь красивые заголовки product_name и total_value.

    Фильтрация данных: оператор WHERE

    Чаще всего нам не нужна вся таблица, а только конкретные строки: товары дороже 1000 рублей или пользователи из Москвы. За это отвечает оператор WHERE.

    !Принцип работы оператора WHERE: отсеивание строк, не соответствующих условию

    Синтаксис выглядит так:

    Операторы сравнения

    Внутри WHERE можно использовать стандартные математические операторы:

    * = — равно * <> или != — не равно * > — больше * < — меньше * >= — больше или равно * <= — меньше или равно

    Логические связки

    Условия можно комбинировать с помощью логических операторов AND (И), OR (ИЛИ) и NOT (НЕ).

    Пример: Найти товары категории «Электроника», которые стоят дешевле 5000 рублей.

    Если бы мы использовали OR, то получили бы и все товары категории «Электроника» (любой цены), и все товары дешевле 5000 (любой категории).

    Сортировка данных: ORDER BY

    В реляционных базах данных порядок строк не гарантирован. Если вы сделаете SELECT дважды, строки могут вернуться в разном порядке. Чтобы упорядочить их, используется ORDER BY.

    * ASC (Ascending) — по возрастанию (от А до Я, от 0 до 9). Используется по умолчанию, если ничего не указать. * DESC (Descending) — по убыванию (от Я до А, от 9 до 0).

    Можно сортировать по нескольким столбцам. Например, сначала по категории, а внутри категории — по цене:

    Удаление дубликатов: DISTINCT

    Иногда в таблице много повторяющихся значений. Например, если мы хотим узнать, какие вообще категории товаров существуют, простой SELECT category вернет тысячи строк с повторами («Электроника», «Одежда», «Электроника»...).

    Чтобы оставить только уникальные значения, используем ключевое слово DISTINCT:

    Ограничение количества строк: LIMIT

    Если таблица содержит миллион записей, выводить их все на экран бессмысленно. Оператор LIMIT позволяет получить только первые строк.

    Этот запрос покажет топ-5 самых дорогих товаров. Обратите внимание: LIMIT почти всегда используется вместе с ORDER BY, иначе вы получите 5 случайных строк.

    Порядок выполнения запроса

    Это самая важная часть для понимания работы SQL. То, как мы пишем запрос, и то, как СУБД его выполняет, — это разные вещи.

    Мы пишем:

  • SELECT
  • FROM
  • WHERE
  • ORDER BY
  • LIMIT
  • СУБД выполняет (упрощенно):

  • FROM (Находит таблицу на диске)
  • WHERE (Отфильтровывает ненужные строки)
  • SELECT (Оставляет только нужные столбцы и считает формулы)
  • ORDER BY (Сортирует результат)
  • LIMIT (Обрезает результат)
  • Как подчеркивается в статье на gitverse.ru, понимание этого порядка критически важно. Например, вы не можете использовать в WHERE псевдоним столбца, который вы придумали в SELECT, потому что в момент выполнения фильтрации (WHERE) блок SELECT еще не сработал.

    Ошибка:

    Правильно:

    Итоги

    Мы разобрали базовые инструменты для чтения данных. Краткое резюме:

  • SELECT ... FROM — основа любого запроса. Указывайте конкретные столбцы вместо * для оптимизации.
  • AS — позволяет переименовывать столбцы и давать имена результатам вычислений.
  • WHERE — фильтрует строки. Работает до того, как данные будут выбраны и отсортированы.
  • ORDER BY — сортирует данные (ASC — возрастание, DESC — убывание).
  • DISTINCT — убирает дубликаты из результата.
  • Порядок выполнения отличается от порядка написания: сначала база данных находит данные (FROM), фильтрует их (WHERE), и только потом выбирает столбцы (SELECT).