PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak filtrować wyniki zapytań w PostgreSQL


Wprowadzenie

Aby pracować z danymi w bazie danych, musisz mieć możliwość skutecznego pobierania i kierowania określonych rekordów. Używając klauzul filtrujących w zapytaniach, możesz dodać określone kryteria, aby zwrócić tylko najbardziej odpowiednie rekordy.

W tym przewodniku przyjrzymy się niektórym z najczęstszych operacji filtrowania dostępnych w PostgreSQL i zademonstrujemy, jak ich używać, aby zawęzić zakres swoich instrukcji. Pokażemy, jak testować względem cech w poszczególnych rekordach za pomocą WHERE klauzule, jak grupować rekordy razem, aby podsumować informacje za pomocą GROUP BY , jak filtrować grupy rekordów za pomocą HAVING podrozdział i jak ustawić maksymalną liczbę zwracanych wierszy za pomocą LIMIT klauzula.



Korzystanie z GDZIE klauzula określająca kryteria dopasowania

Jednym z najczęstszych i najbardziej użytecznych sposobów wskazania wymagań dotyczących zapytania jest GDZIE klauzula. GDZIE klauzula umożliwia zdefiniowanie rzeczywistych kryteriów wyszukiwania dla zapytań poprzez określenie warunków, które muszą być spełnione dla wszystkich pasujących rekordów.

GDZIE klauzule działają poprzez zdefiniowanie wyrażeń logicznych, które są sprawdzane względem każdego kandydującego wiersza danych. Jeśli wynik wyrażenia jest fałszywy, wiersz zostanie usunięty z wyników i nie zostanie zwrócony lub przejdzie do kolejnego etapu przetwarzania. Jeśli wynik wyrażenia jest prawdziwy, spełnia kryteria wyszukiwania i będzie kontynuowany do dalszego przetwarzania jako wiersz kandydata.

Podstawowa składnia WHERE klauzula wygląda tak:

SELECT * FROM my_table WHERE <condition>;

może być dowolną wartością logiczną. W PostgreSQL wartością logiczną jest dowolna z PRAWDA , FAŁSZ lub NULL .

Warunki są często tworzone przy użyciu jednego lub więcej z następujących operatorów:

  • = :równe
  • :większe niż
  • < :mniej niż
  • >= :większe lub równe
  • <= :mniejsze lub równe
  • <> lub != :nie równe
  • I :operator logiczny „i” — łączy dwa warunki i zwraca PRAWDA jeśli oba warunki są PRAWDA
  • LUB :operator logiczny „lub” — łączy dwa warunki i zwraca PRAWDA jeśli przynajmniej jeden z warunków jest PRAWDA
  • W :wartość znajduje się na liście, serii lub zakresie, który następuje
  • POMIĘDZY :wartość jest zawarta w zakresie następujących wartości minimalnych i maksymalnych, włącznie
  • JEST NULL :pasuje, jeśli wartość to NULL
  • NIE :neguje następującą wartość logiczną
  • ISTNIEJE :następujące zapytanie zawiera wyniki
  • LUBIĘ :pasuje do wzorca (używając symboli wieloznacznych % aby dopasować 0 lub więcej znaków i _ dopasować pojedynczy znak)
  • ILIKE :pasuje do wzorca (używając symboli wieloznacznych % aby dopasować 0 lub więcej znaków i _ aby dopasować pojedynczy znak), bez uwzględniania wielkości liter
  • PODOBNE DO :pasuje do wzorca przy użyciu dialektu wyrażeń regularnych SQL
  • ~ :pasuje do wzorca przy użyciu wyrażeń regularnych POSIX, z uwzględnieniem wielkości liter
  • ~* :pasuje do wzorca przy użyciu wyrażeń regularnych POSIX, bez uwzględniania wielkości liter
  • !~ :nie pasuje do wzorca przy użyciu wyrażeń regularnych POSIX, z uwzględnieniem wielkości liter
  • !~* :nie pasuje do wzorca przy użyciu wyrażeń regularnych POSIX, bez uwzględniania wielkości liter

