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

sql wyciaganie danych z wielu tabel - jaki sens maja JOIN'y?

Object Storage Arubacloud
+2 głosów
526 wizyt
pytanie zadane 22 października 2018 w SQL, bazy danych przez niezalogowany

witam, tak sobie doczytuje o metodach wyciagania danych i zastanawiam sie jaki sens maja joiny?

 

otóż moje zapytania:

select * FROM auta as a
JOIN wypozyczenia as w on a.idauta = w.idauta ORDER BY w.idauta ASC;


SELECT * from auta as a, wypozyczenia as w
WHERE a.idauta = w.idauta  ORDER BY w.idauta ASC;

 

Czas pierwszego ; 0.0047

Czas drugiego :0.0026 

 

Tutaj to mzoe mala roznica ale jak ktos pisze duzo aplikacje i ma na prawde rozbuowane zapytania to takie JOIN'y strasznie spowalniaja.

 

Może mi ktoś wytłumaczyć łopatologicznie jakie zalety maja joiny ze warto je w ogole uzywac?

komentarz 22 października 2018 przez mbabane Szeryf (79,280 p.)
Ile wykonałeś pomiarów? Bo przy tak małym czasie to może być np. jakiś lag systemowy niż powodowany, przez samą bazę danych.

Zerknij także na to:

https://stackoverflow.com/questions/1129923/is-a-join-faster-than-a-where

Stosując JOIN poprawia się według mnie też czytelność, bo FROM czyta się jak zdanie.
komentarz 23 października 2018 przez areklipno Stary wyjadacz (11,930 p.)
Wybrałeś tylko jedno z niewielu zastosować joinów. Z np. left join czegoś takiego już nie zrobisz - czasem nulle, które wychodzą z tej operacji są dość "cenne".

Dodatkowo tak jak pisał kolega wyżej - w przypadku np. 5-10 tabel do połączenia w jednym zapytaniu zdecydowanie bardziej czytelne jest i szybciej działające jest użycie join niż pisanie wszystkich warunków przy where.
komentarz 23 października 2018 przez mbabane Szeryf (79,280 p.)

Z np. left join czegoś takiego już nie zrobisz

Da się w WHERE w oraclu np tak:

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID(+)
komentarz 23 października 2018 przez niezalogowany

a w jaki sposób w joinach moge laczyc wiecej niz 2 tabele?

 

select a.marka, k.imie, w.naleznosc from auta as a
JOIN wypozyczenia as w on a.idauta = w.idauta 
JOIN klienci as k on k.idklienta = w.idklienta 
ORDER BY w.idauta ASC;

 

czy ten sposob jest poprawny?

 

Generalnie jeżeli chodzi o różncie jak rozumiem to jest to tak na prawde kwestia czytelnosci kodu oraz jego długość dobrze to rozumiem?

komentarz 23 października 2018 przez areklipno Stary wyjadacz (11,930 p.)

@mbabane,
Na oraclu nigdy nie pracowałem więc nie jestem w stanie więcej powiedzieć...

@Raptor,

Sposób przedstawiony przez Ciebie jest poprawny. Join, który użyłeś jest jednym z kilku. Fajnie jest to pokazane tutaj (ilustracja z okręgami)

1 odpowiedź

+1 głos
odpowiedź 25 października 2018 przez Catalonya1992 Mądrala (5,440 p.)
Nagrałem pare dni temu odcinek w którym wyjaśniam podstawy joinów oraz sens ich używania. Tutaj znajdziesz odcinek: https://www.youtube.com/watch?v=MOCe2a-Wkmg&list=PL8g9gILZp1OJpjlu7AuR9Ysu4z5Rff_AQ&index=13

Co do Twojego pytania. Joiny możemy dzielić na kilka kategorii, zależy jakie kryterium przyjmiesz. Tzn. ze względu na wersję standardu mamy ANSI(89), czyli łączenie gdzie warunek jest w where lub ANSI(92), gdzie warunek piszemy po słowie on.

Głowna różnica między tymi dwoma rodzajami to czytelność. Ja zdecydowanie preferuję ANSI92, bo dokładnie widać w jaki sposób połączone są tabele. W przypadku ANSI89 nie wygląda to już tak dobrze, poza tym można się natknąć na kilka mało zrozumiałych błędów, gdy korzystasz z (+).  Jeśli chciałbyś przetestować wydajność takich wiązań to powinieneś takie zapytanie wykonać w pętli, np. 10000 razy kilka razy w ciągu pracy serwera (chyba, że testujesz lokalnie i obciążenie jest zawsze takie same).

Inne rodzaje łączeń to łączenia ze względu na rodzaj danych jakie chcemy uzyskać, np. left, right, inner i outer join.

Generalnie zachęcam do łączenia z warunkiem w on. Ostatnio naprawiałem błąd w kodzie, bo ktoś dodał do dosyć długiej listy tabel kolejną tabelę i "chyba zapomniał" dodać warunku przez co zrobił się iloczyn kartezjański. W łączeniu w on taka sytuacja by nie wystąpiła bo musiałbyś napisać jakikolwiek warunek, bo inaczej nie powiążesz 2 tabel. Poza tym w przypadku łączenia w where nie widać co ogranicza rekordy (zwykły where) a co jest where łączącym tabele.

Jeśli chodzi o łączenie kilku tabel to działa to dokładnie tak samo jak łączenie 2 tabelach. Najpierw łączysz A z tabelą B (stanowią one wtedy koncepcyjnie jedną tabelę) a później tabele C z tabelą A lub B lub warunek na obie te tabele.

W razie pytań pisz :)

Podobne pytania

0 głosów
2 odpowiedzi 279 wizyt
pytanie zadane 3 lutego 2018 w SQL, bazy danych przez Dynamic Bywalec (2,910 p.)
0 głosów
1 odpowiedź 1,673 wizyt
pytanie zadane 29 stycznia 2018 w SQL, bazy danych przez Dagon Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 167 wizyt
pytanie zadane 24 stycznia 2018 w SQL, bazy danych przez Anoonymous Obywatel (1,560 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...