Всем привет)) Совместно @simulative_official организуем буткемп по SQL, регистрация доступна уже сейчас, буду рад вашему участию 👩💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👾4 3💯1
Forwarded from Симулейтив
Привет, аналитики! Меня зовут Владимир Лунев. Более 5 лет я работаю в IT как бизнес- и системный аналитик.
Я строил процессы и архитектуру реляционных баз данных для аналитиков, чтобы они могли быстро получить качественные данные, а не заниматься ручной обработкой исходной информации. Большую часть карьеры провёл в ритейле, где ежедневно принимаются решения на основе больших потоков данных: продаж, запасов, логистики, прогнозов спроса.
Несколько кейсов из моей работы:
👑 Оптимизировал отчёт и сократил время его выполнения с 3 часов, до 30 минут, не переписывая бизнес-логику, а разобрав EXPLAIN и исправив ошибки SQL-запросов.
👑 Построил систему контроля качества данных на основании проверочных скриптов, которая автоматически ловила дубли, NULL-ловушки и логические противоречия до попадания информации в отчёты.
👑 Разработал автоматизированный процесс агрегации и расчёта KPI для сети магазинов, позволивший ежедневно получать корректные метрики без ошибок.
Я буду ведущим SQL-буткемпа — практикума, где вы получите реальные навыки, которые работают в боевых проектах бизнеса. В рамках буткемпа мы разберём:
➖ Оптимизацию запросов в SQL — разбор EXPLAIN, выявление «тормозящих» мест, исправление лишних подзапросов и «фантомных» строк для ускорения критичных бизнес-отчётов и выгрузок.
➖ Контроль качества данных — научимся писать кастомные скрипты проверок данных для точных и надёжных данных.
➖ Прогнозы и тренды — построение когорт, скользящих метрик, lag/lead-анализ и простые линейные прогнозы для точного планирования.
➖ Сценарный анализ «что если» — моделирование альтернатив через параметризацию, temp-таблицы и CTE, автоматизация расчётов для оценки влияния изменений на ключевые показатели.
➖ Агрегацию данных и полезные бизнес-метрики — расчёт growth, hitrate, долей, YoY, контроль перекосов и проведение A/B-анализов для оценки эффективности решений.
➖ Рекурсию и последовательности — поработаем с деревьями parent-child, обходом графов, кластеризацией и сегментацией пользовательских действий для глубокого анализа процессов.
Формат: много практики на кейсах и задачах из IT-проектов и немного сопутствующей теории.
Если вы хотите писать SQL-запросы так, чтобы данные реально работали на вас, а не наоборот — этот буткемп для вас!
➡️ Зарегистрироваться на буткемп по ранней цене
📊 Simulative
Я строил процессы и архитектуру реляционных баз данных для аналитиков, чтобы они могли быстро получить качественные данные, а не заниматься ручной обработкой исходной информации. Большую часть карьеры провёл в ритейле, где ежедневно принимаются решения на основе больших потоков данных: продаж, запасов, логистики, прогнозов спроса.
Я часто сталкивался с задачами, где точность и скорость обработки данных имели критическое значение: приходилось быстро выявлять скрытые ошибки, обеспечивать корректность бизнес-отчётов и автоматизировать расчёты ключевых показателей.
Несколько кейсов из моей работы:
Я буду ведущим SQL-буткемпа — практикума, где вы получите реальные навыки, которые работают в боевых проектах бизнеса. В рамках буткемпа мы разберём:
Формат: много практики на кейсах и задачах из IT-проектов и немного сопутствующей теории.
Буткемп будет полезен аналитикам, data-engineers, backend-разработчикам, а также всем, кто работает с массивами данных, строит отчёты и хочет улучшить навыки владения SQL.
Если вы хотите писать SQL-запросы так, чтобы данные реально работали на вас, а не наоборот — этот буткемп для вас!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥12😱6👾4💯2🗿2
Когда вы работаете с большими таблицами, часто не нужны все строки сразу. Например, вы хотите:
Для этого в SQL есть два оператора (точнее clauses): LIMIT и OFFSET.
LIMIT ограничивает количество строк, которое вернёт запрос.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5; -- берём только 5 самых дорогих товаров
Что происходит:
OFFSET пропускает указанное количество строк перед выборкой.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5 OFFSET 5; -- берём строки с 6 по 10
Что происходит:
LIMIT + OFFSET идеально подходят для страниц сайта или приложения (бэк UI), но можно юзать и при подготовке отчетности, если ложиться в условия ее формирования.
-- Страница 1
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 0;
-- Страница 2
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 20;
-- Страница 3
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 40;
Каждый раз вы берёте новую порцию данных без лишней нагрузки на базу.
Случайные строки с LIMIT.
Чтобы взять случайные строки из таблицы:
SELECT *
FROM users
ORDER BY RANDOM() -- в разных СУБД отличается
LIMIT 5;
LIMIT в подзапросах.
Можно использовать LIMIT для выборки топ-N в подзапросах:
SELECT *
FROM users
WHERE id IN (
SELECT id
FROM users
ORDER BY created_at DESC
LIMIT 10
);
Всегда используйте ORDER BY с LIMIT. Иначе “первые N” строки могут быть случайными.
LIMIT n — Берёт первые n строк
OFFSET m — Пропускает первые m строк
LIMIT n OFFSET m — Берёт n строк, пропустив первые m
Запомните: LIMIT — сколько строк грузить, OFFSET — с какой строки грузить.
#SQL #LIMIT #OFFSET
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥19 8👾6
Forwarded from Симулейтив
Узнайте, почему ваши SQL-запросы тормозят 🤖
Медленные SQL-запросы могут стоить бизнесу миллионов: отчёты считаются часами, решения принимаются с задержкой, а ошибки в данных подрывают доверие к аналитике.
На вебинаре Владимир Лунев, бизнес- и системный аналитик с 5-летним опытом работы в ритейле и IT, разберёт 7 реальных кейсов оптимизации SQL-запросов, которые помогали бизнесу принимать быстрые и точные решения.
В ходе вебинара разберём:
🟠 Как понять, что запрос тормозит, и чем это грозит бизнесу;
🟠 Как читать план выполнения (EXPLAIN, EXPLAIN ANALYZE) и находить ошибки;
🟠 Типовые причины медленных запросов и как их исправлять;
🟠 7 реальных кейсов из практики: «было → стало» с разбором кода.
❗️ Встречаемся 24 сентября в 19:00 МСК.
➡️ Зарегистрироваться на вебинар
📊 Simulative
Медленные SQL-запросы могут стоить бизнесу миллионов: отчёты считаются часами, решения принимаются с задержкой, а ошибки в данных подрывают доверие к аналитике.
На вебинаре Владимир Лунев, бизнес- и системный аналитик с 5-летним опытом работы в ритейле и IT, разберёт 7 реальных кейсов оптимизации SQL-запросов, которые помогали бизнесу принимать быстрые и точные решения.
В ходе вебинара разберём:
🧡 Обязательно ждём вас в лайве — вы сможете напрямую задать свои вопросы Владимиру Луневу и получить ценный опыт оптимизации SQL-запросов!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥10 6💯5🤔2🤣1
Какой СУБД вы пользуетесь сейчас?
Anonymous Poll
62%
PostgreSQL
9%
MySQL / MariaDB
5%
Oracle
1%
SQLite
6%
ClickHouse
0%
MongoDB
0%
NoSQL СУБД
5%
Другая (укажите в комментариях)
10%
Только начинаю изучать СУБД
🔥6 6🌚2💯1
Многие думают, что оператор HAVING — это просто аналог WHERE, но после GROUP BY. Это упрощение, которое может привести к путанице. Давайте разберём настоящую теорию — шаг за шагом.
Здесь нужно понимать, что SQL-запрос выполняется СУБД не в том порядке, в котором он написан человеком. Это критически важно для понимания HAVING.
1. FROM — загрузка данных из таблиц(ы)
2. WHERE — фильтрация отдельных строк
3. GROUP BY — разбиение оставшихся строк на группы
4. Вычисление агрегатных функций (COUNT, SUM, AVG и т.д.) для каждой группы
5. HAVING — фильтрация групп на основе результатов агрегации
6. SELECT — формирование выходных колонок (включая алиасы)
7. ORDER BY, LIMIT, и т.д.
SQL основан на реляционной алгебре. Оператор GROUP BY трансформирует отношение (таблицу) в множество групп, где каждая группа — это подмножество строк с одинаковым значением ключа группировки.
Пример:
GROUP BY department
Cоздаёт столько групп, сколько уникальных значений в колонке department. Каждая такая группа — новая логическая единица, и к ней можно применять агрегатные функции, которые сводят множество строк к одному значению (например, средняя зарплата в отделе).
Потому что WHERE работает на уровне кортежей (строк), а не групп. Он отвечает на вопрос: «Оставить ли эту конкретную строку в результирующем наборе до группировки?». Агрегатные функции, напротив, не определены для одной строки — они требуют множества. Например, AVG(salary) для одной строки — это просто salary, но SQL не позволяет так делать в WHERE, чтобы избежать семантической неоднозначности.
Используй HAVING, когда твоё условие зависит от результата агрегации по группе.
Найдём отделы, где средняя зарплата больше 70 000.
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 70000;
Если попытаться написать это через WHERE — получим ошибку:
WHERE AVG(salary) > 70000
-- СУБД заруинила запрос
Потому что на этапе WHERE ещё нет групп, а значит — нет и средней зарплаты по отделу.
Используй WHERE, если фильтруешь по конкретным значениям (например, status = 'active').
Используй HAVING, если фильтруешь по результатам агрегации (COUNT(*) > 5, AVG(price) < 100).
#SQL #HAVING
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33💯10👾6 2🤔1
Если вы задумывались над тем, чем же все-таки занимаются аналитики, рекомендую подписаться на канал Data Brew!
Канал ведет тот самый аналитик, который смог построить карьеру после курсов и сейчас продолжает расти профессионально.
Автор
🤗 помогает в поиске работы
😊 пишет о полезных для аналитиков хардах
🎁 делится реальными историями с собеседований
🤬 рассказывает о боли аналитиков
😇 скидывает аналитические мемы
Подписывайся на @data_brew
Канал ведет тот самый аналитик, который смог построить карьеру после курсов и сейчас продолжает расти профессионально.
Автор
Подписывайся на @data_brew
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥8👾5 5
🐘 От академического проекта до лидера open-source: история PostgreSQL
Продолжим тему постов про историю SQL и СУБД, ранее мы уже разбирали:
➖ Как создатель MySQL потерял миллиарды
➖ Историю SQL: от лаборатории IBM до ядра современного ИТ
Теперь настало время одной из самых популярных промышленных СУБД — PostgreSQL
❗️ Начало, проект "Ingres"
Всё началось в 1986 году в Калифорнийском университете в Беркли. Группа исследователей под руководством профессора Майкла Стоунабрейкера уже создала реляционную СУБД Ingres — одну из первых в мире. Но им захотелось большего. Они решили пойти дальше реляционной модели и создать объектно-реляционную СУБД, которая поддерживала бы сложные типы данных, наследование и пользовательские функции. Так родился проект Post-Ingres — "после Ingres".
❗️ Рождение open-source
В 1994 году два аспиранта Андреас Энглесберг и Джонсон Ло портировали Postgres на язык C и добавили поддержку SQL. Это стало поворотным моментом. В том же году код был открыт под лицензией BSD и началась эра сообщества. В 1996 году название изменили на PostgreSQL, чтобы подчеркнуть совместимость со стандартом.
PostgreSQL — одна из самых старых open-source СУБД, которая активно развивается без корпоративного владельца. Никакой Oracle, Microsoft или Google за спиной — только сообщество энтузиастов и профессионалов.
❗️ Эволюция версий: от 6.0 до 16+
➖ 1996: Выходит PostgreSQL 6.0 — первая официальная версия с SQL.
➖ 1997: Появляется поддержка транзакций и многоверсионного контроля параллелизма (MVCC) — технологии, которая сегодня лежит в основе производительности PostgreSQL.
➖ 2005: Версия 8.0 — первая нативная сборка для Windows.
➖ 2010: Поддержка JSON (ещё до бума NoSQL!).
➖ 2012: JSONB — бинарный, индексируемый JSON. Это стало прорывом: PostgreSQL начал конкурировать с документными базами.
➖ 2018: Версия 11 — параллельное создание индексов, улучшенная масштабируемость.
➖ 2023: PostgreSQL 16 — улучшения в логической репликации, безопасность, производительность аналитических запросов.
➖ 2025: Ожидаеться выход версии 18
PostgreSQL поддерживает более 40 расширяемых типов данных, включая географические (PostGIS), полнотекстовый поиск, массивы, диапазоны, UUID, IP-адреса и даже пользовательские типы.
❗️ Почему PostgreSQL так популярен?
➖ Следует SQL-стандартам лучше, чем многие коммерческие СУБД.
➖ Можно добавлять свои типы, функции, операторы, даже языки программирования (PL/Python, PL/Perl и др.).
➖ ACID-совместимость, отказоустойчивость, репликация.
➖ Более 1000 активных контрибьюторов, регулярные релизы раз в год, никакого vendor lock-in.
Компании вроде Apple, Spotify, Reddit, Cisco и IMDb, Магнит, Яндекс, Сбер используют PostgreSQL в продакшене — иногда с тысячами серверов.
🐘 А почему слон?
➖ Идея слона как символа PostgreSQL появилась в 1997 году — её предложил участник сообщества Дэвид Янг, вдохновлённый детективом Агаты Кристи «Слоны умеют помнить».
➖ В апреле 1999 года в Санкт-Петербурге руководитель небольшой дизайн-студии Дмитрий Самерсов инициировал создание логотипа, а дизайнер Екатерина Папчинская нарисовала эскиз — знаменитого "слона в алмазе"
➖ 12 апреля 1999 года изображение под названием slonik.gif было выложено на сайт Дмитрия и отправлено в рассылку pgsql-hackers. Название мгновенно прижилось и стало легендой международного сообщества. Позже логотип стилизовался и пришел к современному варианту.
❗️ Будущее
PostgreSQL продолжает развиваться:
➖ Улучшение работы с AI/ML (через расширения вроде MADlib),
➖ Поддержка векторных встраиваний (для поиска по схожести — актуально для LLM!),
➖ Ещё более мощная логическая репликация,
➖ Оптимизация для облачных и распределённых сред.
❗️ В заключение
Постгре это не просто база данных — это живая легенда с более чем 35-летней историей, открытая для всех и созданная благодаря уму, упорству и страсти к качеству.
И всё это — благодаря университетскому проекту 1980-х, который отказался умирать.
#SQL
📱 Подписаться на канал
💻 Курс автора по SQL DDL
🌎 Мой ИТ-стартап
Продолжим тему постов про историю SQL и СУБД, ранее мы уже разбирали:
Теперь настало время одной из самых популярных промышленных СУБД — PostgreSQL
Всё началось в 1986 году в Калифорнийском университете в Беркли. Группа исследователей под руководством профессора Майкла Стоунабрейкера уже создала реляционную СУБД Ingres — одну из первых в мире. Но им захотелось большего. Они решили пойти дальше реляционной модели и создать объектно-реляционную СУБД, которая поддерживала бы сложные типы данных, наследование и пользовательские функции. Так родился проект Post-Ingres — "после Ingres".
В 1994 году два аспиранта Андреас Энглесберг и Джонсон Ло портировали Postgres на язык C и добавили поддержку SQL. Это стало поворотным моментом. В том же году код был открыт под лицензией BSD и началась эра сообщества. В 1996 году название изменили на PostgreSQL, чтобы подчеркнуть совместимость со стандартом.
PostgreSQL — одна из самых старых open-source СУБД, которая активно развивается без корпоративного владельца. Никакой Oracle, Microsoft или Google за спиной — только сообщество энтузиастов и профессионалов.
PostgreSQL поддерживает более 40 расширяемых типов данных, включая географические (PostGIS), полнотекстовый поиск, массивы, диапазоны, UUID, IP-адреса и даже пользовательские типы.
Компании вроде Apple, Spotify, Reddit, Cisco и IMDb, Магнит, Яндекс, Сбер используют PostgreSQL в продакшене — иногда с тысячами серверов.
🐘 А почему слон?
PostgreSQL продолжает развиваться:
Постгре это не просто база данных — это живая легенда с более чем 35-летней историей, открытая для всех и созданная благодаря уму, упорству и страсти к качеству.
И всё это — благодаря университетскому проекту 1980-х, который отказался умирать.
#SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥18 10👾4🤯2
Когда я только начал работать аналитиком, я думал, что база данных это просто место, где хранятся цифры. Потом я потратил два дня на отчёт, который оказался неверным, потому что не знал: поле status в таблице orders может быть NULL, если заказ ещё не обработан системой.
Но документации по этому поводу не было и узнал я об этом потом только со слов коллег. С тех пор я понял - реляционная модель это не про данные. Это про доверие.
В IT мы привыкли к API: чёткие контракты, типы, документация.
Например, если в колонке user_id есть NULL, значит, система допускает анонимные действия. Это бизнес-решение, зафиксированное в схеме (надеюсь).
Если договор нарушен (например, внезапно появляются дубли без первичного ключа), все теряют доверие к данным.
Это как менять API без версионирования - клиенты падают, но никто не знает почему.
Реляционная модель, не техническая деталь. Это язык согласия между людьми, которые хотят говорить об одном и том же, не путаясь.
Хорошая схема это когда новый аналитик через неделю понимает бизнес, просто читая документацию по модели данных БД.
Посмотрите на любую таблицу в вашей БД. Спросите себя:
Если да - вы знаете, с чего начать укреплять договор.
И напоследок анекдот:
Новичок приходит в команду и спрашивает:
— Где почитать про модель данных БД?
— Вся документация в голове у Артёма — отвечает тимлид.
— А как с ним связаться?
— А… он уволился полгода назад.
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥17 5💯4
Когда вы видите NULL в таблице, интуиция подсказывает: "Это просто пусто. Ничего нет. Поле не заполнено".
Но реляционная модель намеренно отказывается от такого упрощения. Вместо "ничего" она вводит состояние неопределённости: значение существует, но нам о нём ничего не известно. Именно поэтому NULL - это не данные, а метаинформация о недостатке данных.
И эта тонкость ломает привычную булеву логику, заставляя SQL работать с трёхзначной логикой (3VL):
Рассмотрим запрос:
SELECT name FROM employees WHERE age = NULL;
Логика кажется простой: "выведи всех, у кого возраст не указан"
Но СУБД думает иначе. Выражение вида age = NULL не возвращает ни TRUE, ни FALSE.
Поскольку NULL обозначает отсутствие известного значения, сравнение любого выражения с NULL с использованием стандартных операторов (=, <>, <, >, и т.д.) всегда приводит к логическому значению UNKNOWN.
Согласно семантике WHERE, в результирующий набор включаются только те строки, для которых условие оценивается как TRUE. Значения FALSE и UNKNOWN в этом контексте ведут себя одинаково - соответствующие строки исключаются из вывода.
Следовательно, конструкция из примера никогда не возвращает строк, даже если в столбце age присутствуют значения NULL.
Правильный синтаксис - специальный оператор:
SELECT name FROM employees WHERE age IS NULL; -- также антипод IS NOT NULL
Здесь вы не сравниваете значения, а запрашиваете состояние. Эти предикаты предназначены именно для работы с состоянием неопределённости и возвращают строго TRUE или FALSE.
Большинство агрегатов (SUM, AVG, MAX, MIN) игнорируют NULL. Это не ошибка, это следствие семантики "неизвестно":
Пример:
Таблица salaries:
id | amount
1 | 5000
2 | NULL
3 | 7000
Запрос:
SELECT AVG(amount) FROM salaries; -- Результат: 6000 (а не 4000!)
Если вы сознательно хотите трактовать NULL как 0 (например, "не заплатили - значит, ноль"), используйте COALESCE или CASE:
SELECT AVG(COALESCE(amount, 0)) FROM salaries; -- Теперь: 4000
Но будьте осторожны, это меняет семантику данных. Вы переходите от "мы не знаем" к "мы знаем, что это ноль"
ORDER BY column NULLS LAST
#SQL #NULL
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥27 9👾4💯3🌚1
Решил подвести, итоги года для канала.
Создавая его в феврале, я даже не думал, что получу такой крутой отклик от вас. Нас уже +1к, чему я безумно рад.
На самом деле, ещё бы долго продолжал этот список, например, мне нравится серия постов про нормализацию данных или пока еще не полностью законченный обзор по работе с датами и временем
Ещё мне забавно, было наблюдать за ростом качества контента, если первые посты были типовыми заметками, то последние стали вполне неплохими практическими рекомендациями или обзорами. В следующем году буду и дальше совершенствоваться в этом.
Под конец года, писал довольно мало, из-за высокой нагрузки на работе, прочих проектах, в следующем году обещаю исправится, буду писать пост каждую неделю
В общем, увидимся в 2026!
Please open Telegram to view this post
VIEW IN TELEGRAM
29🔥23👾8 4💯2
Всем привет))
Я вернулся, так что с этой недели будут новые посты, будем воскрешать канал. Пропадал из за загруженности на работе и своих проектах.
Я вернулся, так что с этой недели будут новые посты, будем воскрешать канал. Пропадал из за загруженности на работе и своих проектах.
2🔥52 12👾9
Одна из самых распространенных ошибок при проектировании базы данных это выбирать типы данных по принципу "лишь бы поместилось". На самом деле тип данных определяет не только допустимые значения, но и способ их хранения, объем занимаемой памяти, производительность запросов и размер индексов. PostgreSQL предоставляет широкий набор встроенных типов данных, каждый из которых предназначен для решения определенных задач. В этом посте коротко, постарался описать, основные типы которые встречаются в постгре.
Тут кста пост про то как создали постгре
Для хранения целых чисел PostgreSQL предоставляет три основных типа:
SMALLINT
INTEGER
BIGINT
SMALLINT занимает 2 байта и хранит значения в диапазоне от -32 768 до 32 767.INTEGER (или сокращенно INT) занимает 4 байта и является наиболее часто используемым типом. Его диапазон составляет от -2 147 483 648 до 2 147 483 647.BIGINT занимает 8 байт и используется, когда диапазона INTEGER недостаточно, например для очень больших идентификаторов или счетчиков.Типы SERIAL, BIGSERIAL и SMALLSERIAL не являются отдельными типами данных. Это специальная запись, которая автоматически создает последовательность (SEQUENCE) и задает значение по умолчанию для соответствующего целочисленного столбца.
При выборе типа рекомендуется использовать минимально достаточный размер. Это позволяет уменьшить объем хранения данных и размер индексов, хотя в современных системах влияние на производительность обычно менее заметно, чем влияние правильно построенных индексов и структуры запросов.
Для хранения значений, где важна абсолютная точность, используются типы
NUMERIC и DECIMAL.price NUMERIC(10,2)
Первый параметр определяет максимальное количество цифр, второй, количество цифр после десятичной точки.
Например:
99999999.99
Главное преимущество
NUMERIC это возможность хранить десятичные числа с заданной точностью без ошибок представления, характерных для чисел с плавающей точкой. В отличие от типов с плавающей точкой, каждое значение хранится с заданной точностью.Именно поэтому все финансовые расчеты, бухгалтерские операции и денежные суммы рекомендуется хранить в
NUMERIC. Следует учитывать, что операции над такими числами требуют больше вычислений и обычно выполняются медленнее, чем над целыми числами.В PostgreSQL используются типы:
REAL
DOUBLE PRECISION
Также поддерживается запись
FLOAT(p)
где значение
p определяет необходимую точность. В зависимости от нее постгре автоматически использует либо REAL, либо DOUBLE PRECISION. Если p ≤ 24, используется REAL, иначе (до 53) будет DOUBLE PRECISION. Эти типы реализованы в соответствии со стандартом IEEE 754. Число хранится в виде знака, экспоненты и мантиссы, благодаря чему поддерживается очень широкий диапазон значений. Однако далеко не каждую десятичную дробь можно представить точно в двоичной системе.Например:
SELECT 0.1 + 0.2;
может вернуть
0.30000000000000004
Это нормальное поведение чисел с плавающей точкой, а не ошибка СУБД. Поэтому
REAL и DOUBLE PRECISION подходят для инженерных расчетов, статистики и научных вычислений, но не для хранения денежных сумм.Наиболее часто используются три типа:
CHAR(n)
VARCHAR(n)
TEXT
CHAR(n) хранит строки фиксированной длины. Если фактическая длина меньше указанной, PostgreSQL дополняет значение пробелами до нужного размера.Такой тип имеет смысл использовать только тогда, когда длина значения всегда одинакова, например для кодов стран или сокращений.
VARCHAR(n) хранит строки переменной длины и дополнительно проверяет, что значение не превышает указанное ограничение.TEXT также хранит строки переменной длины, но без ограничения размера.Интересная особенность PostgreSQL заключается в том, что
TEXT и VARCHAR используют практически одинаковый механизм хранения. На практике различий в производительности между ними практически нет. Единственное отличие состоит в том, что VARCHAR(n) выполняет дополнительную проверку максимальной длины строки при записи данных. Именно поэтому многие разработчики PostgreSQL предпочитают использовать TEXT, если ограничение длины не является бизнес-требованием.Для хранения временных данных PostgreSQL предоставляет несколько специализированных типов:
DATE
TIME
TIMESTAMP
TIMESTAMPTZ
DATE хранит только календарную дату.TIME содержит только время суток.TIMESTAMP хранит дату и время без информации о часовом поясе.TIMESTAMPTZ (Timestamp with Time Zone) хранит момент времени с учетом часового пояса. Внутри PostgreSQL такие значения преобразуются в UTC, а при выводе отображаются в часовом поясе текущей сессии.Оба типа
TIMESTAMP занимают 8 байт и представлены как количество микросекунд относительно внутренней эпохи PostgreSQL. Благодаря этому операции сравнения, сортировки и вычисления интервалов выполняются очень эффективно.Для хранения булевых значений используется тип
BOOLEAN
Он занимает 1 байт и поддерживает значения:
TRUE
FALSE
NULL
PostgreSQL также понимает различные формы записи при вводе значения, например
1, 0, yes, no, on, off, автоматически преобразуя их в логические значения.Для хранения произвольной последовательности байтов используется тип:
BYTEA
Он подходит для хранения изображений, документов, архивов и других бинарных объектов.
Для очень больших файлов постгре также предоставляет механизм Large Objects, который позволяет хранить данные отдельно от основной таблицы и работать с ними потоково, но на самом деле он используется значительно реже, чем BYTEA, и обычно нужен лишь для действительно крупных объектов.
Одно из преимуществ постгри это наличие типов данных, отсутствующих во многих других СУБД.
id UUID
UUID занимает 16 байт и позволяет генерировать уникальные идентификаторы без обращения к последовательностям.
JSON
JSONB
JSON хранит исходный текст документа.JSONB преобразует данные во внутренний бинарный формат, позволяющий создавать индексы и выполнять быстрый поиск по содержимому.В большинстве случаев именно
JSONB является предпочтительным выбором.tags TEXT[]
scores INTEGER[]
Это позволяет хранить несколько значений в одном поле без создания отдельных таблиц для хранения небольших коллекций значений, хотя применять массивы следует только тогда, когда это действительно оправдано моделью данных.
CREATE TYPE order_status AS ENUM (
'new',
'paid',
'shipped',
'completed'
);
Такой подход обеспечивает контроль допустимых значений на уровне базы данных.
Тип данных в PostgreSQL определяет значительно больше, чем допустимый формат значения. Он влияет на внутреннее представление данных, объем хранения, размер индексов, скорость выполнения запросов и возможности оптимизатора.
Чем точнее выбран тип данных на этапе проектирования схемы, тем эффективнее будет работать база данных при росте объема информации. Именно поэтому грамотное проектирование БД начинается не с написания запросов, а с выбора подходящих типов данных.
#SQL #Типы_данных #PostgreSQL
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥11💯5👾4