Chociaż powyższa lista przedstawia niektóre z najczęstszych konstrukcji testowych, istnieje wiele innych operatorów, które dają wyniki logiczne, których można używać w połączeniu z WHERE klauzula.


Przykłady użycia WHERE

Jednym z najczęstszych i najprostszych testów jest równość przy użyciu = operator. Tutaj sprawdzamy, czy każdy wiersz w kliencie tabela ma nazwisko wartość równa Kowalski :

SELECT * FROM customer WHERE last_name = 'Smith';

Możemy dodać do tego dodatkowe warunki, aby utworzyć wyrażenia złożone za pomocą operatorów logicznych. W tym przykładzie użyto ORAZ klauzula, aby dodać dodatkowy test przeciwko first_name kolumna. Prawidłowe wiersze muszą spełniać oba podane warunki:

SELECT * FROM customer WHERE first_name = 'John' AND last_name = 'Smith';

Podobnie możemy sprawdzić, czy spełniony jest którykolwiek z szeregu warunków. Tutaj sprawdzamy wiersze z adresu tabeli, aby sprawdzić, czy kod_zip wartość jest równa 60626 lub sąsiedztwo kolumna jest równa ciągowi „Park Rogera”. Używamy dwóch pojedynczych cudzysłowów, aby wskazać, że należy wyszukać dosłowny pojedynczy cudzysłów:

SELECT * FROM address WHERE zip_code = '60626' OR neighborhood = 'Roger''s Park';

IN operator może działać jak porównanie wielu wartości, ujętych w nawiasy. Jeśli istnieje dopasowanie z dowolną z podanych wartości, wyrażenie to PRAWDA :

SELECT * FROM customer WHERE last_name IN ('Smith', 'Johnson', 'Fredrich');

Tutaj sprawdzamy wzorzec ciągu za pomocą LIKE . % działa jako symbol wieloznaczny pasujący do zera lub więcej znaków, więc „Pete”, „Peter” i każdy inny ciąg rozpoczynający się od „Pete” będzie pasował:

SELECT * FROM customer WHERE last_name LIKE 'Pete%';

Moglibyśmy przeprowadzić podobne wyszukiwanie za pomocą ~* operator do sprawdzania dopasowań przy użyciu wyrażeń regularnych POSIX bez względu na wielkość liter. W takim przypadku sprawdzamy, czy wartość last_name zaczyna się od „d” i zawiera podciąg „on”, który pasowałby do nazw takich jak „Dickson”, „Donald” i „Devon”:

SELECT * FROM customer WHERE last_name ~* '^D.*on.*';

Możemy sprawdzić, czy numer ulicy znajduje się w bloku 4000 adresów za pomocą BETWEEN i ORAZ operatory do zdefiniowania zakresu włącznie:

SELECT * FROM address WHERE street_number BETWEEN 4000 AND 4999;

Tutaj możemy wyświetlić dowolnego klienta wpisy, które mają numery ubezpieczenia społecznego, które nie mają długości 9 cyfr. Używamy LENGTH() operator, aby uzyskać liczbę cyfr w polu i <> aby sprawdzić nierówności:

SELECT * FROM customer WHERE LENGTH(SSN) <> 9;



Korzystanie z GRUPA WG klauzula podsumowująca wiele rekordów

GRUPA WG klauzula jest kolejnym bardzo powszechnym sposobem filtrowania wyników poprzez reprezentowanie wielu wyników w jednym wierszu. Podstawowa składnia GROUP BY klauzula wygląda tak:

SELECT <columns> FROM some_table GROUP BY <columns_to_group>

Gdy GRUPA WEDŁUG klauzula jest dodawana do instrukcji, mówi PostgreSQL, aby wyświetlić pojedynczy wiersz dla każdej unikalnej wartości dla danej kolumny lub kolumn. Ma to kilka ważnych implikacji.

