SQL Portal | Базы Данных
14.4K subscribers
598 photos
82 videos
41 files
502 links
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
SQL (Beginner) From Scratch to.pdf
154.3 KB
SQL с нуля до профи — в одном PDF

Хочешь разобраться в SQL? Вот тебе шпаргалка, которая:

> Объясняет, что такое SQL
> Показывает разницу между DDL, DML, DQL
> Учит JOIN-ам, подзапросам и оконным функциям
> Даёт советы по оптимизации и автоматизации запросов

Идеально для новичков и тех, кто хочет подтянуть основы 😮

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
В Postgres есть полезные функции AGE для работы с датами — особенно удобны, когда нужно вычитать и считать разницу во времени.

SELECT AGE(DATE '2025-05-08', DATE '2000-01-01');
age
------------------------
25 years 4 mons 7 days
(1 row)


Можно извлечь только количество лет:

SELECT EXTRACT(YEAR FROM AGE('2025-05-08', '2000-01-15')) AS years;
-- результат: 25
years
-------
25
(1 row)


С меньшими единицами времени всё не так просто:

SELECT EXTRACT(MONTH FROM AGE('2025-05-08', '2000-01-15')) AS months;
-- результат: 3


С 2000 года прошло явно больше трёх месяцев... Чтобы получить точное значение в месяцах, надо учесть количество лет * 12 + месяцев:

SELECT 
EXTRACT(YEAR FROM AGE('2025-05-08', '2000-01-01')) * 12 +
EXTRACT(MONTH FROM AGE('2025-05-08', '2000-01-01')) AS total_months;
total_months
--------------
304
(1 row)


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2
На одной картинке — как выглядят стандартные SQL-запросы против аналогов в MongoDB

Удобная шпаргалка, если переходишь с реляционных БД на документо-ориентированные ❤️

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥3
Используйте квалифицированные выражения (type constructors), чтобы упростить присваивание переменным записей и массивов в PL/SQL:

rec_var := rec_type('v1', 'v2', ...);
arr_var := arr_type(1, 2, ...);


Можно использовать позиционную или именованную нотацию:

> для массивов — индекс и значение,

> для записей — имя атрибута

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Следишь за новостями в мире UUID?

За последние годы многое изменилось — особенно с появлением UUIDv7.

UUIDv7 сочетает в себе:

> префикс с Unix-временем
> суффикс как у случайного UUID

Если ты раньше использовал UUIDv4, то знаешь — он хорошо подходит для приватности, но плохо сортируется и индексируется. UUIDv7 решает это, добавляя временную метку в начало — это делает его дружелюбнее к базам данных и производительности.

В Postgres уже есть расширение для использования UUIDv7, а официальная поддержка планируется в Postgres 18 💖

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Термин дня в Postgres: кардинальность

На неделе обсуждали распределение данных, и кардинальность — часть этой темы.
Кардинальность — это количество уникальных значений в столбце.

> Высокая кардинальность — много уникальных значений. Индексы полезны для поиска и сортировки.

> Низкая кардинальность — всего несколько уникальных значений. Последовательное сканирование может быть быстрее индекса.

Можно узнать кардинальность через pg_stats:

SELECT attname, n_distinct
FROM pg_stats
WHERE tablename = 'storm_events';


Пример:

attname    | yearmonth
n_distinct | 12

attname | event_id
n_distinct | -1


> Положительное значение, как 12, — значит 12 уникальных значений.
> Отрицательное, как -1, — все строки уникальны (обычно id).

Кардинальность влияет и на селективность, и на стратегии джойнов в плане выполнения запроса ❤️

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122🔥1
Ищешь инструмент для рисования схем баз данных прямо в браузере?

Посмотри на drawdb — это бесплатный и open source-проект.

Можно импортировать существующие схемы, экспортировать в разных форматах и делиться диаграммами 😮

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
SQL-псевдоним позволяет присвоить таблице или столбцу временное имя во время выполнения запроса

Псевдонимы особенно полезны при работе со сложными запросами, соединениями (JOIN), или когда нужно переименовать столбцы в результате

Псевдоним существует только на время выполнения этого запроса

Псевдонимы создаются с помощью ключевого слова AS

Пример:

SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4
Какой вариант правильный?

A. Общие продажи, сгруппированные по названию книги.
B. Общее количество проданных экземпляров для каждого жанра.
C. Общая выручка, сгруппированная по жанру.
D. Список жанров с их книгами.

Правильный вариант — B

Запрос делает JOIN между таблицами Books и Sales, группирует по b.Genre и считает сумму s.Quantity, то есть — общее количество продаж по жанрам

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍2😁1
Можешь найти ошибку и поправить запрос?

Запрос ниже должен возвращать общий объём продаж для каждой категории товаров из таблицы Products. Но он выбрасывает ошибку:

SELECT category_id, SUM(price * quantity) 
FROM Products
WHERE category_id IS NOT NULL;


