Een JOIN-clause is een onderdeel van een SQL-query, waardoor records van twee of meer tabellen uit een database gecombineerd kunnen worden.

Er zijn twee soorten joins in SQL volgens de ANSI-standaard, een inner-join en een outer-join. Een outer-join kan op zijn beurt weer left, right of full zijn.

Een left outer join doet een query op één tabel en zoekt dan bij elk resultaatrecord extra velden van de tweede tabel. De syntaxis is als volgt:

 SELECT * FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.veld = tabel2.veld

Een left outer join garandeert dus de aanwezigheid van alle rijen van de linker tabel (hier tabel1). Een inner-join doet dat niet, omdat rijen van tabel1 waarvoor er in tabel2 geen enkele rij gevonden wordt waarvoor tabel1.veld = tabel2.veld niet getoond worden.

Dit kan aangevuld worden met de WHERE-clause en de andere clauses. In de ON-clause wordt gespecificeerd welke velden van de beide tabellen overeen moeten komen. Dit wordt gebruikt om de goede records van de tweede tabel bij de eerste te vinden. Indien geen record in tabel2 gevonden wordt is er toch een resultaatrecord, weliswaar met lege velden (NULL's) in het deel dat uit tabel2 afkomstig is. De sleutelwoordcombinatie RIGHT OUTER JOIN kan ook gebruikt worden. Verwissel in dat geval tabel1 en tabel2 in de uitleg hierboven. Een FULL OUTER JOIN ten slotte garandeert de aanwezigheid van alle rijen van zowel tabel1 als tabel2: het resultaat is dus de UNION van de LEFT OUTER JOIN en de RIGHT OUTER JOIN.

Tabel "T1" Tabel "T2" Query Resultaat
C1 C2
1 a
1 b
2 b
C1 C2
1 x
1 y
3 y
SELECT *
FROM T1
    INNER JOIN
  T2
    ON T1.C1 = T2.C1;
T1.C1 T1.C2 T2.C1 T2.C2
1 a 1 x
1 a 1 y
1 b 1 x
1 b 1 y
SELECT T1.C2, T2.C2
FROM T1
    LEFT OUTER JOIN
 T2
 ON T1.C1 = T2.C1;
T1.C2 T2.C2
a x
a y
b x
b y
b NULL
SELECT T1.C2, T2.C2
FROM T1
    RIGHT OUTER JOIN
 T2
 ON T1.C1 = T2.C1;
T1.C2 T2.C2
a x
a y
b x
b y
NULL y
SELECT T1.C2, T2.C2
FROM T1
    FULL OUTER JOIN
  T2
    ON T1.C1 = T2.C1;
T1.C2 T2.C2
a x
a y
b x
b y
b NULL
NULL y

Een inner-join is in eerste instantie gelijk aan wat men in de verzamelingenleer en in de relationele algebra het cartesisch product noemt. Dit wil zeggen dat het resultaat alle combinaties van records van de eerste tabel met alle records van de tweede tabel bevat. In tweede instantie — na het ON-keyword — worden deze records gefilterd zodat enkel de rijen overblijven waarvan de velden, die in de ON-clause gespecificeerd zijn, overeenkomen. De syntaxis is als volgt:

 SELECT * FROM tabel1 INNER JOIN tabel2 ON tabel1.veld = tabel2.veld

Het aantal resultaatrecords van een inner-join kan maximaal oplopen tot het aantal records in het cartesisch product. Records van tabel1 waarvoor geen overeenkomstige records in tabel2 worden gevonden, worden niet getoond; daarvoor is de eerder vermelde OUTER JOIN. Anderzijds worden records van tabel1 waarvoor meerdere overeenkomstige records van tabel2 worden gevonden, ook evenzoveel keer getoond.

Voorheen werd de inner-join anders geformuleerd, namelijk zonder de ON-clause; de join-informatie stond gewoon in de WHERE-clause. Toen was een vergissing snel gemaakt. Een voorbeeld van de oude notatie:

 SELECT * FROM tabel1, tabel2 WHERE tabel1.veld = tabel2.veld

Deze notatie is nog steeds syntactisch correct, en logisch equivalent aan de inner-join.

Zie ook bewerken