Ponieważ GROUP BY Klauzula jest sposobem reprezentowania wielu wierszy jako jednego wiersza, PostgreSQL może wykonać zapytanie tylko wtedy, gdy może obliczyć wartość dla każdej kolumny, którą ma wyświetlić. Oznacza to, że każda kolumna zidentyfikowana przez SELECT część oświadczenia musi być:

  • zawarte w GROUP BY klauzula gwarantująca, że ​​każdy wiersz ma unikalną wartość
  • streszczenie podsumowujące wszystkie wiersze w każdej grupie

Praktycznie rzecz biorąc, oznacza to, że dowolne kolumny w SELECT lista nie jest zawarta w GROUP BY klauzula musi używać funkcji agregującej, aby wygenerować pojedynczy wynik dla kolumny dla każdej grupy.


Przykłady użycia GROUP BY

W przypadku przykładów w tej sekcji załóżmy, że mamy tabelę o nazwie pet które zdefiniowaliśmy i wypełniliśmy w następujący sposób:

CREATE TABLE pet (    id SERIAL PRIMARY KEY,    type TEXT,    name TEXT,    color TEXT,    age INT);INSERT INTO pet (type, name, color, age) VALUES('dog', 'Spot', 'brown', 3),('dog', 'Rover', 'black', 7),('dog', 'Sally', 'brown', 1),('cat', 'Sabrina', 'black', 8),('cat', 'Felix', 'white', 4),('cat', 'Simon', 'orange', 8),('rabbit', 'Buttons', 'grey', 4),('rabbit', 'Bunny', 'brown', 8),('rabbit', 'Briony', 'brown', 6);

Najprostsze użycie GROUP BY jest wyświetlenie zakresu unikalnych wartości dla pojedynczej kolumny. Aby to zrobić, użyj tej samej kolumny w SELECT i GRUPA WG . Tutaj widzimy wszystkie kolory użyte w tabeli:

SELECT color FROM pet GROUP BY color;
 color-------- black grey brown white orange(5 rows)

Gdy przejdziesz poza pojedynczą kolumnę w SELECT lista kolumn, musisz dodać kolumny do GROUP BY lub użyj funkcji agregującej, aby wytworzyć pojedynczą wartość dla reprezentowanej grupy wierszy.

Tutaj dodajemy typ do GRUPA WG klauzula, co oznacza, że ​​każdy wiersz będzie reprezentował unikalną kombinację typ i kolor wartości. Dodajemy również wiek kolumna, podsumowana przez avg() funkcja, aby znaleźć średni wiek każdej z grup:

SELECT type, color, avg(age) AS average_age FROM pet GROUP BY type, color;
  type  | color  |     average_age--------+--------+-------------------- rabbit | brown  | 7.0000000000000000 cat    | black  | 8.0000000000000000 rabbit | grey   | 4.0000000000000000 dog    | black  | 7.0000000000000000 dog    | brown  | 2.0000000000000000 cat    | orange | 8.0000000000000000 cat    | white  | 4.0000000000000000(7 rows)

Funkcje agregujące działają równie dobrze z pojedynczą kolumną w GROUP BY klauzula. Tutaj znajdujemy średni wiek każdego rodzaju zwierząt:

SELECT type, avg(age) AS average_age FROM PET GROUP BY type;
  type  |     average_age--------+-------------------- rabbit | 6.0000000000000000 dog    | 3.6666666666666667 cat    | 6.6666666666666667(3 rows)

Jeśli chcemy wyświetlić najstarsze z każdego rodzaju zwierzęcia, możemy zamiast tego użyć max() funkcja na wiek kolumna. GRUPA WG klauzula zwija wyniki do tych samych wierszy co poprzednio, ale nowa funkcja zmienia wynik w drugiej kolumnie:

SELECT type, max(age) AS oldest FROM pet GROUP BY type;
  type  | oldest--------+------- rabbit |     8 dog    |     7 cat    |     8(3 rows)



Korzystanie z POSIADAJĄC klauzula filtrowania grup rekordów

