Определения понятий реляционной модели. Табличное представление данных. Введение в язык SQL
- О чём это занятие
- Первое настоящее погружение в SQL: четыре «глагола» работы с таблицами, анатомия запроса SELECT–FROM–WHERE, предикаты LIKE, IN и BETWEEN, группировка GROUP BY с агрегатными функциями — на учебной базе Нью-Йорка и живых примерах из данных по Нижнему Новгороду.
- Аннотация
- Занятие начинается с повторения: SQL — полный язык, расширяющий реляционную алгебру операторами описания данных и администрирования, а вся работа с таблицами сводится к четырём глаголам SELECT, INSERT, UPDATE и DELETE. Дальше разбирается конструкция WHERE на примере таблицы населения районов Нижнего Новгорода и предикаты фильтрации — сравнения, LIKE, IN, BETWEEN, — которые закрепляются тренажёром-сопоставлением. Практическая часть переносит нас в учебную базу Нью-Йорка: пошаговая сборка запроса «районы Бруклина», подсчёт записей и улиц на букву B. Ключевая тема занятия — группировка: оператор GROUP BY объясняется на игрушечной таблице товаров с прослеживанием каждой строки до своей группы, вводится таблица агрегатных функций, а затем группировка применяется к настоящим вопросам — сколько районов в каждом округе, каково население города, каков процент белого населения. Все запросы можно выполнять в песочнице прямо на странице. Завершает занятие подключение QGIS к базе и плагин DB Manager.
- Пререквизиты
- Практика 1 — установленное окружение и первая таблица; теория отношения — лекция 2.
- Материалы к занятию
- Данные учебной базы: архив данных (SQL-файлы переносятся в Query Tool и выполняются — как в практике 4).
1. SQL: полный язык и четыре глагола
SQL (Structured Query Language) — язык программирования, основанный на реляционной модели данных. SQL расширяет идеи реляционной алгебры, предоставляя более широкий спектр возможностей для работы с данными. Реляционная алгебра — математический аппарат операций с отношениями: выборка, проекция, соединение, пересечение и другие операции над множествами данных (см. лекцию 2).
Язык SQL отличается от реляционной алгебры, в которой есть лишь операции запросов, тем, что он считается полным языком: помимо операций запросов у него имеются операторы, соответствующие DDL (Data Definition Language — языку описания данных), и операторы административного управления базами данных.
Вся работа с содержимым таблиц сводится к четырём глаголам:
| Оператор | Действие |
|---|---|
| SELECT | возвращает строки в ответ на запрос |
| INSERT | добавляет новые строки в таблицу |
| UPDATE | изменяет существующие строки |
| DELETE | удаляет строки из таблицы |
1.1. Конструкция WHERE
Скелет запроса: SELECT столбцы FROM имя_таблицы WHERE условия.
Разберём на живом примере — таблице населения районов Нижнего Новгорода:
| name_municip | all | male | female | male_perc | fem_perc |
|---|---|---|---|---|---|
| Автозаводский район | 294 591 | 130 901 | 163 690 | 44 | 56 |
| Канавинский район | 147 717 | 65 357 | 82 360 | 44 | 56 |
| Ленинский район | 131 741 | 57 601 | 74 140 | 44 | 56 |
| Московский район | 114 511 | 49 625 | 64 886 | 43 | 57 |
| Нижегородский район | 130 124 | 56 507 | 73 617 | 43 | 57 |
| Приокский район | 102 652 | 44 985 | 57 667 | 44 | 56 |
Запрос «районы с населением больше 130 тысяч» собирается из трёх частей: SELECT name_municip (что показать) FROM population (откуда) WHERE "all" > 130000 (какие строки пропустить в результат). Попробуйте его в песочнице раздела 4.
1.2. Тренажёр: соедините предикат с условием
Слева — предикаты оператора WHERE, справа — обрывки условий. Щёлкните предикат, затем подходящее ему условие. Тренажёр не отпустит, пока все четыре пары не сойдутся.
2. Загрузка и описание данных
Откройте pgAdmin 4 и раскройте свою базу данных (ЛКМ по стрелочке рядом), затем раскройте Schemas, найдите Tables и откройте инструмент запросов: ПКМ по Tables → Query Tool. Данные учебной базы загружаются переносом SQL-файлов в окно Query Tool с последующим выполнением.
Мы работаем с четырьмя таблицами учебной базы Нью-Йорка (полные описания — в практике 3):
- nyc_census_blocks — блоки переписи: blkid, popn_total, popn_white, popn_black, popn_nativ, popn_asian, popn_other, boroname, geom;
- nyc_neighborhoods — районы: name (уникальный идентификатор), boroname, geom;
- nyc_streets — улицы: name, oneway, type, geom;
- nyc_subway_stations — станции метро: name, borough, routes, transfers, express, geom.
3. Собираем запросы
Какие районы входят в состав Бруклина? Пошаговая сборка:
- Определяем таблицу: сведения о районах лежат в nyc_neighborhoods —
FROM nyc_neighborhoods; - Определяем столбцы: нужны только названия —
SELECT name; - Определяем условие: округ Бруклин —
WHERE boroname = 'Brooklyn'.
SELECT name FROM nyc_neighborhoods WHERE boroname = 'Brooklyn';
Сколько записей в таблице nyc_streets? Полезные функции агрегации: avg() — среднее значение, sum() — сумма значений, count() — количество записей в наборе.
показать решение
SELECT count(*) FROM nyc_streets;
Ответ на полной базе: 19 091.
Сколько улиц в Нью-Йорке начинается на букву 'B'?
показать решение
SELECT count(*) FROM nyc_streets WHERE name LIKE 'B%';
Ответ на полной базе: 1282.
4. Оператор GROUP BY
Группировка данных позволяет объединить одинаковые значения в заданных полях в группы, а затем выполнять подсчёты для каждой группы. Для группировки существует специальный оператор GROUP BY:
SELECT столбцы FROM имя_таблицы WHERE условия GROUP BY столбцы;
Проследим механику на таблице «Товары»:
| ID | Категория | Цена |
|---|---|---|
| 1 | А | 3 |
| 2 | В | 5 |
| 3 | А | 6 |
| 4 | А | 1 |
| 5 | В | 3 |
| 6 | А | 4 |
GROUP BY Категория раскладывает шесть строк на две стопки: в стопку «А»
попадают цены 3, 6, 1 и 4, в стопку «В» — 5 и 3. Агрегатная функция затем сворачивает
каждую стопку в одно число: SELECT Категория, SUM(Цена) … GROUP BY Категория
даёт А → 14 и В → 8. Доступные агрегаты:
| Функция | Описание |
|---|---|
| SUM(поле) | возвращает сумму значений |
| AVG(поле) | возвращает среднее значение |
| COUNT(поле) | возвращает количество записей |
| MIN(поле) | возвращает минимальное значение |
| MAX(поле) | возвращает максимальное значение |
Сколько «районов» в каждом округе?
показать решение
SELECT boroname, count(*) FROM nyc_neighborhoods GROUP BY boroname;
На полной базе: Queens — 30, Brooklyn — 23, Staten Island — 24, The Bronx — 24, Manhattan — 28.
Каково население города Нью-Йорка?
показать решение
SELECT sum(popn_total) FROM nyc_census_blocks;
Ответ на полной базе: 8 175 032.
Каков процент белого населения в каждом округе?
показать решение
SELECT boroname, 100 * sum(popn_white) / sum(popn_total) AS white_pct FROM nyc_census_blocks GROUP BY boroname;
Проценты считаются от сумм по округу, а не усреднением процентов блоков — блоки разного размера. Ответы на полной базе — в практике 3 (от 27,9 % в Бронксе до 72,9 % на Статен-Айленде).
4.1. Песочница
В песочнице три таблицы: «Товары» из примера, население районов Нижнего Новгорода и фрагмент nyc_neighborhoods. Все запросы раздела работают здесь без изменений (числа отличаются от полной базы — фрагмент).
Товары(ID, Категория, Цена) ·
population(name_municip, all_pop, male, female) ·
nyc_neighborhoods(name, boroname) — фрагмент
5. QGIS: подключение и DB Manager
Если всё настроено верно, QGIS должен «увидеть» в системе БД. Для проверки подключитесь, добавив пустой слой из БД: Слой → Добавить слой → Добавить слой PostGIS. Во всплывающем окне «создайте» подключение, заполните параметры, разрешите сохранение и загрузку данных, введите имя пользователя и пароль. Поскольку геометрических данных может не быть, поставьте галочку «Показать таблицы без геометрии».
Плагин DB Manager — удобный инструмент для работы с пространственными базами данных в QGIS: PostGIS, SpatiaLite, GeoPackage и Oracle Spatial в одном интерфейсе, импорт слоёв перетаскиванием, перемещение таблиц между базами. Установка: вкладка «Модули» → «Управление модулями» → найти плагин поиском → установить (активировать).
Контрольные вопросы
-
Реляционная алгебра содержит только операции запросов. SQL, помимо запросов, включает операторы DDL (описание структуры данных: CREATE, ALTER, DROP) и операторы административного управления базами данных — поэтому он покрывает весь жизненный цикл базы.
-
SELECT — возвращает строки по запросу; INSERT — добавляет новые строки; UPDATE — изменяет существующие; DELETE — удаляет строки из таблицы.
-
LIKE — шаблон строки ('J%' — начинается с J); IN — вхождение в список (('sales', 'marketing')); BETWEEN — диапазон (16385 AND 16390); операторы сравнения =, <, >, <=, >= — сопоставление с числом или значением (например, = 44).
-
GROUP BY раскладывает строки на группы по одинаковым значениям указанного столбца: шесть товаров → стопка «А» (цены 3, 6, 1, 4) и стопка «В» (5, 3). Агрегатная функция сворачивает каждую группу в одно значение: SUM даёт А → 14, В → 8. В SELECT при группировке допустимы только группирующие столбцы и агрегаты.
-
Блоки переписи имеют разное население: маленький блок с необычным составом весил бы столько же, сколько огромный. Корректно делить суммы: 100 · sum(popn_white) / sum(popn_total) по каждой группе GROUP BY boroname.
-
SUM (сумма), AVG (среднее), COUNT (количество записей), MIN (минимум), MAX (максимум). Применяются в списке SELECT при группировке GROUP BY или ко всей таблице без группировки.
Источники
- PostgreSQL 15 Documentation. Queries : [сайт]. — URL: https://www.postgresql.org/docs/15/queries.html (дата обращения: 18.08.2026).
- Introduction to PostGIS — PostGIS Workshop : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/ (дата обращения: 18.08.2026).
- Бьюли, А. Изучаем SQL / А. Бьюли. — СПб. : Символ-Плюс, 2007. — 312 с.