Podsumowanie: W tym poradniku dowiesz się jak używać operatora PostgreSQL EXISTS
do testowania istnienia wierszy w podzapytaniu.
Wprowadzenie do PostgreSQL operator EXISTS
Operator EXISTS
jest operatorem boolean, który testuje istnienie wierszy w podzapytaniu.
Poniżej przedstawiono składnię operatora EXISTS
:
EXISTS (subquery)
Operator EXISTS
przyjmuje argument będący podzapytaniem.
Jeśli podzapytanie zwraca co najmniej jeden wiersz, wynikiem EXISTS
jest true. W przypadku, gdy podzapytanie nie zwraca żadnego wiersza, wynik EXISTS
jest fałszywy.
Operator EXISTS
jest często używany z podzapytaniem skorelowanym.
Wynik operatora EXISTS
zależy od tego, czy jakikolwiek wiersz zwrócony przez podzapytanie, a nie od zawartości wiersza. Dlatego kolumny, które występują w klauzuli SELECT
podzapytania nie są istotne.
Z tego powodu powszechną konwencją kodowania jest pisanie EXISTS
w następującej formie:
Zauważ, że jeśli podzapytanie zwraca NULL, wynikiem EXISTS
jest prawda.
PostgreSQL EXISTS przykłady
Do demonstracji użyjemy następujących tabel customer
i payment
w przykładowej bazie danych:
A) Znajdź klientów, którzy mają co najmniej jedną płatność, której kwota jest większa niż 11.
Następujące zapytanie zwraca klientów, którzy zapłacili przynajmniej jedną płatność za wynajem na kwotę większą niż 11:
SELECT first_name, last_nameFROM customer cWHERE EXISTS (SELECT 1 FROM payment p WHERE p.customer_id = c.customer_id AND amount > 11 )ORDER BY first_name, last_name;
Kwerenda zwraca następujące dane wyjściowe:
W tym przykładzie, dla każdego klienta w tabeli customer
, podzapytanie sprawdza tabelę payment
aby znaleźć czy ten klient dokonał przynajmniej jednej płatności (p.customer_id = c.customer_id
) i czy kwota jest większa niż 11 ( amount > 11
)
B) NOT EXISTS przykład
Operator NOT
neguje wynik operatora EXISTS
. Operator NOT EXISTS
jest przeciwny do operatora EXISTS
. Oznacza to, że jeśli podzapytanie nie zwróci żadnego wiersza, NOT EXISTS
zwraca wartość true. Jeśli podzapytanie zwraca jeden lub więcej wierszy, NOT EXISTS
zwraca false.
Następujący przykład zwraca klientów, którzy nie dokonali żadnej płatności większej niż 11.
SELECT first_name, last_nameFROM customer cWHERE NOT EXISTS (SELECT 1 FROM payment p WHERE p.customer_id = c.customer_id AND amount > 11 )ORDER BY first_name, last_name;
Tutaj jest wynik:
C) EXISTS i NULL
Jeśli podzapytanie zwraca NULL
EXISTS
zwraca true. Zobacz następujący przykład:
Code language: SQL (Structured Query Language) (sql)SELECTfirst_name,last_nameFROMcustomerWHEREEXISTS( SELECT NULL )ORDER BYfirst_name,last_name;
W tym przykładzie podzapytanie zwróciło NULL
, dlatego zapytanie zwróciło wszystkie wiersze z tabeli customer
.
W tym tutorialu dowiedziałeś się, jak wykorzystać funkcję PostgreSQL EXISTS
do testowania istnienia wierszy w podzapytaniu.
- Czy ten tutorial był pomocny?
- TakNie