GRUPA WG klauzula jest sposobem podsumowania danych poprzez zwinięcie wielu rekordów w jeden reprezentatywny wiersz. Ale co, jeśli chcesz zawęzić te grupy na podstawie dodatkowych czynników?

POSIADAJĄC klauzula jest modyfikatorem dla GROUP BY klauzula, która pozwala określić warunki, które każda grupa musi spełnić, aby została uwzględniona w wynikach.

Ogólna składnia wygląda tak:

SELECT <columns> FROM some_table GROUP BY <columns_to_group> HAVING <condition>

Operacja jest bardzo podobna do GDZIE klauzula, z tą różnicą, że GDZIE filtruje pojedyncze rekordy i HAVING filtruje grupy rekordów.


Przykłady użycia HAVING

Korzystając z tej samej tabeli, którą przedstawiliśmy w poprzedniej sekcji, możemy zademonstrować, jak HAVING klauzula działa.

Tutaj grupujemy wiersze zwierzaka tabela według unikalnych wartości w typ kolumna, znalezienie minimalnej wartości age także. POSIADAJĄC klauzula, a następnie filtruje wyniki, aby usunąć wszystkie grupy, których wiek nie jest większy niż 1:

SELECT type, min(age) AS youngest FROM pet GROUP BY type HAVING min(age) > 1;
  type  | youngest--------+---------- rabbit |        4 cat    |        4(2 rows)

W tym przykładzie grupujemy wiersze w pet według ich koloru. Następnie filtrujemy grupy, które reprezentują tylko jeden wiersz. Wynik pokazuje nam każdy kolor, który pojawia się więcej niż raz:

SELECT color FROM pet GROUP BY color HAVING count(color) > 1;
 color------- black brown(2 rows)

Możemy wykonać podobne zapytanie, aby uzyskać kombinacje typ i kolor że tylko jedno zwierzę ma:

SELECT type, color FROM pet GROUP BY type, color HAVING count(color) = 1;
  type  | color--------+-------- cat    | black rabbit | grey dog    | black cat    | orange cat    | white(5 rows)



Korzystanie z LIMIT klauzula określająca maksymalną liczbę rekordów

LIMIT Klauzula oferuje inne podejście do parowania rekordów zwracanych przez zapytanie. Zamiast eliminować wiersze danych na podstawie kryteriów w samym wierszu, LIMIT klauzula określa maksymalną liczbę rekordów zwracanych przez zapytanie.

Podstawowa składnia LIMIT wygląda tak:

SELECT * FROM my_table LIMIT <num_rows> [OFFSET <num_rows_to_skip>];

Tutaj wskazuje maksymalną liczbę wierszy do wyświetlenia z wykonanego zapytania. Jest to często używane w połączeniu z ORDER BY klauzule, aby uzyskać wiersze z najbardziej ekstremalnymi wartościami w określonej kolumnie. Na przykład, aby uzyskać pięć najlepszych wyników na egzaminie, użytkownik może ORDER BY wynik kolumna, a następnie LIMIT wyniki do 5.

Podczas gdy LIMIT domyślnie liczy od góry wyników, opcjonalny OFFSET słowo kluczowe może służyć do przesunięcia pozycji początkowej, której używa. W efekcie pozwala to na stronicowanie wyników, wyświetlając liczbę wyników określoną przez LIMIT a następnie dodając LIMIT numer do OFFSET aby pobrać następującą stronę.


Przykłady użycia LIMIT

Użyjemy zwierzaka tabela z wcześniejszych przykładów w tej sekcji.

Jak wspomniano powyżej, LIMIT jest często łączony z ORDER BY klauzula, aby wyraźnie zdefiniować kolejność wierszy przed wycięciem odpowiedniej liczby. Tutaj sortujemy zwierzę wpisy według ich wiek , od najstarszego do najmłodszego. Następnie używamy LIMIT aby wyświetlić 5 najstarszych zwierząt:

