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

Создание пространственной базы данных

О чём это занятие
Первое знакомство с PostgreSQL и PostGIS на практике: подключение сервера в pgAdmin, создание базы данных, активация пространственного расширения, восстановление учебной базы Нью-Йорка из резервной копии и первые SELECT-запросы к её таблицам.
Аннотация
Занятие начинается с настройки рабочего окружения: инструменты администрирования psql и pgAdmin, регистрация сервера, создание базы данных и активация расширения PostGIS с проверкой через postgis_full_version(). Затем из архива восстанавливается учебная база nyc_data с пятью наборами данных о Нью-Йорке: блоки переписи, районы, улицы, станции метро и социодемографическая таблица — для каждого описаны структура и количество записей. Вторая половина занятия — язык SQL в работе: четыре «глагола» SELECT, INSERT, UPDATE, DELETE, устройство запроса SELECT с условиями WHERE, функциями и агрегатами, группировка GROUP BY. Все учебные запросы можно выполнить прямо на странице — в SQL-песочнице с фрагментом таблиц базы. Завершают занятие шесть заданий с проверкой ответов.
Пререквизиты
Установленные PostgreSQL и PostGIS — по инструкции из раздела РГР. Теория реляционной модели — лекция 2.
Материалы к занятию

1. Подготовка к работе

PostgreSQL предоставляет несколько инструментов для администрирования. Основной — psql: командная строка, через которую выполняются SQL-запросы. Она предназначена для ввода команд вручную и позволяет выполнять любые операции с базой данных, включая создание, изменение и удаление данных и объектов базы.

Помимо psql, широкое распространение получил графический интерфейс pgAdmin — бесплатный и открытый инструмент для работы с базами данных PostgreSQL в наглядной форме. В pgAdmin все те же команды и запросы доступны через удобный графический интерфейс, что делает его предпочтительным для пользователей, предпочитающих визуальные средства управления. На практике мы будем использовать именно pgAdmin.

Чтобы начать работу, выполните следующие шаги:

  1. Откройте pgAdmin, найдя его в меню «Пуск».
  2. При первом запуске, если во вкладке Servers нет ни одной записи (см. рисунок ниже), добавьте сервер вручную.
Вкладка Servers в pgAdmin без серверов
  1. Нажмите правой кнопкой мыши (ПКМ) на Servers и выберите опцию Create → Server (в некоторых версиях — Register → Server).
  2. В открывшемся окне введите название сервера, например Postgres, в поле Name.

После этого настройте подключение к серверу базы данных:

  1. Перейдите во вкладку Connection.
  2. В поле Host name/address введите localhost, если вы работаете на локальном компьютере, либо адрес сервера, если база данных находится удалённо.
  3. Поле Port оставьте по умолчанию — 5432.
  4. В поле Username введите postgres, если используете стандартного администратора базы данных.
  5. В поле Password укажите пароль, установленный при установке PostgreSQL.
Настройка подключения к серверу

После настройки подключения нажмите Save — сервер добавится в список. Теперь можно работать с базой данных через pgAdmin: создавать, изменять и просматривать данные, выполнять SQL-запросы.

1.1. Создание базы данных

Чтобы создать базу данных, достаточно нажать ПКМ по названию сервера в pgAdmin:

  1. Выберите опцию Create → Database.
Создание базы данных в pgAdmin
  1. В открывшемся окне задайте имя базы данных, например Tests.
  2. В поле Owner укажите владельца базы данных (по умолчанию — пользователь postgres, если другого владельца не назначали).
Задание имени и владельца базы данных

1.2. Активация расширения PostGIS

После создания базы данных необходимо активировать расширение PostGIS — изначально оно недоступно и требует ручной активации:

  1. Раскройте список баз данных, нажав на имя сервера, затем выберите вашу базу (например, Tests).
  2. Перейдите в раздел Extensions.
Раздел Extensions базы данных
  1. Нажмите ПКМ по Extensions и выберите Create → Extension.
  2. В новом окне в поле Name выберите «postgis» из списка доступных расширений.
  3. Нажмите Save для активации расширения.
Выбор расширения PostGIS

Теперь расширение PostGIS активировано, и вы можете работать с пространственными данными, используя все его функции.

Для проверки, что расширение успешно активировано, выполните следующие шаги:

  1. Выберите БД, щёлкнув по ней (она выделится голубым цветом).
  2. Перейдите в меню Tools и выберите Query Tool.
Открытие Query Tool
  1. В открывшемся окне введите SQL-запрос:
