W prawdziwych aplikacjach rzadko przechowujemy wszystko w jednej wielkiej tabeli – byłoby to nieefektywne i prowadziło do duplikacji danych. Zamiast tego, rozbijamy dane na mniejsze, powiązane ze sobą tabele (np. osobna tabela dla Użytkowników, osobna dla Kursów, osobna dla Wyników). Aby pobrać z nich kompletne informacje do wyświetlenia na ekranie, musimy je ze sobą połączyć.
Klauzula JOIN służy do łączenia wierszy z dwóch lub więcej tabel na podstawie powiązanej między nimi kolumny (zazwyczaj klucza obcego i klucza głównego).
Często zamiast pobierać pojedyncze wiersze, chcemy wyciągnąć statystyki – np. ilu kursantów jest zapisanych na dany kurs, albo jaka jest średnia z ich testów. Służą do tego wbudowane w bazę funkcje agregujące takie jak COUNT(), SUM(), czy AVG(), łączone zazwyczaj z klauzulą GROUP BY, która grupuje wiersze o tych samych wartościach.