Практики · занятие 2

Определения понятий реляционной модели. Табличное представление данных. Введение в язык 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_municipallmalefemalemale_percfem_perc
Автозаводский район294 591130 901163 6904456
Канавинский район147 71765 35782 3604456
Ленинский район131 74157 60174 1404456
Московский район114 51149 62564 8864357
Нижегородский район130 12456 50773 6174357
Приокский район102 65244 98557 6674456

Запрос «районы с населением больше 130 тысяч» собирается из трёх частей: SELECT name_municip (что показать) FROM population (откуда) WHERE "all" > 130000 (какие строки пропустить в результат). Попробуйте его в песочнице раздела 4.

1.2. Тренажёр: соедините предикат с условием

Слева — предикаты оператора WHERE, справа — обрывки условий. Щёлкните предикат, затем подходящее ему условие. Тренажёр не отпустит, пока все четыре пары не сойдутся.

Тренажёр: предикат ↔ условие
Предикат
Условие

2. Загрузка и описание данных

Откройте pgAdmin 4 и раскройте свою базу данных (ЛКМ по стрелочке рядом), затем раскройте Schemas, найдите Tables и откройте инструмент запросов: ПКМ по Tables → Query Tool. Данные учебной базы загружаются переносом SQL-файлов в окно Query Tool с последующим выполнением.

Загрузка SQL-файлов данных

Мы работаем с четырьмя таблицами учебной базы Нью-Йорка (полные описания — в практике 3):

3. Собираем запросы

Какие районы входят в состав Бруклина? Пошаговая сборка:

  1. Определяем таблицу: сведения о районах лежат в nyc_neighborhoods — FROM nyc_neighborhoods;
  2. Определяем столбцы: нужны только названия — SELECT name;
  3. Определяем условие: округ Бруклин — 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. Все запросы раздела работают здесь без изменений (числа отличаются от полной базы — фрагмент).

SQL-песочница · Товары, population, nyc_neighborhoods
Схема: Товары(ID, Категория, Цена) · population(name_municip, all_pop, male, female) · nyc_neighborhoods(name, boroname) — фрагмент

5. QGIS: подключение и DB Manager

Если всё настроено верно, QGIS должен «увидеть» в системе БД. Для проверки подключитесь, добавив пустой слой из БД: Слой → Добавить слой → Добавить слой PostGIS. Во всплывающем окне «создайте» подключение, заполните параметры, разрешите сохранение и загрузку данных, введите имя пользователя и пароль. Поскольку геометрических данных может не быть, поставьте галочку «Показать таблицы без геометрии».

Параметры подключения QGIS к базе

Плагин DB Manager — удобный инструмент для работы с пространственными базами данных в QGIS: PostGIS, SpatiaLite, GeoPackage и Oracle Spatial в одном интерфейсе, импорт слоёв перетаскиванием, перемещение таблиц между базами. Установка: вкладка «Модули» → «Управление модулями» → найти плагин поиском → установить (активировать).

Плагин DB Manager

Контрольные вопросы

Источники

  1. PostgreSQL 15 Documentation. Queries : [сайт]. — URL: https://www.postgresql.org/docs/15/queries.html (дата обращения: 18.08.2026).
  2. Introduction to PostGIS — PostGIS Workshop : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/ (дата обращения: 18.08.2026).
  3. Бьюли, А. Изучаем SQL / А. Бьюли. — СПб. : Символ-Плюс, 2007. — 312 с.