Różnica miedzy where a on t-sql

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

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...

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

0

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

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

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.

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:

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:

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

nie da takich samych wyników jak:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0