DBAtlas · Atlas für Datenbankbetrieb

JOIN-Typen (INNER/LEFT/RIGHT/FULL/CROSS)

Oracle

-- INNER: matching rows
SELECT m.name, s.amount
FROM customer m JOIN orders s ON m.id = s.customer_id;
-- LEFT: customers without orders are included too
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
-- CROSS: Cartesian product
SELECT r.name, u.name FROM color r CROSS JOIN product u;

Ein JOIN verbindet zwei Tabellen anhand der angegebenen Bedingung. INNER liefert nur Treffer; LEFT/RIGHT liefern alle Zeilen einer Seite (NULL ohne Treffer); FULL liefert Zeilen beider Seiten; CROSS liefert alle Kombinationen. Neben Standard-ANSI-JOINs unterstützt Oracle auch die alte Outer-Join-Syntax (+).

PostgreSQL

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;

PostgreSQL unterstützt alle Standard-JOIN-Typen vollständig (INNER, LEFT/RIGHT/FULL OUTER, CROSS). USING(my_column) ist eine Kurzform für gleichnamige Spalten, NATURAL JOIN verknüpft automatisch über alle gleichnamigen Spalten (mit Vorsicht verwenden).

MySQL

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

-- MySQL has no FULL OUTER JOIN:
SELECT m.name, s.amount FROM customer m LEFT JOIN orders s ON m.id = s.customer_id
UNION
SELECT m.name, s.amount FROM customer m RIGHT JOIN orders s ON m.id = s.customer_id;

MySQL/MariaDB unterstützen INNER, LEFT, RIGHT und CROSS JOIN, bieten FULL OUTER JOIN aber nicht direkt; es wird nachgebildet, indem LEFT- und RIGHT-Ergebnisse mit UNION kombiniert werden. Der alte Komma-Join erzeugt ein kartesisches Produkt und muss mit ON/WHERE eingeschränkt werden.

SQL Server

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;

SQL Server unterstützt alle Standard-JOIN-Typen. Die alten Outer-Join-Operatoren *= / =* wurden entfernt; die ANSI-JOIN-Syntax ist zu verwenden. APPLY (CROSS/OUTER APPLY) ist eine zusätzliche Join-Form für zeilenweise korrelierte Unterabfragen.

MongoDB

// Closest equivalent: $lookup (left outer join)
db.customer.aggregate([
  { $lookup: {
      from: "orders",
      localField: "id",
      foreignField: "customer_id",
      as: "orders"
  } }
])

MongoDB hat keinen klassischen JOIN; die Aggregation-Stage $lookup holt passende Dokumente aus einer anderen Collection als Array (ähnlich einem Left Outer Join). Für ein INNER-ähnliches Ergebnis filterst du leere Arrays anschließend mit $match heraus und expandierst das Array mit $unwind in Zeilen.

Redis

# Not applicable: Redis has no tables or JOINs.

Redis bietet keine relationalen Joins; Daten werden meist denormalisiert, oder Beziehungen werden clientseitig durch Lesen mehrerer Schlüssel aufgebaut. Für eingeschränkte join-ähnliche Abfragen lässt sich RediSearch (FT.AGGREGATE) nutzen; der Support für das Modul RedisGraph endete 2023.

Elasticsearch

# Not applicable: there is no general JOIN in a distributed design.
# Limited options: nested, parent/child (join field),
# terms lookup. Data is usually denormalized at indexing time.

Aufgrund seiner verteilten Architektur bietet Elasticsearch keine beliebigen tabellenübergreifenden JOINs. Für eingeschränkte Beziehungen gibt es den Feldtyp 'nested' innerhalb eines Index und den Feldtyp 'join' (parent/child) auf demselben Shard. Die häufigste Lösung ist, die Daten beim Indexieren zu denormalisieren.

In DBAtlas öffnen →