Różnica miedzy where a on t-sql

Różnica miedzy where a on t-sql
WY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Witam. Pytanie banalne, ale proszę o podanie różnicy pomiędzy zapytaniami.Jaka jest różnica jak coś jest w joinie, a coś w where
(Tabele są wymyślone)
1
select *
from tabelaImie join tabelaNazwisko on IDimie=IDnazwisko and Wiek=8

2
select *
from tabelaImie join tabelaNazwisko on IDimie=IDnazwisko
where Wiek = 8

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3890
1

Nie ma różnicy między tymi zapytaniami. Oba zwrócą to samo. Zakładam ze brak nazw tabel w on jest celowy...

Mówimy o SQL gdzie klika rzeczy można robić na kilka sposobów...

Różnice zaczynają się przy left/right join bo wtedy zapytanie 1 zwroci ci wszystkie rekordy
Z tabela imię, a drugie sprawi ze dane będą jak w inner joinie...

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
1

w takim wypadku nie ale przy left join right join outer join już jest i to ogromna.- przy WHERE warunek dotyczy wszystkich rekordów - zarówno tabelaImie jak i tabelaNazwisko, przy ON warunek dotyczy TYLKO tabelaNazwisko

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Tak, jak napisał @abrakadaber - wersja z "on" będzie bardziej optymalna.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3890
0

@Juhas: dla zapytań prezentowanych przez OP nie będzie żadnej różnicy plan zapytania będzie identyczny.
Przy lef/right nie chodzi o to co optymalne tylko co się chce wyciągnąć, bo nie da się dowolnie wstawiać warunków albo w w on albo w where

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

@Panczo: zgoda, ale gdy masz w warunku where, to są filtrowane wszystkie pobrane wcześniej rekordy. Natomiast, gdy używasz on w join, to do przefiltrowania masz mniej rekordów. Mówię pod kątem optymalizacji bazy danych. Jeśli jest select z jednym joinem, no to różnicy w szybkości nie będzie.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3890
2

Plan wykonania dla inner joina temu przeczy....

To może mieć znaczenie dla optymalizacji, ale niekoniecznie musi. Przecież my tu rozmawiamy o warunku łączenia tabel i własciwości inner joina która pozwala wyfiltrować rekordy, wiem do czego zmierzasz, bo to można zobrazować zapisem:

Kopiuj
select *
from tabelaImie join (select * from tabelaNazwisko where wiek=8) t on IDimie=IDnazwisko 

ale zawsze chodzi o rekordy które chcemy wyciągnąć i tak:

Kopiuj
select *
from tabelaImie left join tabelaNazwisko on IDimie=IDnazwisko and Wiek=8

nie da takich samych wyników jak:

Kopiuj
select *
from tabelaImie left join tabelaNazwisko on IDimie=IDnazwisko 
where Wiek=8

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.