Data Science. SQL hub
36K subscribers
902 photos
46 videos
37 files
959 links
По всем вопросам- @workakkk

@itchannels_telegram - 🔥лучшие ит-каналы

@ai_machinelearning_big_data - Machine learning

@pythonl - Python

@pythonlbooks- python книги📚

@datascienceiot - ml книги📚

РКН: https://vk.cc/cIi9vo
Download Telegram
⚡️ SpeedML - это библиотека Python, целью которой является ускорение процесса разработки конвейера машинного обучения.

Она объединяет часто используемые пакеты ML, такие как Pandas, NumPy, Scikit-learn, XGBoost и Matplotlib. SpeedML также предоставляет функциональные возможности для автоматизированного EDA.

pip install speedml

Github

@sqlhub
9👍6🔥5
⚡️ Dolt — первая в мире база данных SQL с контролем версий.

Для достижения этой цели Dolt использует Prolly Tree-хранилище схемы и данных, представленных в виде графа. Таким образом достигается контроль версий базы данных на уровне хранилища.

Контроль версий БД в стиле Git предоставляет ряд полезных фичей:
— Мгновенный откат к любому предыдущему состоянию
— Полный журнал аудита с возможностью запроса, содержащий все данные с момента их создания.
— Несколько развивающихся ветвей данных
— Возможность объединения ветвей данных
— Быстрая синхронизация с удаленными версиями для резервного копирования или децентрализованной совместной работы.
— Запрашиваемые различия (т. е. различия) между версиями

Механизм хранения Dolt построен на графе коммитов Prolly Trees в стиле Git. Схема таблицы и данные хранятся в Prolly Trees. Корни этих деревьев Prolly вместе с другими метаданными хранятся в графе коммитов, чтобы обеспечить контроль версий в стиле Git.

🔗 Подробнее можно почитать на официальной страничке
🔗Github

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍52
This media is not supported in your browser
VIEW IN TELEGRAM
💻ACID

Когда речь идёт о базах данных, может всплыть сочетание «Требования ACID».
Давайте освежим в памяти, что же это значит

Требования ACID — набор требований, которые обеспечивают сохранность ваших данных.

🔅Atomicity — Атомарность
Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.

🔄Consistency — Согласованность
Это свойство вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается консистентной. Есть такое определение транзакции: «Упорядоченное множество операций, переводящих базу данных из одного согласованного состояния в другое». То есть до выполнения операции и после база остается консистентной (согласованной)

⬇️Isolation — Изолированность
Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.

🔓Durability — Надёжность
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.

🔗 Полезная статья на Хабре в тему

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍103
🔥 Sweet-Viz - библиотека, которая предоставляет быструю визуализацию и анализ данных.

Основная фича Sweet-Viz — обширный HTML-дашборд с полезными представлениями и сводками данных, который генерируется выполнением всего одной строки кода.

pip install sweetviz

import sweetviz as sv

my_report = sv.analyze(my_dataframe)
my_report.show_html() # Default arguments will generate to "SWEETVIZ_REPORT.html"

Github

@sqlhub
👍10🔥32
💻Про NOT NULL и NULL в SQL

☑️IS NOT NULL + OR
Иногда внутри SQL-запроса возникает необходимость проверить наличие/отсутствие NULL-значения в некотором наборе полей:
a IS NOT NULL OR b IS NOT NULL OR c IS NOT NULL

Но то же самое по смыслу условие можно записать гораздо короче с помощью функции coalesce:
coalesce(a, b, c) IS NOT NULL


☑️IS NOT NULL + AND
Немного изменим условие - заменим OR на AND:
a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL

Тут нам поможет ROW-конструктор:
(a, b, c) IS NOT NULL


☑️IS NULL + AND
Теперь заменим IS NOT NULL на IS NULL:
a IS NULL AND b IS NULL AND c IS NULL

Тут достаточно вспомнить из логики, что (A and B) эквивалентно not(not A or not B), а (A or B) - not(not A and not B), поэтому легко применяем not к варианту IS NOT NULL + OR:
coalesce(a, b, c) IS NULL

