0Pricing
SQL Academy · Урок

Поиск внутри массивов

Операторы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы столбцов-массивов
  2. Поиск внутри массивов
  3. UNNEST и агрегация
  4. Массивы и нормализованные таблицы
← Назад к SQL Academy