JOIN pozwala łączyć kilka tabel w jednym zapytaniu SELECT na podstawie określonego warunku, zazwyczaj za pomocą słowa kluczowego ON. Podzapytanie (lub zapytanie zagnieżdżone) to zapytanie umieszczone wewnątrz innego zapytania. JOIN lepiej działa na dużych tabelach z dobrymi indeksami, jest bardziej przezroczysty dla optymalizatora i zazwyczaj działa szybciej. Podzapytania są wygodne w przypadku konieczności obliczenia agregatów lub przy istnieniu warunków, które są niemożliwe do wyrażenia za pomocą JOIN (np. zapytania skorelowane).
Przykład JOIN:
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;
Przykład podzapytania:
SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscow' );
"Czy użycie podzapytania jest zawsze wolniejsze niż użycie JOIN?"
Odpowiedź: Nie zawsze! Poprawnie napisane podzapytania często są przekształcane przez optymalizatora w wewnętrzne JOIN'y. Ponadto, czasami podzapytanie jest bardziej efektywne — na przykład, gdy zewnętrzne zapytanie działa na małym zbiorze danych, a podzapytanie zwraca wcześniej zagregowane wyniki.
Przykład:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
To podzapytanie zostanie wykonane tylko raz.
Historia
W dużym projekcie do raportowania używano zagnieżdżonych podzapytań zamiast JOIN. Wraz ze wzrostem objętości danych zapytanie zaczęło zajmować kilka minut zamiast sekund. Po zastąpieniu podzapytań JOIN wydajność wzrosła dziesięciokrotnie.
Historia
W jednym z projektów analityk przepisał zapytanie z GROUP BY na podzapytanie, nie zauważając, że w wyniku zaczęły pojawiać się duplikaty na poziomie JOIN. Doprowadziło to do nieprawidłowych danych w raportach - sumy były zawyżone z powodu iloczynu kartezjańskiego.
Historia
Użycie skorelowanego podzapytania w zewnętrznej pętli (dla każdego wiersza) doprowadziło do całkowitej degradacji wydajności przy wzroście tabeli. Zdecydowano się na JOIN z agregowaniem — czas przetwarzania zapytań skrócił się z godzin do minut.