Или с помощью ROW-конструктора:
(a, b, c) IS NULL


☑️IS NULL + OR
Остался последний вариант:
a IS NULL OR b IS NULL OR c IS NULL

Тут мы можем "обратить" вариант IS NOT NULL + AND:
NOT (a, b, c) IS NOT NULL

Заметьте, что пара NOT тут "не сокращается", иначе получился бы предыдущий вариант.

Подробнее об особенностях работы со сложными выражениями тут — "PostgreSQL Antipatterns: вычисление условий в SQL". И ещё годная статья — "«Ленивый сахар» PostgreSQL"

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥104
💻Топ 7 SQL-запросов для очистки данных

1️⃣Удаляем дубликаты записей
DELETE FROM your_table
WHERE rowid NOT IN (
SELECT MAX(rowid)
FROM your_table
GROUP BY column1, column2, ...
);


2️⃣Удаляем строки с NULL-значениями
DELETE FROM your_table
WHERE column1 IS NULL OR column2 IS NULL;


3️⃣Заменяем NULL-значения на дефолтное выражение
UPDATE your_table
SET column1 = 'default_value'
WHERE column1 IS NULL;


4️⃣Переводим текст в верхний регистр
UPDATE your_table
SET column1 = UPPER(column1);


5️⃣Обрезаем лишнее
UPDATE your_table
SET column1 = TRIM(column1);


6️⃣Конвертируем строки в формат дат
UPDATE your_table
SET date_column = TO_DATE(date_string, 'YYYY-MM-DD');


7️⃣Извлекаем год/месяц/день
SELECT EXTRACT(YEAR FROM date_column) AS year,
EXTRACT(MONTH FROM date_column) AS month,
EXTRACT(DAY FROM date_column) AS day
FROM your_table;


Эти запросы могут помочь вам привести датасет в порядок, используйте)

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥96👎2🥰2
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Rexi — полезный инструмент для тестирования регулярных выражений прямо из терминала


Инструмент написан Python, на основе библиотеки textual. Он предлагает дружелюбный интерфейс для интерактивной работы с регулярными выражениями.

Поддерживает оценку регулярных выражений в режимах match или finditer.
Предлагает мгновенную обратную связь по результатам сопоставления или поиска.

Github

@sqlhub
8👍2🔥1
💻 Делаем SQL-запросы чище

Периодически в коде запросов и "заточенных" под них индексов наблюдаю примерно подобные куски:
coalesce("Фамилия", '') || ' ' || coalesce("Имя", '') || ' ' || coalesce("Отчество", '')


Понятно, что тут хотели обезопасить себя от заполненности любого из полей NULL-значением, чтобы случайно вся строка не заNULL'илась.

Правда, тут возникают некоторые артефакты в виде "висящих пробелов" типа ' Иван Иванович' или 'Иванов Иван '.

Но ведь есть решение изящнее и проще - функция concat_ws:
concat_ws(' ', "Фамилия", "Имя", "Отчество")


RTFM!

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥105👎1
💻Методы оптимизации SQL-запросов

1️⃣Использование EXPLAIN для анализа запросов

2️⃣Продвинутые стратегии индексирования
├── Пересмотр покрывающих индексов
├── Частичные индексы для отфильтрованных данных
└── Стратегии индексирования для соединений

3️⃣Переписывание и оптимизация запросов
├── Пересмотр подзапросов к JOIN'ам
├── Общие табличные выражения (CTE) и рекурсивные запросы
└── Ограничение наборов результатов с помощью OFFSET-FETCH

4️⃣Денормализация данных для повышения производительности
├── Выбор кандидатов на денормализацию
├── Создание денормализованных таблиц
└── Баланс между согласованностью данных и производительностью

5️⃣Использование временных таблиц для оптимизации запросов
├── Временные таблицы для промежуточных результатов
├── Создание и наполнение временных таблиц
└── Временные таблицы и агрегации

