ProgrammatieSQL-ontwikkelaar

Leg het verschil uit tussen de JOIN-operator en subquery's. Wanneer moet je elk van de benaderingen gebruiken? Geef een voorbeeld van gebruik.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

JOIN maakt het mogelijk om meerdere tabellen in één SELECT-query te combineren op basis van een bepaalde voorwaarde, meestal via het sleutelwoord ON. Een subquery (of geneste query) is een query die binnen een andere query is geplaatst. JOIN werkt beter voor het combineren van grote tabellen met goede indexen, het is transparanter voor de optimizer en wordt meestal sneller uitgevoerd. Subquery's zijn handig wanneer aggregaties moeten worden berekend of wanneer er voorwaarden zijn die niet mogelijk zijn via JOIN (bijvoorbeeld gecorreleerde query's).

Voorbeeld JOIN:

SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;

Voorbeeld van een subquery:

SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscow' );

Misleidende vraag

“Wordt aangenomen dat het gebruik van subquery's altijd langzamer is dan het gebruik van JOIN?”

Antwoord: Nee, niet altijd! Correct geschreven subquery's worden vaak door de optimizer omgezet in interne JOIN's. Bovendien kan een subquery soms efficiënter zijn — bijvoorbeeld wanneer de externe query werkt met een kleine hoeveelheid gegevens, en de subquery eerder geaggregeerde resultaten retourneert.

Voorbeeld:

SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

Dit subquery wordt één keer uitgevoerd.


Verhaal

In een groot project werden geneste subquery's gebruikt voor rapportage in plaats van JOIN. Toen de hoeveelheid gegevens toenam, begon de query minuten te duren in plaats van seconden. Na de vervangingen van subquery's door JOIN steeg de prestaties met een factor 10.


Verhaal

In een project herschreef een analist een query met GROUP BY naar een subquery, zonder op te merken dat er hierdoor duplicaten op het niveau van JOIN ontstonden. Dit leidde tot onjuiste gegevens in de rapporten — de totalen waren hoger door het cartesiaanse product.


Verhaal

Het gebruik van een gecorreleerde subquery in een externe cyclus (voor elke regel) leidde tot totale prestatieverval bij de groei van de tabel. We besloten om via JOIN met aggregatie — de verwerkingstijd van de queries werd verlaagd van uren tot minuten.