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

SQL - EXISTS - problem z definicją

VPS Starter Arubacloud
+1 głos
473 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 (85,260 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 (85,260 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ź 298 wizyt
pytanie zadane 14 kwietnia 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 434 wizyt
pytanie zadane 12 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 299 wizyt
pytanie zadane 20 stycznia 2020 w SQL, bazy danych przez Whistleroosh Maniak (56,900 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...