1. Что такое база данных: представляем цифровой каталог
Что такое база данных: представляем цифровой каталог
Каждый раз, когда вы открываете список контактов в смартфоне, пролистываете ленту социальной сети или ищете кроссовки в интернет-магазине, вы взаимодействуете с базой данных. Представьте, что популярный маркетплейс — это гигантский склад. Если бы товары там лежали в одной огромной куче, поиск нужной футболки занял бы недели. Но на складе есть стеллажи, полки и ячейки, а у кладовщика — точный реестр. База данных — это и есть такой цифровой реестр, а SQL (Structured Query Language) — это универсальный язык, на котором мы отдаем команды этому «цифровому кладовщику».
От бумажной картотеки к реляционным таблицам
Чтобы понять, как устроена современная база данных, стоит на мгновение забыть о компьютерах и вспомнить старую библиотеку. В ней стояли деревянные ящики с карточками. На каждой карточке была записана информация об одной книге: название, автор, год издания и номер полки.
В мире ИТ такая структура называется таблицей. Это основной элемент реляционных баз данных (наиболее распространенного типа БД сегодня). Реляционными они называются от английского слова relation (отношение), потому что данные в них организованы в виде взаимосвязанных таблиц.
Рассмотрим таблицу Books (Книги). В ней информация не свалена в текст, а распределена по строкам и столбцам:
| ID | Title | Author | Year | Genre | | :--- | :--- | :--- | :--- | :--- | | 1 | Мастер и Маргарита | Михаил Булгаков | 1967 | Роман | | 2 | Пикник на обочине | Аркадий и Борис Стругацкие | 1972 | Фантастика | | 3 | Дюна | Фрэнк Герберт | 1965 | Фантастика |
В этой структуре есть два критически важных понятия:
Year всегда будет содержать числа.Важный нюанс: в хорошей таблице всегда есть столбец, который делает каждую строку уникальной. Обычно это ID (идентификатор). Даже если в библиотеку придут две абсолютно одинаковые книги «Дюна», у них будут разные ID (например, 3 и 4), чтобы система их не перепутала. Это называется первичным ключом.
SQL: Язык, который понимает данные
Базы данных хранятся на серверах в специальном программном обеспечении, которое называется СУБД (Система управления базами данных). Примеры популярных СУБД: PostgreSQL, MySQL, SQLite, Microsoft SQL Server.
SQL — это не язык программирования в привычном смысле (как Python или C++). На Python вы пишете алгоритм: «сначала сделай это, потом проверь условие, если оно верно — повтори». SQL — это декларативный язык. Вы не описываете как искать данные, вы описываете, что именно вы хотите получить.
Представьте, что вы в ресторане. Вы не идете на кухню объяснять повару, как чистить картошку и при какой температуре жарить мясо. Вы просто говорите: «Я хочу стейк средней прожарки». SQL работает так же. Вы говорите базе: «Дай мне названия всех книг, написанных после 1970 года», и СУБД сама решает, как эффективнее всего прочесть файлы на диске и отфильтровать нужные строки.
Первый запрос: Оператор SELECT и выбор столбцов
Самая частая операция в работе с данными — это чтение. Для этого используется оператор SELECT (выбрать). Это фундамент любого запроса.
Представим таблицу Students (Студенты):
| student_id | first_name | last_name | age | faculty | | :--- | :--- | :--- | :--- | :--- | | 101 | Иван | Петров | 20 | Физика | | 102 | Анна | Сидорова | 19 | Биология | | 103 | Петр | Волков | 21 | Физика |
Если мы хотим просто посмотреть на всю таблицу целиком, мы используем «звездочку» — символ `, который в SQL означает «все столбцы»:
Разберем этот запрос по косточкам:
* SELECT — команда «покажи мне данные».
— указание «возьми все доступные столбцы» (student_id, first_name, last_name и т.д.).
* FROM Students — указание источника, то есть таблицы, из которой нужно забрать информацию.
* ; (точка с запятой) — знак окончания запроса. В многих СУБД это обязательный символ, как точка в конце предложения.
Однако в реальных базах данных могут быть сотни столбцов. Выгружать их все — плохая практика. Это замедляет работу сети и нагружает память компьютера. Профессионалы всегда выбирают только то, что им нужно. Если нам нужны только имена и фамилии, запрос будет выглядеть так:
Здесь мы перечисляем нужные столбцы через запятую. Порядок перечисления важен: в каком порядке вы их напишете в SELECT, в таком они и появятся в итоговой таблице на экране.
Фильтрация реальности: Оператор WHERE
Представьте, что вы ищете товар в интернет-магазине. Вам не нужны все товары, вам нужны только «ноутбуки» и только «дешевле 50 000 руб.». В SQL для этого существует оператор WHERE (где). Он позволяет задать условие, которому должны соответствовать строки, чтобы попасть в результат.
Вернемся к нашей таблице студентов. Допустим, нам нужно найти только тех, кто учится на факультете физики.
Обратите внимание на детали:
. Если вы напишете без кавычек, база данных подумает, что Физика — это название другого столбца, и выдаст ошибку.Логика работы WHERE проста: СУБД берет первую строку таблицы и проверяет: «В столбце faculty написано 'Физика'?». Если да — строка идет в отчет. Если нет — отбрасывается. Затем она переходит ко второй строке, и так до самого конца.
Математика в фильтрах
В блоке WHERE можно использовать не только строгое равенство (=), но и другие математические операторы сравнения:
* > (больше) и < (меньше)
* >= (больше или равно) и <= (меньше или равно)
* <> или != (не равно)
Пример: Найти имена студентов, которые старше 20 лет.
Если мы хотим найти всех, кроме физиков, мы напишем:
Сложные условия: AND, OR и NOT
В жизни условия редко бывают простыми. Чаще нам нужно совместить несколько критериев. Для этого используются логические связки.
Оператор AND (И)
Этот оператор требует, чтобы оба условия были истинными одновременно. Пример: Найти студентов факультета «Физика», которым уже исполнилось 20 лет.Если студент — физик, но ему 19, он не попадет в список. Если ему 20, но он биолог — тоже не попадет.
Оператор OR (ИЛИ)
Этот оператор пропускает строку, если хотя бы одно из условий верно. Пример: Нам нужны студенты либо с физического, либо с биологического факультета.Оператор NOT (НЕ)
Он инвертирует (переворачивает) условие. Пример: Найти всех студентов, которые НЕ учатся на физике.
(Хотя чаще для этого используют !=, оператор NOT незаменим в более сложных конструкциях, которые мы разберем позже).
Работа с диапазонами и списками: BETWEEN и IN
Иногда условий становится слишком много, и запрос начинает выглядеть громоздко. SQL предлагает «синтаксический сахар» — более удобные способы записи частых условий.
Оператор BETWEEN
Представьте, что вам нужно найти студентов в возрасте от 18 до 20 лет включительно. Можно написать age >= 18 AND age <= 20, но есть способ изящнее:
Важно помнить:
BETWEEN в SQL всегда включает границы. То есть 18 и 20 тоже попадут в результат.Оператор IN
Если вам нужно проверить совпадение с одним из нескольких значений, вместо кучи OR лучше использовать IN (в списке).
Допустим, у нас расширился список факультетов: Физика, Биология, Химия, Математика, История. Нам нужны только естественные науки.
Это не только быстрее писать, но и гораздо легче читать другим людям.
Поиск по шаблону: Оператор LIKE
А что если мы не знаем точного значения? Например, мы помним, что фамилия студента начинается на «Пет...», но не помним, Петров он, Петренко или Петровский. Для частичного совпадения используется оператор
LIKE и специальные символы-подстановки (wildcards). % (процент) — заменяет любое количество любых символов (даже ноль символов).
_ (нижнее подчеркивание) — заменяет ровно один любой символ.Пример 1: Поиск всех фамилий на «Пет».
Этот запрос найдет: 'Петров', 'Петренко', 'Петля'. Но не найдет 'Апетян', так как перед «Пет» ничего не должно быть.
Пример 2: Поиск всех имен, где вторая буква «н».
Здесь
_ говорит: «пропусти первый символ», н говорит: «второй символ должен быть н», а % говорит: «дальше может быть что угодно». Под это условие подойдут 'Анна', 'Инна', 'Антон'.Работа с отсутствующими данными: NULL
В базах данных бывает так, что информация неизвестна. Например, студент еще не выбрал факультет. В этом случае в ячейке таблицы будет не пустая строка и не ноль, а специальное значение
NULL.NULL — это не значение, это состояние «данных нет». С ним нельзя работать с помощью обычного знака равенства.
❌ Ошибка: WHERE faculty = NULL (это всегда вернет ложь, даже если там NULL).
✅ Правильно: WHERE faculty IS NULL (проверка на пустоту) или WHERE faculty IS NOT NULL (проверка на наличие любого значения).Пример: Найти студентов, у которых не указан возраст.
Порядок выполнения запроса: Как думает компьютер
Начинающим часто кажется, что запрос выполняется сверху вниз, как мы его читаем. Но у СУБД своя логика. Понимание этой логики поможет вам избегать ошибок в будущем.
Когда вы отправляете запрос:
FROM: Сначала база данных находит нужную таблицу. Если таблицы не существует, всё остальное не имеет смысла.
WHERE: Затем она фильтрует строки. Это самый тяжелый этап — нужно проверить каждую запись.
SELECT: И только в самом конце, из тех строк, что прошли фильтр, база выбирает нужные столбцы и показывает их вам. Почему это важно? Например, если вы в
SELECT переименуете столбец (создадите псевдоним), вы не сможете использовать это новое имя в WHERE, потому что на этапе фильтрации база еще «не видела» ваш SELECT.Практические сценарии и нюансы
Давайте разберем более сложный пример. Представьте таблицу
Orders (Заказы) в интернет-магазине:| order_id | customer_name | product_category | price | status | order_date |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 1 | Алексей | Электроника | 15000 | Доставлен | 2023-10-01 |
| 2 | Мария | Одежда | 3000 | В пути | 2023-10-05 |
| 3 | Иван | Электроника | 45000 | Отменен | 2023-10-06 |
| 4 | Елена | Дом | 1200 | Доставлен | 2023-10-10 |
Задача: Получить список имен клиентов и категорий товаров для всех доставленных заказов из категории «Электроника», стоимость которых превышает 10 000 руб.
Разбиваем задачу на части:
Какие столбцы нужны? customer_name, product_category.
Из какой таблицы? Orders.
Какие условия?
* status = 'Доставлен'
* product_category = 'Электроника'
* price > 10000Собираем запрос:
В результате мы получим только одну строку: «Алексей, Электроника». Иван не попал, так как его заказ отменен, а Елена не попала, так как у нее категория «Дом» и низкая цена.
Регистр символов (Case Sensitivity)
Важный момент, который часто путает новичков: чувствителен ли SQL к регистру?
* Команды (
SELECT, FROM, WHERE) — обычно нечувствительны. Можно писать select маленькими буквами, но в профессиональной среде принято писать их капсом для читаемости.
* Имена таблиц и столбцов — зависит от настроек конкретной СУБД (в PostgreSQL по умолчанию всё приводится к нижнему регистру, в MySQL на Windows регистр не важен, на Linux — важен).
* Данные внутри кавычек ('Физика') — почти всегда чувствительны. Если вы напишете WHERE faculty = 'физика', база может не найти 'Физика' с большой буквы.Чтобы избежать проблем с регистром, часто используют специальные функции, например
LOWER(), которая переводит текст в нижний регистр перед сравнением:
Зачем это нужно знать каждому?
Вы можете спросить: «Зачем мне учить SQL, если я могу просто выгрузить данные в Excel и отфильтровать их там?».
Ответ кроется в масштабах. Excel начинает «тормозить» уже на нескольких сотнях тысяч строк, а на миллионе просто перестает работать. Базы данных легко оперируют миллиардами записей. Кроме того, SQL позволяет автоматизировать процессы. Один раз написанный запрос может стать основой для ежедневного отчета, который будет обновляться сам, без участия человека.
SQL — это не просто навык для программистов. Это инструмент для маркетологов (анализ поведения клиентов), менеджеров (контроль остатков на складе), ученых (обработка результатов экспериментов) и даже журналистов (работа с открытыми данными).
Разбор типичных ошибок
Даже опытные разработчики иногда совершают ошибки в простых запросах. Рассмотрим самые частые «грабли»:
Пропущенная запятая в SELECT.
В этом случае SQL подумает, что вы хотите переименовать столбец first_name в last_name (создать алиас), и выведет только один столбец с именами, но под заголовком «last_name». Всегда проверяйте запятые. Использование двойных кавычек для текста.
В SQL двойные кавычки " используются для имен таблиц или столбцов (если в них есть пробелы), а для значений (текста) используются только одинарные '.
Попытка сравнить NULL через =.
Как мы уже обсуждали, age = NULL никогда не сработает. Только IS NULL. Логические ошибки с OR.
Допустим, вы хотите найти всех физиков, которым 18 или 19 лет.
Из-за приоритета операций (AND выполняется раньше OR) этот запрос найдет: «всех физиков 18 лет» И «всех студентов 19 лет любого факультета». Чтобы исправить это, используйте скобки:
Примеры для закрепления логики
Давайте рассмотрим еще несколько сценариев использования
SELECT в разных сферах жизни.Сценарий 1: Учет в библиотеке
Таблица Library: столбцы book_title, author, is_available (доступна ли книга, значения 'Yes'/'No'), pages_count.
Задача: найти все книги Льва Толстого, которые сейчас свободны и в которых больше 500 страниц.Сценарий 2: Геймдев (Разработка игр)
Таблица Players: nickname, level, last_login_date, gold_balance.
Задача: найти никнеймы игроков, которые не заходили в игру больше месяца (условно, дата до '2023-09-01') и имеют уровень выше 50, чтобы отправить им бонус.Сценарий 3: Музыкальный стриминг
Таблица Tracks: track_name, artist, duration_sec, genre`.
Задача: найти все песни в жанре 'Rock' или 'Metal', длительность которых составляет от 180 до 300 секунд.SQL — это язык точности. Он заставляет нас четко формулировать свои мысли. Когда вы пишете запрос, вы превращаете расплывчатое человеческое желание «хочу найти что-то интересное» в строгую математическую инструкцию. И именно эта строгость делает его таким мощным инструментом в руках любого, кто работает с информацией.