SQL
Язык SQL декларативный: вы описываете какие данные нужны, а не как их получить. Базовый набор команд одинаков в большинстве СУБД.
Основные команды SQL
Команда SELECT выбирает столбцы из таблицы. Минимальная форма: указать столбцы и источник данных.
INSERT добавляет новые записи. Порядок значений должен соответствовать перечисленным столбцам.
UPDATE изменяет существующие данные. Ограничивайте изменяемые строки условием WHERE.
DELETE удаляет строки, удовлетворяющие условию.
CREATE создаёт объекты (таблицы, базы), DROP — удаляет.
Типы данных в PostgreSQL
Корректный выбор типов повышает производительность и экономит место. В PostgreSQL доступны:
Числовые:
smallint
,integer
,bigint
,decimal
,numeric
.Строковые:
varchar
,text
,char
.Дата и время:
date
,time
,timestamp
.Логический:
boolean
.Структурированные:
json
,jsonb
, массивы[]
.
Операции с данными
Фильтрация: Используется оператор
WHERE
.SELECT * FROM tablename WHERE column1 = 'condition';Сортировка: Используется оператор
ORDER BY
.SELECT * FROM tablename ORDER BY column1 ASC/DESC;Группировка: Используется оператор
GROUP BY
.SELECT column1, SUM(column2) FROM tablename GROUP BY column1;
Транзакции и индексы
Транзакция объединяет несколько операций в одно целое: либо все успешны, либо ни одна. Это сохраняет целостность данных.
Индекс ускоряет поиск и сортировку по столбцам.
Практические примеры
Создание базы данных и таблицы:
CREATE DATABASE mydatabase; \c mydatabase CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) );Добавление данных:
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');Выборка данных:
SELECT * FROM users WHERE name = 'John Doe';
Подзапросы и соединения
Подзапросы
Подзапрос — вложенный SELECT
, который возвращает значение(я) для условия во внешнем запросе.
Соединения
Соединения объединяют строки из двух таблиц по условию соответствия ключей.
INNER JOIN
Возвращает только те строки, которые имеют совпадения в обеих таблицах.
LEFT JOIN
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если нет совпадений, возвращает NULL.
RIGHT JOIN
Аналогично LEFT JOIN, но возвращает все строки из правой таблицы.
FULL OUTER JOIN
Возвращает все строки из обеих таблиц, заполняя NULL там, где нет совпадений.
Агрегатные функции
Агрегатные функции используются для вычисления значений на основе набора данных.
SUM: Сумма значений.
AVG: Среднее значение.
MAX: Максимальное значение.
MIN: Минимальное значение.
COUNT: Количество строк.
Индексирование и оптимизация запросов
Индексирование может существенно повысить скорость выполнения запросов.
Создание индекса
Оптимизация запросов
Используйте
EXPLAIN
для анализа плана выполнения запроса.Избегайте использования
SELECT *
, если не нужно все поля.Используйте индексы для полей, участвующих в фильтрации и сортировке.
Безопасность и права доступа
Создание пользователей и назначение прав
В PostgreSQL пользователи — это роли. Привилегии выдаются на объекты (таблицы, схемы, БД).
Роли и привилегии
SUPERUSER: Полный доступ к базе данных.
CREATEDB: Право создавать базы данных.
CREATEROLE: Право создавать роли.
Резервное копирование и восстановление
Создание резервной копии
Восстановление из резервной копии
Триггеры и функции
Триггер запускает процедуру при событиях INSERT
/UPDATE
/DELETE
.
Функции позволяют группировать повторяющиеся операции и использовать их в запросах.
Последовательности и идентификаторы
Последовательности
Последовательности используются для создания уникальных идентификаторов.
Идентификаторы (SERIAL)
SERIAL — это псевдоним для последовательности, который автоматически создается при создании таблицы.
Вью и материализованные вью
Вью
Вью — это виртуальные таблицы, которые основаны на запросе. Они не хранят данные физически, а вместо этого вычисляют результаты запроса каждый раз, когда к ним обращаются.
Материализованные вью
Материализованные вью — это физические таблицы, которые периодически обновляются на основе запроса. Они хранят результаты запроса в физической таблице, что может ускорить выполнение запросов.
Пример материализованного представления
1. Создание исходных таблиц
2. Создание материализованного представления
3. Запрос к материализованному представлению
category | total_sales | total_revenue | last_sale_date |
---|---|---|---|
Электроника | 2 | 1000000 | 2025-01-02 |
Литература | 1 | 20000 | 2025-01-03 |
Сравнение с обычным запросом
Обычный агрегирующий запрос:
План выполнения:
Запрос к материализованному представлению:
План выполнения:
Ключевые преимущества:
Производительность Время выполнения сократилось с 0.045 ms до 0.012 ms (в 3.75 раза быстрее). Для больших данных разница будет более существенной.
Снижение нагрузки на БД Материализованное представление:
Не требует выполнения JOIN операций
Избегает повторных вычислений агрегатных функций
Минимизирует блокировки таблиц
Возможность индексирования
Индексы на материализованных представлениях работают как на обычных таблицах.
Оптимизация сложных запросов
Особенно эффективны для:
Многотабличных JOIN-ов
Вложенных подзапросов
Рекурсивных запросов
Геопространственных вычислений
Ограничения и особенности:
Обновление данных Требует явного обновления:
Хранение данных Занимает место на диске (как обычная таблица). Размер можно проверить:
Актуальность данных Не отражает изменения в реальном времени. Частота обновления зависит от требований приложения.
Когда использовать:
Отчеты и аналитика, где допустима небольшая задержка данных
Сложные дашборды с агрегацией
Часто используемые ресурсоемкие запросы
Системы с высокой read-нагрузкой
Материализованные представления особенно выгодны при работе с большими объемами данных (от миллионов записей), где обычные агрегационные запросы становятся непозволительно медленными.
Common Table Expressions (CTE)
CTE — это временные результаты, которые можно использовать в запросе.
Общие табличные выражения (CTE) позволяют сохранять результаты запроса на этапе построения запроса. CTE объявляются с помощью ключевого слова WITH и могут быть использованы в основном запросе.
Регулярные выражения
Регулярные выражения используются для поиска и замены текста.
Окна (Window Functions)
Окна, или оконные функции, — это мощный инструмент SQL, позволяющий выполнять вычисления над набором строк, связанных с текущей строкой. Они позволяют получить доступ к данным из соседних строк, что делает возможным выполнение таких операций, как ранжирование, агрегация и сравнение значений между строками.
Преимущества
Ранжирование и сортировка: Окна позволяют ранжировать строки по определенным критериям.
Агрегация: Выполняют агрегационные операции над набором строк.
Сравнение значений: Позволяют сравнивать значения между соседними строками.
Основные оконные функции
1. ROW_NUMBER()
Назначает уникальный номер каждой строке в результате запроса.
2. RANK() и DENSE_RANK()
Используются для ранжирования строк. RANK()
оставляет пробелы в ранжировании, если есть равные значения, а DENSE_RANK()
не оставляет пробелов.
3. LAG() и LEAD()
Позволяют получить доступ к предыдущей (LAG()
) или следующей (LEAD()
) строке.
4. SUM(), AVG(), MAX(), MIN()
Выполняют агрегационные операции над набором строк.
Ключевые понятия
OVER
: Определяет набор строк, над которым выполняется оконная функция.PARTITION BY
: Разделяет результат на группы по указанным столбцам.ORDER BY
: Определяет порядок строк внутри каждой группы.ROWS
илиRANGE
: Определяет границы окна (например,ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
).