Школьный журнал, электронная очередь в поликлинике, банковское приложение, каталог интернет-магазина — за всем этим стоит база данных, а чтобы получить из неё информацию, чаще всего используют язык SQL. Чтобы написать первый запрос, не нужно быть программистом. В этом руководстве мы объясним, что такое база данных и таблица, сравнив их с Excel, подготовим бесплатную среду для практики на компьютере, а затем разберём SELECT, FROM, WHERE, ORDER BY, LIMIT, COUNT, SUM, AVG, GROUP BY и простой JOIN на примере двух небольших таблиц. В конце — частые ошибки, практическое задание и чек-лист.
Что такое база данных и таблица
База данных — это система для упорядоченного хранения данных и быстрого поиска по ним. Самый распространённый вид — реляционная база: данные в ней хранятся в таблицах, а таблицы связаны между собой.
Если вы работали с Excel или Google Sheets, многие понятия покажутся знакомыми:
| В Excel | В базе данных |
|---|---|
| Файл (рабочая книга) | База |
| Лист | Таблица |
| Заголовок столбца | Имя столбца (поля) |
| Строка | Запись |
| Фильтр | Условие WHERE |
| Сортировка | ORDER BY |
| Сводная таблица | GROUP BY |
| ВПР (VLOOKUP) / XLOOKUP | JOIN |
Есть и важные отличия:
- Строгий тип столбца. Если для столбца
ageзадан числовой тип, записать туда «20 лет» не получится. - Объём и пользователи. База рассчитана на миллионы записей и на множество сотрудников, работающих одновременно.
- Формула не в ячейке, а в запросе. Вы пишете запрос, база возвращает результат в виде новой таблицы, а исходные данные не меняются.
Одну таблицу или набор таблиц из базы часто называют датасетом — особенно когда данные подготовлены для анализа.
Что такое SQL и зачем он нужен
SQL (Structured Query Language — язык структурированных запросов) — стандартный язык для работы с реляционными базами. В SQL вы описываете не «как искать», а «что нужно». Например: «дай имена учеников из Ташкента». Как выполнить поиск быстро, база решает сама.
С SQL работает множество систем: SQLite, MySQL, PostgreSQL, Microsoft SQL Server, Oracle и другие. У каждой есть свои дополнения (это называют «диалектом»), но основные команды из этой статьи почти везде работают одинаково. Одно отличие назовём сразу: LIMIT, ограничивающий число строк результата, работает в SQLite, MySQL и PostgreSQL, а в Microsoft SQL Server вместо него используют TOP.
Для тех, кто занимается анализом данных, SQL — основной ежедневный инструмент. Бухгалтер, менеджер или сотрудник учебного центра тоже с его помощью сам, не дожидаясь программиста, отвечает на вопросы вроде «сколько новых учеников пришло в этом месяце».
Бесплатная среда для практики
SQL осваивают, когда пишут запросы, и сервер для этого не нужен.
- SQLite — бесплатная система, в которой вся база хранится в одном файле; настраивать почти ничего не нужно.
- DB Browser for SQLite — бесплатная программа с открытым кодом, чтобы открывать базы SQLite в оконном интерфейсе и писать запросы. Версии для Windows, macOS и Linux скачиваются с официального сайта (sqlitebrowser.org).
- Онлайн-редакторы SQL (например, SQLite Online или DB Fiddle) — для практики прямо в браузере, ничего не устанавливая. Не загружайте туда личные или рабочие данные.
Создаём базу в DB Browser
- Откройте программу и нажмите New Database. Дайте файлу имя, например
study_center.db, и сохраните. - Откроется окно создания таблицы (Edit table definition) — закройте его кнопкой Cancel: таблицы мы создадим запросом.
- Перейдите на вкладку Execute SQL и вставьте скрипт ниже.
- Нажмите кнопку Execute all или F5.
- Чтобы записать изменения в файл, нажмите Write Changes (Ctrl + S). Пока эта кнопка не нажата, изменения в файл не попадают.
- На вкладке Browse Data проверьте, что таблицы появились.
CREATE TABLE courses (
id INTEGER PRIMARY KEY,
title TEXT,
duration_weeks INTEGER
);
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
city TEXT,
age INTEGER,
course_id INTEGER,
score INTEGER
);
INSERT INTO courses VALUES
(1, 'Компьютерная грамотность', 8),
(2, 'Английский язык', 12),
(3, 'Анализ данных', 10),
(4, 'Мобилография', 6);
INSERT INTO students VALUES
(1, 'Дилноза', 'Ташкент', 19, 3, 88),
(2, 'Жасур', 'Самарканд', 24, 1, 75),
(3, 'Малика', 'Наманган', 17, 2, 92),
(4, 'Сардор', 'Ташкент', 31, 3, 64),
(5, 'Нодира', 'Бухара', 22, 1, 81),
(6, 'Бекзод', 'Коканд', 27, 2, NULL),
(7, 'Гульнора', 'Самарканд', 35, 3, 79),
(8, 'Отабек', 'Ташкент', 20, 4, 70);
Это условный учебный центр: имена, возраст и баллы придуманы. course_id ссылается на id в таблице courses. Балл Бекзоду ещё не выставлен — NULL, то есть «значения нет». В именах таблиц и столбцов мы не используем пробелы, апострофы и кириллицу (students, course_id) — это избавляет от многих проблем.
Если данные у вас в Excel, сохраните их в формате CSV и превратите в таблицу в DB Browser через File → Import → Table from CSV file.
Первые запросы: SELECT, FROM, WHERE
SELECT и FROM
Самый простой запрос состоит из двух частей: SELECT — какие столбцы нужны, FROM — из какой таблицы.
SELECT name, city FROM students;
Результат — имена и города всех восьми учеников. Для всех столбцов используют звёздочку: SELECT * FROM students;, но в больших таблицах указывайте только нужные. Писать команды заглавными буквами не обязательно, но так их легче читать. Точка с запятой отделяет запрос от следующего.
WHERE: выбор по условию
WHERE выполняет роль фильтра в Excel: оставляет только строки, подходящие под условие.
SELECT name, city FROM students
WHERE city = 'Ташкент';
| name | city |
|---|---|
| Дилноза | Ташкент |
| Сардор | Ташкент |
| Отабек | Ташкент |
Текстовое значение пишется в одинарных кавычках, число — без кавычек: WHERE age > 25 — останутся Сардор (31), Бекзод (27) и Гульнора (35). Операторы сравнения: =, <> (не равно), >, <, >=, <=.
Несколько условий: AND, OR, IN, LIKE
WHERE city = 'Самарканд' AND age < 30— должны выполняться оба условия. Результат: Жасур.WHERE city = 'Бухара' OR city = 'Наманган'— хотя бы одно. Результат: Малика и Нодира.WHERE city IN ('Бухара', 'Наманган')— краткая запись предыдущего запроса.WHERE age BETWEEN 18 AND 25— диапазон, границы включаются.WHERE name LIKE 'С%'— имена, начинающиеся на «С».%— любое количество символов. Результат: Сардор.
Если AND и OR используются вместе, ставьте скобки: WHERE (city = 'Бухара' OR city = 'Наманган') AND age > 18. Без скобок запрос может дать не тот результат, которого вы ждёте.
Сортировка и ограничение: ORDER BY, LIMIT
ORDER BY упорядочивает результат: ASC — по возрастанию (по умолчанию), DESC — по убыванию. LIMIT ограничивает число строк в результате. Вместе они отвечают на вопросы вроде «лучшая тройка»:
SELECT name, score FROM students
ORDER BY score DESC
LIMIT 3;
| name | score |
|---|---|
| Малика | 92 |
| Дилноза | 88 |
| Нодира | 81 |
ORDER BY city, name — сначала по городу, затем по имени. Куда попадёт NULL, зависит от системы: в SQLite это наименьшее значение, поэтому при DESC он оказывается в конце.
Важное правило: без ORDER BY порядок строк не гарантирован. Если порядок важен, всегда указывайте его явно.
Вычисления: COUNT, SUM, AVG и GROUP BY
Агрегатные функции
Агрегатные функции выдают один результат по многим строкам — как формулы СУММ, СРЗНАЧ и СЧЁТ в Excel.
SELECT COUNT(*) AS total,
COUNT(score) AS with_score,
ROUND(AVG(score), 1) AS avg_score,
MAX(score) AS top_score
FROM students;
| total | with_score | avg_score | top_score |
|---|---|---|---|
| 8 | 7 | 78.4 | 92 |
COUNT(*) считает все строки — 8, а COUNT(score) только те, где есть балл, — 7, потому что у Бекзода NULL. AVG тоже не учитывает NULL и считает среднее по семи ученикам. AS даёт столбцу имя, ROUND(..., 1) округляет до одного знака.
SUM возвращает сумму значений: SELECT SUM(duration_weeks) FROM courses; — все курсы вместе длятся 36 недель. MIN и MAX — наименьшее и наибольшее значение.
GROUP BY: вычисления по группам
GROUP BY объединяет строки с одинаковым значением в группы и считает итог для каждой — похоже на сводную таблицу в Excel. Сколько учеников в каждом городе?
SELECT city, COUNT(*) AS cnt
FROM students
GROUP BY city
ORDER BY cnt DESC, city;
| city | cnt |
|---|---|
| Ташкент | 3 |
| Самарканд | 2 |
| Бухара | 1 |
| Коканд | 1 |
| Наманган | 1 |
Правило: в SELECT должны быть только сгруппированный столбец и агрегатные функции. Если добавить несгруппированный name, большинство систем выдаст ошибку, а SQLite выведет произвольное имя из группы — и это ещё опаснее, потому что ошибку не видно.
HAVING: фильтр по группам
WHERE фильтрует строки до группировки, а HAVING — уже готовые группы. Курсы, где учатся минимум двое:
SELECT course_id, COUNT(*) AS cnt
FROM students
GROUP BY course_id
HAVING COUNT(*) >= 2;
В результате останутся курсы 1, 2 и 3, а курс 4, где учится только Отабек, отсеется.
Связываем две таблицы: идея JOIN
В таблице students хранится не название курса, а только его номер (course_id). Если бы название повторялось в каждой строке, при его изменении пришлось бы исправлять сотни мест. Поэтому название хранится один раз в таблице courses, а две таблицы при необходимости соединяет JOIN — примерно как ВПР в Excel.
SELECT s.name, c.title
FROM students AS s
JOIN courses AS c ON s.course_id = c.id
WHERE c.title = 'Анализ данных';
| name | title |
|---|---|
| Дилноза | Анализ данных |
| Сардор | Анализ данных |
| Гульнора | Анализ данных |
s и c — короткие имена таблиц. ON s.course_id = c.id — условие связи: в пары объединяются строки, где course_id ученика равен id курса. s.name и c.title показывают, из какой таблицы взят столбец.
Если объединить JOIN, GROUP BY и агрегаты, получится настоящий отчёт:
SELECT c.title,
COUNT(*) AS students_cnt,
ROUND(AVG(s.score), 1) AS avg_score
FROM students AS s
JOIN courses AS c ON s.course_id = c.id
GROUP BY c.title
ORDER BY students_cnt DESC, c.title;
| title | students_cnt | avg_score |
|---|---|---|
| Анализ данных | 3 | 77.0 |
| Английский язык | 2 | 92.0 |
| Компьютерная грамотность | 2 | 78.0 |
| Мобилография | 1 | 70.0 |
Обратите внимание на строку «Английский язык»: учеников двое, а средний балл — это балл одной Малики, потому что у Бекзода NULL. В настоящем отчёте такое нельзя оставлять без пояснения.
Обычный JOIN (полное название — INNER JOIN) возвращает только строки, у которых есть пара в обеих таблицах. Чтобы увидеть и курсы без учеников, используют LEFT JOIN — это тема следующего шага.
Частые ошибки
- Проверка через
= NULL.WHERE score = NULLне вернёт ни одной строки, потому чтоNULLозначает «неизвестно» и не равен ничему, даже самому себе. Правильно:WHERE score IS NULLилиWHERE score IS NOT NULL. В нашей таблице первый вариант вернёт Бекзода. - Путаница с кавычками. Текст пишется в одинарных кавычках:
'Ташкент'. Двойные кавычки ("...") по стандарту предназначены для имён таблиц и столбцов. - Апостроф в узбекской латинице. Если данные хранятся латиницей, запрос
'Qo'qon'сломается: SQL решит, что текст закончился на «Qo», и выдаст ошибку. Апостроф внутри текста пишут дважды:'Qo''qon'. То же касается имён вроде O’g’iloy или Sa’dulla. - Регистр букв. В SQLite запрос
WHERE city = 'ташкент'ничего не найдёт, потому что в базе «Ташкент» записан с заглавной буквы. АLIKEв одних системах различает регистр, в других — нет. - DELETE или UPDATE без WHERE.
DELETE FROM students;удалит все строки таблицы, аUPDATE students SET score = 0;обнулит баллы у всех. Система не спросит «Вы уверены?». Безопасный порядок: сначала напишитеSELECTс тем же условием и посмотрите, какие строки изменятся, затем замените его наDELETE. Перед работой с важной базой сделайте резервную копию. В DB Browser кнопка Revert Changes отменит незаписанные изменения, но на рабочем сервере такой кнопки может не быть. - Порядок команд. Порядок записи строгий:
SELECT,FROM,JOIN,WHERE,GROUP BY,HAVING,ORDER BY,LIMIT. Если написатьWHEREпослеGROUP BY, будет ошибка. - Игнорирование сообщения об ошибке. «no such column» или «syntax error» указывают на место проблемы: чаще всего это опечатка в имени, лишняя запятая или незакрытая кавычка.
Практическое задание и чек-лист
В базе, созданной скриптом выше, напишите следующие запросы сами. Сначала предположите результат, затем выполните запрос и сравните.
- Имена и возраст учеников из Самарканда.
- Ученики в возрасте от 18 до 25 лет, по возрастанию возраста.
- Количество учеников с баллом выше 80.
- Название каждого курса и наивысший балл в нём (
JOIN,GROUP BY,MAX). - Ученик без балла и название его курса.
- Посложнее: добавьте в таблицу
coursesновый курс (INSERT INTO), затем почитайте оLEFT JOINи составьте запрос, который покажет и курсы без учеников.
Ответы для проверки: 1) Жасур 24, Гульнора 35; 2) Дилноза 19, Отабек 20, Нодира 22, Жасур 24; 3) 3; 4) Анализ данных 88, Английский язык 92, Компьютерная грамотность 81, Мобилография 70; 5) Бекзод, Английский язык.
Затем переходите к своим данным: например, загрузите через CSV в SQLite список книг домашней библиотеки или часов тренировок в спортивной секции и пишите запросы к ним.
Чек-лист перед запуском запроса
- Нужные столбцы указаны явно,
SELECT *— только для проверки. - Текст в одинарных кавычках, апостроф внутри удвоен.
NULLпроверяется только черезIS NULLилиIS NOT NULL.- Если
ANDиORиспользуются вместе, стоят скобки. - Если важен порядок, указан
ORDER BY. - При
GROUP BYвSELECTтолько сгруппированные столбцы и агрегаты. - Перед
DELETEиUPDATEвыполненSELECTс тем же условием и сделана резервная копия. - Результат правдоподобен: число строк и значения в ожидаемых пределах.
Запрос в несколько строк может заменить долгую ручную работу в Excel. Если практиковаться по 15–20 минут в день, основные команды быстро войдут в привычку.
Если хотите системно освоить SQL, Excel и анализ данных с преподавателем, познакомьтесь с бесплатной программой по анализу данных и другими учебными программами нашей ассоциации. Когда будете готовы, оставьте заявку — наши специалисты свяжутся с вами.