Учебник PostgreSQL для начинающих
Курс PostgreSQL для тех, кто уже владеет базовым SQL и хочет работать именно с PostgreSQL — одной из самых мощных СУБД с открытым кодом. Разберём её типы данных и автонумерацию, ограничения целостности и связи таблиц, выборку данных с JOIN и оконными функциями, изменение данных с RETURNING и UPSERT, транзакции и ACID, индексы и анализ запросов, а также продвинутые темы: JSONB, представления, функции на PL/pgSQL, роли и резервные копии. Переносимые примеры можно сразу запускать в живой SQL-песочнице, а PostgreSQL-специфику мы разбираем отдельно и помечаем.
Курс «PostgreSQL» состоит из 10 разделов и 40 уроков: Введение в PostgreSQL, Типы данных PostgreSQL, Таблицы, ограничения и схема, Запросы и выборка данных, Изменение данных и производительность, Продвинутое и эксплуатация, Индексы и оптимизация запросов, JSONB, массивы и полнотекстовый поиск, MVCC, VACUUM и обслуживание и Масштабирование, репликация и эксплуатация. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в PostgreSQL
- Что такое PostgreSQL и чем он выделяется
PostgreSQL — мощная объектно-реляционная СУБД с открытым кодом. Разбираем её сильные стороны: надёжность, расширяемость, стандарты SQL и работу с JSON.
- Установка и подключение к базе
Как установить PostgreSQL на разных системах, что такое сервер, кластер и роль, и как подключиться к базе через psql и строку подключения.
- psql и мета-команды
Учимся работать в psql: мета-команды с обратным слешем (\l, \dt, \d, \q), просмотр таблиц и структуры, выполнение SQL-файлов.
- Создание базы, таблицы и GUI-клиенты
Создаём первую базу данных и таблицу, наполняем её данными и делаем выборку. Обзор графических клиентов pgAdmin и DBeaver.
- Что такое PostgreSQL и чем он выделяется
2 Типы данных PostgreSQL
- Числовые типы: integer, bigint, numeric
Целые и дробные числа в PostgreSQL: smallint, integer, bigint, numeric и real. Когда нужна точность numeric, а когда хватит integer.
- Автонумерация: serial и identity
Как PostgreSQL автоматически нумерует строки: типы serial и bigserial, современный GENERATED AS IDENTITY и последовательности (sequence).
- Текст и даты: varchar, text, timestamp, interval
Строковые типы varchar и text, типы даты и времени date, timestamp, timestamptz и interval. Как PostgreSQL хранит и сравнивает время.
- Булев, спецтипы и приведение типов
Логический тип boolean, специальные типы uuid, json/jsonb и массивы, а также приведение типов через CAST и оператор :: в PostgreSQL.
- Числовые типы: integer, bigint, numeric
3 Таблицы, ограничения и схема
- CREATE TABLE подробно
Разбираем команду CREATE TABLE в PostgreSQL: объявление столбцов, значения по умолчанию, временные таблицы и удаление таблиц через DROP.
- Ограничения целостности
Ограничения PostgreSQL: PRIMARY KEY, UNIQUE, NOT NULL, CHECK и DEFAULT. Как база сама защищает данные от некорректных значений.
- Внешние ключи и связи таблиц
Связываем таблицы через FOREIGN KEY. Действия ON DELETE и ON UPDATE: CASCADE, RESTRICT, SET NULL. Как поддерживать ссылочную целостность.
- ALTER TABLE и нормализация
Изменяем существующие таблицы командой ALTER TABLE: добавление и удаление столбцов, ограничений. Кратко о нормализации и разбиении данных.
- CREATE TABLE подробно
4 Запросы и выборка данных
- SELECT, WHERE, ORDER BY, LIMIT
Основы выборки данных: SELECT с фильтрацией WHERE, сортировка ORDER BY, ограничение LIMIT и OFFSET. Практика в живой SQL-песочнице.
- Соединения таблиц: JOIN
Все виды JOIN в SQL: INNER, LEFT, RIGHT и FULL. Как соединять таблицы по ключу и что происходит с несовпавшими строками. Практика в песочнице.
- Агрегаты, GROUP BY и HAVING
Агрегатные функции COUNT, SUM, AVG, MIN, MAX. Группировка строк через GROUP BY и фильтрация групп через HAVING. Практика в песочнице.
- Подзапросы, CTE и оконные функции
Вложенные подзапросы, общие табличные выражения WITH (CTE) для читаемости и оконные функции PostgreSQL: ROW_NUMBER, RANK, SUM OVER.
- SELECT, WHERE, ORDER BY, LIMIT
5 Изменение данных и производительность
- INSERT, UPDATE, DELETE и RETURNING
Изменение данных в PostgreSQL: вставка INSERT, обновление UPDATE, удаление DELETE и фирменное предложение RETURNING для получения изменённых строк.
- UPSERT через ON CONFLICT
UPSERT в PostgreSQL: команда INSERT ... ON CONFLICT DO UPDATE/DO NOTHING. Как вставить строку или обновить существующую одним запросом.
- Транзакции и ACID
Транзакции PostgreSQL: BEGIN, COMMIT, ROLLBACK и принципы ACID. Как несколько операций выполняются как единое целое и откатываются при сбое.
- Индексы, EXPLAIN и VACUUM
Зачем нужны индексы в PostgreSQL: B-tree, частичные индексы, ускорение поиска. Анализ запросов через EXPLAIN ANALYZE и кратко о VACUUM.
- INSERT, UPDATE, DELETE и RETURNING
6 Продвинутое и эксплуатация
- Работа с JSONB
JSONB в PostgreSQL: хранение документов, операторы -> и ->>, запросы по содержимому, оператор @> и индексы GIN для быстрого поиска.
- Представления (VIEW)
Представления в PostgreSQL: обычные VIEW как сохранённые запросы и материализованные представления MATERIALIZED VIEW для кеширования тяжёлых вычислений.
- Функции и PL/pgSQL
Пользовательские функции в PostgreSQL: SQL-функции и процедурный язык PL/pgSQL с переменными, условиями и циклами. Обзор триггеров.
- Роли, права и резервные копии
Управление доступом в PostgreSQL: роли и команда GRANT. Резервное копирование через pg_dump и восстановление pg_restore. Что изучать дальше.
- Работа с JSONB
7 Индексы и оптимизация запросов
- Типы индексов: B-tree, Hash, GiN, GiST, BRIN
Когда какой индекс в PostgreSQL: B-tree по умолчанию для сравнений и сортировки, GIN для массивов, JSONB и полнотекста, GiST для геометрии и диапазонов, BRIN для огромных отсортированных таблиц, Hash для равенства.
- EXPLAIN и EXPLAIN ANALYZE: читаем план
Как читать план запроса в PostgreSQL: узлы Seq Scan, Index Scan, Bitmap Scan, поля cost, rows и width, разница EXPLAIN и EXPLAIN ANALYZE, actual time, BUFFERS и что значит «дорого».
- Стратегия индексирования: составные, частичные, по выражению
Проектирование индексов в PostgreSQL: порядок столбцов в составном индексе, частичный индекс с WHERE, индекс по выражению, покрывающий индекс с INCLUDE и Index Only Scan для covered-запросов.
- Почему индекс не используется
Частые причины, по которым PostgreSQL не использует индекс: функция на столбце, неявные касты типов, низкая селективность, устаревшая статистика без ANALYZE, LIKE с ведущим процентом и условия с OR.
- Типы индексов: B-tree, Hash, GiN, GiST, BRIN
8 JSONB, массивы и полнотекстовый поиск
- JSONB: хранение и доступ
Тип jsonb в PostgreSQL: чем json отличается от jsonb, операторы -> ->> #>, извлечение и вложенность полей, и когда JSONB лучше обычных колонок.
- Запросы и индексы по JSONB
Поиск по JSONB в PostgreSQL: операторы @> ? ?|, GIN-индекс по jsonb, jsonb_path_query и JSONPath, обновление через jsonb_set и частые ошибки.
- Массивы в PostgreSQL
Массивы в PostgreSQL: тип array, операторы ANY и ALL, разворачивание через unnest, оператор содержания и GIN-индекс, и когда массив, а когда отдельная таблица.
- Полнотекстовый поиск: tsvector и tsquery
Полнотекстовый поиск в PostgreSQL: to_tsvector и to_tsquery, ранжирование ts_rank, GIN-индекс, словари и стемминг, и сравнение с LIKE и расширением pg_trgm.
- JSONB: хранение и доступ
9 MVCC, VACUUM и обслуживание
- MVCC изнутри: версии строк, xmin/xmax
Как PostgreSQL хранит несколько версий одной строки, что такое скрытые столбцы xmin и xmax, как снимок транзакции решает видимость версий и почему читатели не блокируют писателей.
- Мёртвые кортежи и раздувание таблиц
Откуда в PostgreSQL берётся bloat: мёртвые версии строк после UPDATE и DELETE, как заметить раздувание таблиц и индексов через pg_stat_user_tables и расширения, чем оно вредит производительности.
- VACUUM и autovacuum
Что делает VACUUM в PostgreSQL, чем обычный VACUUM отличается от VACUUM FULL, как устроен и настраивается autovacuum, зачем нужен ANALYZE для статистики и когда вмешиваться вручную.
- Уровни изоляции и блокировки в PostgreSQL
Изоляция в PostgreSQL: Read Committed по умолчанию, Repeatable Read через снимок, Serializable и SSI, явные блокировки строк и таблиц, advisory locks и обнаружение deadlock.
- MVCC изнутри: версии строк, xmin/xmax
10 Масштабирование, репликация и эксплуатация
- Партиционирование таблиц
Декларативное партиционирование в PostgreSQL по диапазону, списку и хешу: зачем дробить большие таблицы, как работает partition pruning и частые грабли.
- Репликация: потоковая и логическая
Репликация PostgreSQL: primary и standby, потоковая репликация через WAL, hot standby для чтения, логическая репликация, синхронный и асинхронный режимы.
- Пулы соединений и масштабирование чтения
Почему соединения в PostgreSQL дорогие, как PgBouncer экономит ресурсы, режимы пулинга session/transaction/statement и масштабирование чтения репликами.
- Бэкапы, расширения и мониторинг
Бэкапы pg_dump/pg_restore, физический бэкап и восстановление на точку во времени (PITR) через WAL, расширения CREATE EXTENSION и мониторинг через pg_stat_*.
- Партиционирование таблиц