PostgreSQL vs MySQL — в чём разница и какую учить аналитику

Коротко

PostgreSQL и MySQL — две самые популярные open-source реляционные СУБД. Обе поддерживают SQL, таблицы, индексы и транзакции. Но для аналитика данных PostgreSQL — однозначный выбор: он мощнее в оконных функциях, CTE, типах данных и ближе к стандарту SQL. MySQL проще, быстрее в простых CRUD-операциях и до сих пор живёт в тысячах веб-проектов — но аналитические задачи на нём решать труднее.

Краткая история

PostgreSQL появился в 1986 году в Беркли как академический проект. Отсюда его философия: поддержка стандарта SQL, расширяемость, сложные типы данных. Сейчас развивается сообществом, нет единого владельца.

MySQL создан в 1995 году шведской компанией MySQL AB. Цель — быстрая и простая база данных для веб-приложений. В 2010 году куплена Oracle. После этого часть сообщества ушла в форк MariaDB.

Сравнение возможностей

Возможность PostgreSQL MySQL
Оконные функции полная поддержка (ROW_NUMBER, LEAD, LAG, NTILE, FILTER) базовая поддержка с 8.0 (2018), нет FILTER
CTE (WITH) рекурсивные и нерекурсивные, можно вставлять/обновлять внутри CTE с 8.0, только SELECT
JSON JSONB — бинарный формат, индексы, операторы @>, ?, -> JSON-тип, функции JSON_EXTRACT, JSON_TABLE
ARRAY встроенный тип, ANY(), UNNEST() нет
Материализованные представления CREATE MATERIALIZED VIEW, REFRESH нет (эмулируют через таблицы + триггеры)
Полнотекстовый поиск tsvector, tsquery, ранжирование FULLTEXT-индексы, проще, но менее гибко
Партиционирование декларативное (RANGE, LIST, HASH) RANGE, LIST, HASH, KEY
DISTINCT ON да нет
Расширения PostGIS, pg_stat_statements, pgvector, 1000+ плагины, но экосистема беднее

Для аналитика критичны оконные функции, CTE и DISTINCT ON — в PostgreSQL они работают полноценно, в MySQL с ограничениями.

Отличия в синтаксисе

LIMIT и пагинация

-- PostgreSQL
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;

-- MySQL — то же самое, но есть и альтернативный синтаксис:
SELECT * FROM users ORDER BY id LIMIT 20, 10;  -- OFFSET, count

Конкатенация строк

-- PostgreSQL: оператор ||
SELECT first_name || ' ' || last_name AS full_name FROM users;

-- MySQL: функция CONCAT
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

Регистронезависимый поиск

-- PostgreSQL: ILIKE
SELECT * FROM products WHERE name ILIKE '%молоко%';

-- MySQL: LIKE по умолчанию регистронезависим (зависит от collation)
SELECT * FROM products WHERE name LIKE '%молоко%';

Функции дат

-- PostgreSQL
SELECT DATE_TRUNC('month', created_at) FROM orders;
SELECT EXTRACT(DOW FROM created_at) FROM orders;  -- 0=вс, 1=пн

-- MySQL
SELECT DATE_FORMAT(created_at, '%Y-%m-01') FROM orders;
SELECT DAYOFWEEK(created_at) FROM orders;  -- 1=вс, 2=пн

UPSERT

-- PostgreSQL: ON CONFLICT
INSERT INTO stats (user_id, score) VALUES (1, 100)
ON CONFLICT (user_id) DO UPDATE SET score = EXCLUDED.score;

-- MySQL: ON DUPLICATE KEY
INSERT INTO stats (user_id, score) VALUES (1, 100)
ON DUPLICATE KEY UPDATE score = VALUES(score);

Кто использует что в России

PostgreSQL — стандарт в российских продуктовых компаниях для основной базы:

  • Яндекс, Ozon, Авито, Тинькофф, СберМаркет — PostgreSQL как основная OLTP-база
  • Для тяжёлой аналитики поверх PG ставят ClickHouse
  • На собеседованиях аналитиков задачи по SQL подразумевают PostgreSQL-синтаксис

MySQL встречается:

  • VK (исторически), Mail.ru Group, многие e-commerce проекты
  • Legacy-проекты на PHP + MySQL (WordPress, 1C-Битрикс)
  • Стартапы, использующие PlanetScale или AWS RDS MySQL

