Поиск внутри массивов
Операторы ANY, contains и overlap
«Поиск внутри массивов» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Массивы хранят несколько значений
В PostgreSQL столбец-массив хранит несколько значений в одной ячейке. Прежде чем искать внутри массивов, полезно увидеть, как они выглядят.
Запрос ниже создает таблицу, в которой каждый товар может относиться к нескольким категориям, хранящимся в текстовом массиве.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers', 'sale']),
('T-Shirt', ARRAY['clothing', 'summer', 'sale']),
('Coffee Mug', ARRAY['kitchen', 'gifts']),
('Headphones', ARRAY['electronics', 'audio']),
('Notebook', ARRAY['stationery', 'office']);Проверка принадлежности с помощью ANY
Оператор ANY позволяет проверить, встречается ли значение где-либо в массиве. Синтаксис таков: value = ANY(array_column).
Этот запрос находит все товары с тегом электроника.
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY используется не только для текста
ANY работает с любым типом данных, поддерживающим проверку на равенство. Ниже приведена таблица с результатами, хранящимися в массивах целых чисел. Запрос выбирает учащихся, которые получили идеальный результат 100 хотя бы в одной проверке.
CREATE TABLE students (
student TEXT,
scores INT[]
);
INSERT INTO students VALUES
('Alice', ARRAY[88, 95, 100]),
('Bob', ARRAY[70, 80, 90]),
('Carol', ARRAY[100, 100, 99]);
SELECT student, scores
FROM students
WHERE 100 = ANY(scores);Исключение строк с помощью NOT + ANY
Чтобы найти строки, в которых значение не встречается в массиве, объедините NOT с ANY. Обратите внимание: value <> ANY(arr) имеет другое значение — выражение возвращает истину, если отличается хотя бы один элемент, что почти всегда так.
Для надежной проверки отсутствия используйте NOT (value = ANY(arr)).
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));Оператор содержимого @>
Оператор @> проверяет, содержит ли один массив все элементы другого. Иными словами: включает ли левый массив каждый элемент, указанный справа?
Этот запрос находит товары, у которых есть оба тега: электроника и распродажа.
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];Оператор вхождения <@
Оператор <@ является обратным оператору @>. Он проверяет, полностью ли левый массив содержится в правом массиве.
Этот запрос находит товары, весь список тегов которых является подмножеством набора электроника, компьютеры, распродажа.
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];Оператор пересечения &&
Оператор && возвращает истину, когда два массива имеют хотя бы один общий элемент. Это массивный эквивалент вопроса: есть ли что-то общее у этих двух списков?
Запрос ниже находит товары, у которых есть хотя бы один общий тег с заданным списком покупок.
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];Пересечение и содержимое — ключевое различие
Операторы @> и && легко перепутать. Ниже приведено понятное сравнение:
tags @> ARRAY['a','b']— строка должна содержать оба значения: 'a' и 'b'.tags && ARRAY['a','b']— строка должна содержать хотя бы одно из значений: 'a' или 'b'.
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];
-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];Фильтрация по размеру с помощью array_length
Иногда нужно найти строки, в которых массив содержит определенное количество элементов. array_length(arr, 1) возвращает количество элементов в первом измерении.
Этот запрос находит товары ровно с тремя тегами.
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;Объединение поиска в массивах с другими условиями
Операторы массивов работают вместе с обычными условиями SQL. Их можно комбинировать с AND, OR и любыми другими предикатами условий WHERE, чтобы создавать точные фильтры.
-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
AND name < 'N'
ORDER BY name;Индексация массивов для ускорения
В больших таблицах поиск по массивам может выполняться медленно без индекса. Индекс GIN (обобщенный инвертированный индекс) в PostgreSQL предназначен для столбцов-массивов и эффективно поддерживает операторы @>, <@ и &&.
ANY не использует индекс GIN напрямую, но операторы пересечения и содержимого используют его.
-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);
-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];Быстрая проверка: операторы массивов
Проверьте понимание операторов поиска в массивах PostgreSQL.
Итоги урока
В этом уроке Вы изучили три основных способа поиска внутри массивов PostgreSQL:
- = ANY(arr) — проверяет, существует ли отдельное значение где-либо в массиве.
- @> (содержимое) — проверяет, включает ли массив все указанные элементы.
- && (пересечение) — проверяет, есть ли у массива хотя бы один общий элемент с другим массивом.
Вы также изучили <@ для обратной проверки вхождения, array_length для фильтрации по размеру и индекс GIN для ускорения поиска в массивах больших наборов данных. Объединение этих операторов со стандартными условиями WHERE дает точный и выразительный контроль над многозначными данными.
Часто задаваемые вопросы
Урок «Поиск внутри массивов» бесплатный?
Да — полный текст урока «Поиск внутри массивов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поиск внутри массивов»?
Операторы ANY, contains и overlap Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Поиск внутри массивов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы столбцов-массивов
- Поиск внутри массивов
- UNNEST и агрегация
- Массивы и нормализованные таблицы