👉 Ошибка в том, что используется агрегат SUM(...), но нет GROUP BY.

Вот исправленный вариант:

SELECT category_id, SUM(price * quantity) 
FROM Products
WHERE category_id IS NOT NULL
GROUP BY category_id;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍125🏆3
В Postgres есть набор зарезервированных слов, которые используются в SQL и нельзя применять для имён таблиц, колонок, индексов и т.д.

Часто вызывают проблемы у новичков:
USER, GROUP, ORDER, TABLE — многие пытались создать таблицу с именем table или user.

Есть и другие зарезервированные слова, реже встречающиеся в названиях:
SELECT, INSERT, UPDATE, WHERE, FROM, BY, LIMIT, JOIN.

Можно обойти это, заключив имя в кавычки:

CREATE TABLE "user";


Но тогда каждый запрос должен использовать эти кавычки — это приводит к ошибкам и неудобно, поэтому так делать и не рекомендуется 💖

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Измени формат вывода результатов запроса в OracleSQL с помощью команды:

SET SQLFORMAT <формат>


Или добавь комментарий формата после SELECT, например, для вывода в CSV:

SELECT /*csv*/ ...


Затем выполни SQL в режиме скрипта (F5).

Поддерживаемые форматы:

CSV
JSON
INSERT


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Когда мы говорим с клиентами о бэкапах, мы делим всё на два понятия: одиночная резервная копия и система восстановления до определённого момента (point-in-time recovery).

1. Одиночный бэкап (pg_dump). Можно получить с помощью команды pg_dump в Postgres — это логический бэкап, который представляет данные в виде SQL-скрипта (CREATE TABLE, INSERT INTO и т.д.).

> Подходит для тестов, миграций, восстановления на другой версии Postgres или платформе.
> Но не годится как полноценная система восстановления в проде — например, при порче данных.

2. Физический бэкап

Делается с помощью pg_basebackup, снапшотов или журнала WAL. Это бэкапы на уровне байтов и блоков, зависят от версии и хранилища, но:

> гораздо быстрее при аварийном восстановлении,
> поддерживают инкрементальные бэкапы,
> позволяют делать восстановление до конкретного времени (PITR).

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
Добавь автодополнение в своё приложение с помощью pg_trgm

Модуль pg_trgm + индекс GIN ускоряет iLIKE-поиск даже на миллионах строк — идеально подходит для type-ahead (поиска по мере ввода).

Мгновенный отклик + минимум усилий — максимум пользы

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Давайте попрактикуемся в SQL

Вопрос: Используя таблицу Order, напишите запрос, чтобы найти общую сумму продаж (amount) за февраль 2025 года

Ответ:
SELECT SUM(total_amount) AS total_sales
FROM orders
WHERE MONTH(order_date) = 2 AND YEAR(order_date) = 2025;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥31
В PostgreSQL 18 поле Buffers появится в стандартном EXPLAIN-выводе

Теперь при выполнении EXPLAIN ANALYZE вы сразу увидите информацию о буферах:

EXPLAIN ANALYZE SELECT * FROM orders;

QUERY PLAN
--------------------------------------------------------------------------------
Seq Scan on orders (cost=0.00..1.02 rows=2 width=90) (actual time=0.012..0.013 rows=2 loops=1)
Buffers: shared hit=5
Planning Time: 0.055 ms
Execution Time: 0.023 ms


> Buffers: shared hit=5 означает, что данные были считаны из кэша (shared buffers), то есть из оперативной памяти.
> А если бы пришлось читать с диска, строка выглядела бы так:

Buffers: shared hit=5, shared read=3


Почему это важно? 🤔

Показатель cache hit ratio — отличный индикатор производительности работы с памятью в Postgres.
Чем больше данных берётся из буфера, тем быстрее работает запрос.

А если читается с диска — это значит:

> больше нагрузки на I/O

> выше потребление CPU

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

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
Excel-Fundamentals-Manual.pdf
10.1 MB
Excel с нуля — в одном файле

"Excel Fundamentals Manual" — PDF-гайд, где пошагово разобрано всё, что нужно новичку

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥1
Создавай приватные временные таблицы в Oracle Database 18c с помощью:

CREATE PRIVATE TEMPORARY TABLE ... ( ... )


> Таблицы видны только в твоей сессии
> Их имена должны начинаться с префикса private_temp_table_prefix
> По умолчанию удаляются в конце транзакции, но можно настроить удаление в конце сессии

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1😁1
Media is too big
VIEW IN TELEGRAM
Встречайте новое расширение Microsoft для PostgreSQL в VScode

Оно напичкано мощными инструментами, которые ускорят вашу работу с Postgres:

> Интеграция с Agent Mode
> Визуализация схем
> Мгновенный запуск PostgreSQL в Docker
> Запросы с поддержкой IntelliSense

читать больше 😎

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥91🤔1