Тренд: новые проекты в России выбирают PostgreSQL. MySQL остаётся там, где исторически сложилось.

Какую СУБД учить аналитику

PostgreSQL — первым и основным. Вот почему:

  1. Собеседования — задачи по SQL на собеседованиях пишут под PostgreSQL. Оконные функции, CTE, DISTINCT ON — всё это PostgreSQL-синтаксис
  2. Стандарт SQL — PostgreSQL ближе к ANSI SQL, чем MySQL. Что выучите в PG — перенесётся в другие СУБД
  3. Аналитические возможности — FILTER, ARRAY, JSONB, полноценные CTE. В MySQL этого нет или оно ограничено
  4. Экосистема — ClickHouse, Greenplum, Redshift, BigQuery используют SQL-синтаксис, близкий к PostgreSQL

MySQL учить отдельно не нужно. Если на работе столкнётесь — 90% синтаксиса совпадает, а оставшиеся 10% загуглите за день.

А что с ClickHouse?

ClickHouse — это не замена PostgreSQL, а дополнение. PostgreSQL — OLTP-база для приложений и небольших аналитических запросов. ClickHouse — OLAP-база для агрегаций по миллиардам строк. Подробное сравнение — в статье ClickHouse vs PostgreSQL для аналитика.

Типичная связка в российской компании: приложение пишет в PostgreSQL, данные реплицируются в ClickHouse, аналитик строит дашборды и ad-hoc запросы в ClickHouse.

Вопросы с собеседований

  1. В чём главное отличие PostgreSQL от MySQL для аналитика? — PostgreSQL полнее поддерживает оконные функции (FILTER, frame clause), CTE с INSERT/UPDATE, DISTINCT ON, ARRAY-тип и JSONB. MySQL догоняет, но всё ещё отстаёт в аналитических возможностях.

  2. Что такое DISTINCT ON и есть ли он в MySQL? — DISTINCT ON (col) возвращает одну строку на каждое уникальное значение col. Это PostgreSQL-специфичная конструкция. В MySQL аналог — подзапрос с ROW_NUMBER() и фильтрацией по rn = 1.

  3. Чем ILIKE отличается от LIKE? — ILIKE — регистронезависимый LIKE, есть только в PostgreSQL. В MySQL регистрозависимость LIKE зависит от collation таблицы — по умолчанию utf8_general_ci регистронезависим.

  4. Когда MySQL лучше PostgreSQL? — для простых веб-приложений с высокой нагрузкой на чтение, где не нужны сложные аналитические запросы. MySQL проще в настройке репликации и исторически лучше интегрирован с PHP-экосистемой.

  5. Можно ли на собеседовании писать MySQL-синтаксис? — лучше PostgreSQL. Если напишете CONCAT вместо || — ничего страшного. Но DISTINCT ON, FILTER, ILIKE — это PostgreSQL, и их ожидают увидеть.


Потренируйтесь отвечать на вопросы по SQL для аналитикаоткройте тренажёр с 200+ задачами и 1500+ примерами вопросов.

FAQ

Нужно ли аналитику учить MySQL?

Нет, специально учить не нужно. Если на работе используют MySQL — разберётесь за пару дней, потому что базовый SQL одинаков. На собеседованиях MySQL-синтаксис не спрашивают.

MariaDB — это MySQL?

MariaDB — форк MySQL, созданный после покупки MySQL компанией Oracle. Синтаксис почти идентичен MySQL, но MariaDB добавляет свои расширения (оконные функции появились раньше, чем в MySQL). Для аналитика разница несущественна.

Почему PostgreSQL бесплатный, если он такой мощный?

PostgreSQL — это проект с открытым исходным кодом, который развивается сообществом. Нет владельца, который может его «закрыть». Коммерческие компании зарабатывают на managed-версиях: Supabase, Neon, AWS RDS, Яндекс.Cloud Managed PostgreSQL.

Какую СУБД ставят в тестовых заданиях?

В 95% случаев — PostgreSQL. Если в задании не указана СУБД, пишите PostgreSQL-синтаксис. Если указан MySQL — отличия минимальны в рамках типичного тестового.


Прокачайте SQL для собеседований — SQL-тренажёр с задачами по PostgreSQL и подробный гайд для аналитика.