SELECT postgis_full_version();
Результат postgis_full_version()
Типичная ошибка Создать расширение в одной базе и искать его функции в другой. PostGIS активируется для конкретной базы данных, а не для всего сервера: в каждой новой базе расширение включается заново.

2. Загрузка готовой БД

Чтобы загрузить готовую базу данных из архива и восстановить её в PostgreSQL через pgAdmin, выполните следующие шаги:

  1. Разархивируйте файл Данные_на_практику.rar. Внутри вы найдёте файл резервной копии базы данных nyc_data.backup.
  2. Создайте новую базу данных для восстановления: ПКМ на сервере, Create → Database, имя — например, nyc_data — и владелец.
  3. Выполните восстановление резервной копии: ПКМ на созданной базе nyc_data → Restore.
  4. В окне восстановления в поле Filename укажите путь к файлу nyc_data.backup (или найдите его кнопкой выбора файла); остальные настройки оставьте по умолчанию и нажмите Restore.
  5. После завершения процесса база данных готова к использованию.

3. Описание данных

Данные практикума включают четыре шейп-файла для города Нью-Йорк и одну атрибутивную таблицу с социодемографическими переменными. Шейп-файлы загружены как таблицы PostGIS; социодемографические данные мы присоединим позже. Эти данные и их взаимосвязи важны для последующего анализа.

Для изучения структуры таблиц в pgAdmin нажмите ПКМ на выбранной таблице и выберите Properties: краткое описание свойств таблицы, включая список атрибутов, находится в разделе Columns.

3.1. Таблица nyc_census_blocks

Блок переписи населения — самая мелкая географическая единица, для которой собираются данные переписи. Все более крупные единицы (группы блоков, тракты, метрополии, округа) могут быть сформированы объединением блоков. К блокам прикреплены демографические данные. Количество записей: 38 794.

Блоки переписи Нью-Йорка
АтрибутОписание
blkidуникальный 15-значный код блока переписи (например, 360050001009000)
popn_totalобщее количество людей в блоке переписи
popn_whiteколичество людей, идентифицирующих себя как «белые»
popn_blackколичество людей, идентифицирующих себя как «темнокожие»
popn_nativколичество людей, идентифицирующих себя как «коренные американцы»
popn_asianколичество людей, идентифицирующих себя как «азиаты»
popn_otherколичество людей, относящихся к другим категориям
boronameназвание района Нью-Йорка (Манхэттен, Бронкс, Бруклин, Статен-Айленд, Куинс)
geomполигональная граница блока

3.2. Таблица nyc_neighborhoods

Нью-Йорк имеет богатую историю районных названий и границ. Районы — социальные конструкции, не всегда совпадающие с административными границами. Количество записей: 129.

Районы Нью-Йорка
АтрибутОписание
nameназвание района
boronameназвание округа Нью-Йорка
geomполигональная граница района

3.3. Таблица nyc_streets

Центральные линии улиц формируют транспортную сеть города. Улицы классифицированы по типам, чтобы различать, например, аллеи, магистрали и пешеходные улицы. Количество записей: 19 091.

Улицы Нью-Йорка
АтрибутОписание
nameназвание улицы
onewayявляется ли улица односторонней («yes» = да, «» = нет)
typeтип дороги (primary, secondary, residential, motorway)
geomцентральная линия улицы

3.4. Таблица nyc_subway_stations

Станции метро соединяют поверхностный мир с подземной сетью метро. Расположение станций определяет доступность для разных категорий населения. Количество записей: 491.

Станции метро Нью-Йорка
АтрибутОписание
nameназвание станции
boroughназвание округа Нью-Йорка
routesлинии метро, проходящие через станцию
transfersлинии, на которые можно пересесть на этой станции
expressявляется ли станция остановкой экспресс-поездов («express» = да, «» = нет)
geomточечное местоположение станции

3.5. Таблица nyc_census_sociodata

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

АтрибутОписание
tractidуникальный 11-значный код переписного участка
transit_totalобщее количество работников в участке
transit_privateколичество работников, использующих частный транспорт
transit_publicколичество работников, использующих общественный транспорт
transit_walkколичество работников, ходящих пешком
transit_otherколичество работников, использующих другие виды транспорта
transit_noneколичество работников, работающих из дома
transit_time_minsобщее количество минут, проведённых в пути
family_countколичество семей в участке
family_income_medianмедианный доход семьи
family_income_meanсредний доход семьи
edu_totalобщее количество людей с образовательной историей
edu_no_highschool_diplколичество людей без диплома средней школы
edu_highschool_diplколичество людей с дипломом средней школы
edu_college_diplколичество людей с дипломом колледжа
edu_graduate_diplколичество людей с дипломом магистра