6️⃣Оптимизация подзапросов и агрегаций
├── Оптимизация подзапросов
└── Оптимизация агрегаций

7️⃣Избегайте курсоров и циклов для повышения производительности
├── Операции на основе множеств
├── Пакетная обработка
└── Оптимизация циклов с помощью операций на основе множеств

Примеры некоторых из этих приёмов

Пересмотр подзапросов к JOIN'ам.
Оригинальный подзапрос:
SELECT * FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE region = 'West');

Переписан с использованием JOIN:
SELECT e.* FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
WHERE d.region = 'West';


Общие табличные выражения (CTE) предоставляют удобный способ упростить сложные запросы и улучшить их читаемость:
WITH RecursiveCTE AS (
SELECT employee_id, first_name, manager_id, 0 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.first_name, e.manager_id, rc.depth + 1
FROM employees e
INNER JOIN RecursiveCTE rc ON e.manager_id = rc.employee_id
)
SELECT * FROM RecursiveCTE;


Более подробно можно прочитать тут

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍275🔥3🤔1
💎 Шпаргалки для всех: сокровищница знаний

Этот ресурс - настоящее сокровище для любого разработчика.

В нем содержится около 6000 разнообразных шпаргалок в виде изображений: от программирования и работы с базами данных до софт-скиллов.

Здесь вы найдете не только классические шпаргалки по регулярным выражениям и SQL, но и информацию о кофейных напитках, командах в Minecraft и французской грамматике.

Смотреть

@sqlhub
11👍6🔥2
💻Проверка наличия записи в SQL: альтернатива SELECT COUNT(*)

Для того чтобы проверить наличие записи, используйте оператор EXISTS:
IF EXISTS (SELECT 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение)
PRINT 'Запись существует';
ELSE
PRINT 'Запись не найдена';

Замените ваша_таблица, ваш_столбец и ваше_значение релевантными данными. Этот способ является эффективным для поиска записей.

*️⃣Использование SELECT COUNT(*) для проверки наличия записи может показаться удобным, однако это не всегда эффективный подход, особенно при работе с обширными базами данных.
В MS SQL Server целесообразно использовать SELECT TOP 1 для сохранения ресурсов:
IF EXISTS (SELECT TOP 1 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение)
PRINT 'Запись существует';

В MySQL и PostgreSQL применяйте LIMIT 1 для ограничения выборки:
SELECT 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение LIMIT 1;

Такие запросы быстро останавливают выполнение, как только найдено первое соответствие.

*️⃣Миф о SELECT COUNT(*). Несмотря на то что многие СУБД оптимизируют SELECT COUNT(*), в работе не все из них показывают одинаковую эффективность. В случае сомнений используйте EXISTS или LIMIT/TOP.

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥63
💻Немного о недавнем обновлении PostgreSQL 16

PostgreSQL 16 вносит немало улучшений в планировщик запросов и позволяет выполнять многие SQL-запросы быстрее, чем в предыдущих версиях PostgreSQL.

Вот некоторые из изменений:
Разрешена инкрементальная сортировка в большем количестве случаев, включая DISTINCT

Добавлена возможность для агрегатов, имеющих ORDER BY или DISTINCT, использовать предварительно отсортированные данные

Разрешена мемоизация в UNION ALL

Разрешено выполнять anti-join с ненулевым входом в качестве внутреннего отношения

Разрешено распараллеливание FULL и RIGHT OUTER хэш-соединения

Разрешено оконным функциям использовать более быстрый режим ROWS, когда режим RANGE активен, но не нужен

Оптимизация постоянно увеличивающихся оконных функций ntile(), cume_dist() и percent_rank()

Разрешено удаление left join и unique joins в секционированных таблицах

Можно использовать Limit вместо Unique для реализации DISTINCT, когда это возможно

Ослаблены слишком строгие правила в select_outer_pathkeys_for_merge()

📎 Статья с подробным описанием улучшений

@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍8🔥3🤔2