0Pricing
SQL Academy · Lekcja

Wyszukiwanie wewnątrz tablic

Operatory ANY, contains i overlap

Wyszukiwanie wewnątrz tablic to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Tablice przechowują wiele wartości

W PostgreSQL kolumna tablicowa przechowuje wiele wartości w jednej komórce. Zanim zaczną Państwo wyszukiwać dane wewnątrz tablic, warto zobaczyć, jak one wyglądają.

Poniższe zapytanie tworzy tabelę, w której każdy produkt może należeć do kilku kategorii przechowywanych jako tablica tekstowa.

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']);

Sprawdzanie obecności za pomocą ANY

Operator ANY pozwala sprawdzić, czy wartość występuje w dowolnym miejscu tablicy. Składnia wygląda następująco: value = ANY(array_column).

To zapytanie wyszukuje każdy produkt oznaczony tagiem electronics.

SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);

ANY nie służy tylko do tekstu

ANY działa z każdym typem danych, dla którego zdefiniowana jest równość. Oto tabela wyników przechowywanych jako tablice liczb całkowitych. Zapytanie pobiera uczniów, którzy uzyskali wynik 100, czyli maksymalną liczbę punktów, co najmniej na jednym teście.

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);

Wykluczanie wierszy za pomocą NOT + ANY

Aby znaleźć wiersze, w których wartość nie występuje w tablicy, należy połączyć NOT z ANY. Należy pamiętać, że value <> ANY(arr) ma inne znaczenie — zwraca true, jeśli dowolny element jest różny, co jest prawie zawsze prawdą.

W celu niezawodnego sprawdzenia wykluczenia należy użyć NOT (value = ANY(arr)).

-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));

Operator zawierania @>

Operator @> sprawdza, czy jedna tablica zawiera wszystkie elementy innej tablicy. Można to rozumieć następująco: czy lewa tablica zawiera każdy element wymieniony po prawej stronie?

To zapytanie wyszukuje produkty, które mają zarówno tag electronics, jak i tag sale.

SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];

Operator bycia zawartym <@

Operator <@ jest odwrotnością operatora @>. Sprawdza, czy lewa tablica w całości zawiera się w prawej tablicy.

To zapytanie wyszukuje produkty, których pełna lista tagów jest podzbiorem zbioru electronics, computers, sale.

SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];

Operator części wspólnej &&

Operator && zwraca true, gdy dwie tablice mają co najmniej jeden wspólny element. Jest tablicowym odpowiednikiem pytania: czy te dwie listy mają coś wspólnego?

Poniższe zapytanie wyszukuje produkty, które mają co najmniej jeden wspólny tag z podaną listą zakupów.

SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];

Część wspólna a zawieranie — kluczowa różnica

Łatwo pomylić operatory @> i &&. Oto jasne porównanie:

  • tags @> ARRAY['a','b'] — wiersz musi zawierać zarówno 'a', jak i 'b'.
  • tags && ARRAY['a','b'] — wiersz musi zawierać co najmniej jeden z elementów 'a' lub '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'];

Filtrowanie według rozmiaru za pomocą array_length

Czasami trzeba znaleźć wiersze, w których tablica ma określoną liczbę elementów. array_length(arr, 1) zwraca liczbę elementów w pierwszym wymiarze.

To zapytanie wyszukuje produkty z dokładnie trzema tagami.

SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;

Łączenie wyszukiwania w tablicach z innymi warunkami

Operatory tablicowe działają razem ze zwykłymi warunkami SQL. Można je łączyć z AND, OR oraz dowolnymi innymi predykatami klauzuli WHERE, aby tworzyć precyzyjne filtry.

-- 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;

Indeksowanie tablic w celu zwiększenia szybkości

W przypadku dużych tabel wyszukiwanie w tablicach może działać wolno bez indeksu. Indeks GIN (Generalized Inverted Index) w PostgreSQL jest przeznaczony dla kolumn tablicowych i zapewnia wydajną obsługę operatorów @>, <@ oraz &&.

ANY nie korzysta bezpośrednio z indeksu GIN, ale operatory części wspólnej i zawierania już tak.

-- 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'];

Szybkie sprawdzenie: operatory tablicowe

Sprawdź swoją wiedzę na temat operatorów wyszukiwania w tablicach PostgreSQL.

Podsumowanie lekcji

W tej lekcji poznali Państwo trzy podstawowe sposoby wyszukiwania wewnątrz tablic PostgreSQL:

  • = ANY(arr) — sprawdza, czy pojedyncza wartość występuje w dowolnym miejscu tablicy.
  • @> (zawieranie) — sprawdza, czy tablica zawiera wszystkie określone elementy.
  • && (część wspólna) — sprawdza, czy tablica ma z inną tablicą co najmniej jeden wspólny element.

Poznali Państwo również operator <@ do sprawdzania odwrotnego zawierania, funkcję array_length do filtrowania według rozmiaru oraz indeks GIN przyspieszający wyszukiwanie w tablicach dużych zbiorów danych. Łączenie tych operatorów ze standardowymi warunkami WHERE zapewnia precyzyjną i elastyczną kontrolę nad danymi wielowartościowymi.

Często zadawane pytania

Czy lekcja „Wyszukiwanie wewnątrz tablic” jest bezpłatna?

Tak — pełny tekst „Wyszukiwanie wewnątrz tablic” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wyszukiwanie wewnątrz tablic”?

Operatory ANY, contains i overlap Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wyszukiwanie wewnątrz tablic”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy kolumn tablicowych
  2. Wyszukiwanie wewnątrz tablic
  3. UNNEST i agregowanie
  4. Tablice a znormalizowane tabele
← Powrót do SQL Academy