Сегодня мы немного поговорим о массивах — одном из мощных инструментов PostgreSQL, позволяющем хранить список значений одного типа внутри одной колонки. Более подробно мы рассмотрим массивы в следующих уровнях.
Когда говорят "массивы", сразу вспоминаются списки. Вспомните, как вы записываете список покупок перед походом в магазин: яблоки, бананы, молоко, хлеб. В PostgreSQL массив — это аналог такого списка, где можно хранить несколько значений в одном поле, при этом каждое значение принадлежит одному и тому же типу данных. Например, массив чисел, массив текстов, массив дат и т.д.
Приведём несколько примеров.
Массив чисел:
{1, 2, 3, 4}
Массив строк:
{"apple", "banana", "cherry"}
Массив дат:
{2024-10-01, 2024-10-02, 2024-10-03}
Массив позволяет записывать множество значений в одно поле, экономя место в таблице и повышая гибкость запросов.
Зачем нужны массивы? Основные преимущества
Компактное хранение данных: хранение нескольких значений в одном поле. Это особенно полезно для данных, которые логически связаны друг с другом. Например, список тегов для статьи или список оценок студента. Заводить отдельную таблицу для пары тегов?
Удобство выборки: массивы позволяют получать сразу целый список значений из одного поля, а также легко манипулировать отдельными элементами массива.
Производительность: в некоторых сценариях массивы позволяют избежать создания дополнительных таблиц для связанных данных, что может упростить архитектуру базы и ускорить разработку. Что не может не радовать.
Как работать с массивами в PostgreSQL?
Создание массива в SELECT
Для задания массива можно использовать конструктор ARRAY[]. Вот пример:
-- Пример массива чисел
SELECT ARRAY[1, 2, 3, 4];
-- Пример массива строк
SELECT ARRAY['apple', 'banana', 'cherry'];
Слишком просто. Давайте создадим таблицу и попробуем что-то в ней выбрать.
Создание таблицы с массивами
Для начала создадим таблицу, где один из столбцов будет массивом.
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {Математика,Физика} |
| 2 | Maria | {Химия,Биология,Английский} |
| 3 | Peter | {Информатика} |
Посмотрим, что у нас получилось:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {Математика,Физика} |
| 2 | Maria | {Химия,Биология,Английский} |
| 3 | Peter | {Информатика} |
Извлечение данных из массивов
Для извлечения данных из массива PostgreSQL предоставляет несколько функций и операторов.
Извлечение элемента массива
Чтобы получить элемент массива по его индексу, используется квадратные скобки []. Обратите внимание, что нумерация начинается с 1 (а не с 0, как в большинстве языков программирования).
-- Получаем первый предмет у каждого студента
SELECT name, subjects[1] AS первый_предмет FROM students;
И вот такой результат:
| name | первый_предмет |
|---|---|
| Alex | Математика |
| Maria | Химия |
| Peter | Информатика |
Извлечение всей строки массива
Для получения всех элементов массива используется обычный SELECT:
SELECT name, subjects FROM students;
Поиск значений внутри массива
Иногда нам нужно определить, содержит ли массив конкретное значение. Для этого используется оператор ANY.
-- Выбрать студентов, которые изучают "Математику"
SELECT name
FROM students
WHERE 'Математика' = ANY(subjects);
Результат запроса:
| name |
|---|
| Alex |
В PostgresQL есть очень много функций и операторов для работы с массивами, но о них вы узнаете в будущих уровнях :P
Типичные ошибки при работе с массивами
Смешивание индексации с 0 и 1.
В PostgreSQL индексация массива начинается с 1. Если вы привыкли к языкам вроде Python или JavaScript, это легко может запутать.
Пустые массивы.
Пустой массив {} и NULL — это разные вещи в PostgreSQL. Если вы сравниваете массивы, не путайте эти концепции.
Работа с большими массивами.
Хранение огромного объема данных в массиве может увеличить время обработки запросов. Используйте массивы для небольших объемов данных.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