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

SQL - EXISTS - problem z definicją

Object Storage Arubacloud
+1 głos
527 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ź 309 wizyt
pytanie zadane 14 kwietnia 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 486 wizyt
pytanie zadane 12 marca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)
0 głosów
1 odpowiedź 321 wizyt
pytanie zadane 20 stycznia 2020 w SQL, bazy danych przez Whistleroosh Maniak (56,980 p.)

92,576 zapytań

141,425 odpowiedzi

319,650 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...