• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL - EXISTS - problem z definicją

+1 głos
926 wizyt
pytanie zadane 8 sierpnia 2022 w SQL, bazy danych przez Artek Stary wyjadacz (11,800 p.)

Przeglądałem różne tuturiale na temat SQL'owego EXISTS i zazwyczaj natrafiam na taką definicję:

The EXISTS operator is a logical operator that allows you to check whether a subquery returns any row. The EXISTS operator returns TRUE if the subquery returns one or more rows.

Przyznam szczerze taka definicja nie za bardzo mi pasuje, wyjaśnię dlaczego. Przykładowe zapytanie.

 

SELECT * FROM sales.orders o WHERE EXISTS ( SELECT customer_id FROM sales.customers c WHERE o.customer_id = c.customer_id AND city = 'San Jose' )

No to zgodnie z powyższą definicją to zapytanie w zależności od tego co zwróci podzapytanie powinno przyjąć jedno z dwóch możliwych postaci skoro EXISTS zwraca true albo false - mianowicie :

SELECT * FROM sales.orders o WHERE true

albo

SELECT * FROM sales.orders o WHERE false

Czyli albo zwracałby wszystkie wiersze z tabeli albo żadnego. Oczywiście coś takiego jest mało przydatne i w praktyce widzimy, że to wcale tak nie działa. Jak zatem popranie zdefiniować działanie EXISTS ? Czy nie lepszą definicją byłoby : wykonaj działanie (np. SELECT) operując tylko i wyłącznie na wierszach zwróconych przez podzapytanie zawarte w EXISTS ?

1 odpowiedź

+3 głosów
odpowiedź 8 sierpnia 2022 przez rafal.budzis Szeryf (86,440 p.)
wybrane 8 sierpnia 2022 przez Artek
 
Najlepsza

Z tego co widzę EXISTS działa tak jak jest napisane. Brakującym elementem jest to jak działa podzapytanie i where ;)

Można wyobrazić sobie że podzapytanie uruchamia się dla każdego wiersza osobno. Z  samym where jest podobnie. Gdy mamy proste zapytanie

SELECT * FROM sales.customers WHERE city = 'San Jose'

Nie mówimy że jest to warunek "city = 'San Jose'" jest dla jednego wiersza lecz wyobrażamy sobie że ten warunek będzie sprawdzony wiele razy.

EDIT: Twoja definicja jest błędna ponieważ EXISTS  można użyć poza WHERE ;) NP tak 

SELECT *, EXISTS ( SELECT customer_id FROM sales.customers c WHERE o.customer_id = c.customer_id AND city = 'San Jose' ) as isExist FROM sales.orders o

 

komentarz 8 sierpnia 2022 przez Artek Stary wyjadacz (11,800 p.)

Czyli jak rozumiem sprawdza przebiera/leci po kolei po wszystkich wierszach z tabeli sales.orders po czym podstawia dane z tego wiersza do podzapytania i jeżeli podzapytanie coś zwraca to wtedy exists jest true i wtedy wiersz jest dodawany do wyników zapytania?

2
komentarz 8 sierpnia 2022 przez rafal.budzis Szeryf (86,440 p.)
Dokładnie tak to możemy interpretować. Jednak nie jestem pewny jak to działa dokładnie pod maską ponieważ bazy danych są nieco bardziej skomplikowane.

Podobne pytania

+1 głos
1 odpowiedź 491 wizyt
pytanie zadane 14 kwietnia 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 884 wizyt
pytanie zadane 12 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 626 wizyt
pytanie zadane 20 stycznia 2020 w SQL, bazy danych przez Whistleroosh Maniak (57,400 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...