programowanieProgramista SQL

Wyjaśnij różnicę między operatorem JOIN a podzapytaniami. Kiedy należy używać każdego z tych podejść? Podaj przykład użycia.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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' );

Pytanie podchwytliwe

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