4. Простые запросы на SQL

SQL, язык структурированных запросов, используется для работы с реляционными базами данных: он позволяет задавать вопросы к данным и обновлять их. Теперь, когда данные загружены в базу, используем SQL для извлечения информации.

Например, задайтесь вопросом:

Вопрос

Как вывести названия всех районов Нью-Йорка?

показать запрос
SELECT name FROM nyc_neighborhoods;

Чтобы выполнить этот запрос, откройте SQL-окно запросов в pgAdmin кнопкой Query Tool и нажмите «Выполнить запрос» (зелёный треугольник). Запрос вернёт 129 результатов — все районы Нью-Йорка.

Но что произошло на самом деле? Для понимания рассмотрим четыре основных «глагола» SQL:

В рамках курса мы будем работать преимущественно с SELECT, чтобы формулировать запросы к таблицам.

4.1. Запросы SELECT

Запрос типа SELECT обычно имеет следующую структуру:

Структура запроса

SELECT столбцы FROM таблица WHERE условие;

Вопрос

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

показать запрос
SELECT name
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';

Запрос вернёт 23 результата.

Иногда нужно применить функцию к результатам запроса.

Вопрос

Сколько букв в названиях всех районов Бруклина?

показать запрос
SELECT char_length(name)
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';

PostgreSQL имеет встроенную функцию для длины строк — char_length(string).

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

Вопрос

Какова средняя длина названий районов Бруклина и её стандартное отклонение?

показать запрос
SELECT avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
avgstddev
11.743.91

4.2. Группировка результатов с помощью GROUP BY

Иногда нужно агрегировать данные по группам — для этого используется оператор GROUP BY.

Вопрос

Какова средняя длина названий районов Нью-Йорка, распределённая по округам?

показать запрос
SELECT boroname, avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
GROUP BY boroname;
boronameavgstddev
Brooklyn11.743.91
Manhattan11.824.31
The Bronx12.043.67
Queens11.675.01
Staten Island12.295.20

5. SQL-песочница

Все конструкции раздела 4 можно попробовать, не отходя от конспекта. В песочницу загружен фрагмент учебной базы: 15 районов из nyc_neighborhoods и 12 улиц из nyc_streets (полные таблицы — 129 и 19 091 запись, поэтому численные ответы здесь отличаются от pgAdmin). Поддерживаются SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, DISTINCT, JOIN и агрегаты count / sum / avg / min / max / stddev.

SQL-песочница · фрагмент базы nyc
Схема: nyc_neighborhoods(name, boroname) · nyc_streets(name, oneway, type, length_m) · данные — иллюстративный фрагмент учебной базы

6. Задание на практику

Задания выполняются в pgAdmin на полной базе nyc_data. Таблица nyc_census_blocks была дополнена атрибутами жилья:

Дополненная таблица nyc_census_blocks

Определение таблицы nyc_census_blocks:

Полезные агрегатные функции SQL: avg() — среднее значение, sum() — сумма значений, count() — количество записей в наборе.

Задание 1

Сколько записей в таблице nyc_streets?

показать ответ

19091

Задание 2

Сколько улиц в Нью-Йорке начинается на букву 'B'?

показать ответ

1282

Задание 3

Каково население города Нью-Йорка?

показать ответ

8 175 032

Задание 4

Каково население Бронкса?

показать ответ

1 385 108

Задание 5

Сколько «районов» в каждом округе?

показать ответ
boronamecount
Queens30
Brooklyn23
Staten Island24
The Bronx24
Manhattan28
Задание 6

Каков процент белого населения в каждом округе?

показать ответ
boronamewhite_pct
Brooklyn42.80%
Manhattan57.45%
The Bronx27.90%
Queens39.72%
Staten Island72.89%

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

Источники

  1. Introduction to PostGIS — PostGIS Workshop : [сайт]. — URL: https://postgis.net/workshops/postgis-intro/ (дата обращения: 18.08.2026).
  2. PostgreSQL 15 Documentation : [сайт]. — URL: https://www.postgresql.org/docs/15/ (дата обращения: 18.08.2026).
  3. pgAdmin 4 Documentation : [сайт]. — URL: https://www.pgadmin.org/docs/ (дата обращения: 18.08.2026).