SELECT * FROM pet ORDER BY age DESC LIMIT 5;
  type  |  name   | color  | age | id--------+---------+--------+-----+---- cat    | Simon   | orange |   8 |  6 cat    | Sabrina | black  |   8 |  4 rabbit | Bunny   | brown  |   8 |  8 dog    | Rover   | black  |   7 |  2 rabbit | Briany  | brown  |   6 |  9(5 rows)

Bez ORDER BY klauzula, LIMIT dokona wyboru w całkowicie przewidywalny sposób. Zwracane wyniki mogą wynikać z kolejności wpisów w tabeli lub według indeksów. Nie zawsze jest to złe.

Jeśli potrzebujemy rekordu dla pojedynczego psa w tabeli moglibyśmy skonstruować zapytanie takie jak to. Należy pamiętać, że chociaż wynik może być trudny do przewidzenia, nie jest to wybór losowy i nie należy go w ten sposób używać:

SELECT * FROM pet WHERE type = 'dog' LIMIT 1;
 type | name | color | age | id------+------+-------+-----+---- dog  | Spot | brown |   3 |  1(1 row)

Możemy użyć OFFSET klauzula dotycząca stronicowania wyników. Dołączamy ORDER BY klauzula określająca konkretną kolejność wyników.

W przypadku pierwszego zapytania ograniczamy wyniki bez określania OFFSET aby zdobyć pierwsze 3 najmłodsze wpisy:

SELECT * FROM pet ORDER BY age LIMIT 3;
 type | name  | color | age | id------+-------+-------+-----+---- dog  | Sally | brown |   1 |  3 dog  | Spot  | brown |   3 |  1 cat  | Felix | white |   4 |  5(3 rows)

Aby otrzymać kolejne 3 najmłodszych, możemy dodać liczbę zdefiniowaną w LIMIT do PRZESUNIĘCIE aby pominąć wyniki, które już pobraliśmy:

SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 3;
  type  |  name   | color | age | id --------+---------+-------+-----+---- rabbit | Buttons | grey  |   4 |  7 rabbit | Briany  | brown |   6 |  9 dog    | Rover   | black |   7 |  2(3 rows)

Jeśli dodamy LIMIT do PRZESUNIĘCIE ponownie otrzymamy kolejne 3 wyniki:

SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 6;
  type  |  name   | color  | age | id--------+---------+--------+-----+---- cat    | Simon   | orange |   8 |  6 rabbit | Bunny   | brown  |   8 |  8 cat    | Sabrina | black  |   8 |  4(3 rows)

To pozwala nam pobierać wiersze danych z zapytania w łatwych do zarządzania porcjach.




Wniosek

Istnieje wiele sposobów filtrowania i ograniczania w inny sposób wyników uzyskiwanych z zapytań. Klauzule takie jak WHERE i POSIADAJĄC ocenić potencjalne wiersze lub grupy wierszy, aby sprawdzić, czy spełniają określone kryteria. GRUPA WG klauzula pomaga podsumować dane, grupując razem rekordy, które mają wspólną wartość co najmniej jednej kolumny. LIMIT klauzula oferuje użytkownikom możliwość ustawienia sztywnego maksimum liczby rekordów do pobrania.

Nauczenie się, jak te klauzule mogą być stosowane pojedynczo lub w połączeniu, pozwoli Ci wyodrębnić określone dane z dużych zbiorów danych. Modyfikatory zapytań i filtry są niezbędne do przekształcania danych znajdujących się w PostgreSQL w przydatne odpowiedzi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić kodowanie kolekcji szablonów bazy danych

  2. PG::InvalidParameterValue:ERROR:nieprawidłowa wartość parametru client_min_messages:panika

  3. Nie można połączyć się z bazą danych heroku postgresql z aplikacji lokalnego węzła za pomocą sequelize

  4. Czy INSERT [...] ON CONFLICT można użyć do naruszeń kluczy obcych?

  5. Błąd:Uwierzytelnianie peera nie powiodło się dla postgres użytkownika podczas próby uruchomienia pgsql działającego z szynami