Direkt zum Hauptinhalt springen
eLearner.app
Modul 5 · Lektion 3 von 419/57 im Kurs~10 min
Lektionen des Moduls (3/4)

OUTER JOIN: Die „Lücken“ finden

In Modul 3 haben Sie LEFT JOIN gesehen: Behalten Sie alle Zeilen auf der linken Seite, auch diese ohne Übereinstimmung auf der rechten Seite (die zu NULL werden). In diesem Kapitel haben wir Erweitern Sie das Toolkit mit RIGHT JOIN und FULL OUTER JOIN, und wir lernen wie man sie verwendet, um die „Lücken“ in den Daten zu finden: Zeilen in einer Tabelle, die kein Gegenstück im anderen haben.

Die drei Arten von OUTER JOIN

SQL
A LEFT  JOIN B  ON-- tutte le righe di A, con o senza match in B
A RIGHT JOIN B  ON-- tutte le righe di B, con o senza match in A
A FULL  JOIN B  ON-- tutte le righe di A *e* di B; NULL dove non c'è match

A RIGHT JOIN B kann jederzeit mit demselben in B LEFT JOIN A umgeschrieben werden ON: Es ist eine Frage der Lesbarkeit. Viele Stile (einschließlich dieses Kurses) Verwenden Sie aus Konsistenzgründen lieber immer LEFT JOIN.

Das „Anti-Join“-Muster: Die fehlenden finden

Die häufigste Verwendung von LEFT JOIN ist „nicht mit den Daten anreichern“. rechts", aber finden Sie die Zeilen auf der linken Seite, für die es KEINE Übereinstimmung gibt richtig. Es heißt ein Anti-Join:

SQL
-- Prodotti senza nessuna recensione:
SELECT p.id, p.name
FROM   products p
LEFT JOIN reviews r ON r.product_id = p.id
WHERE  r.id IS NULL
ORDER BY p.id;

Musterlogik:

  1. LEFT JOIN fügt die Bewertungen jedes Produkts bei, falls vorhanden;
  2. Bei Produkten ohne Bewertungen sind alle r-Spalten NULL;
  3. WHERE r.id IS NULL behält nur diese Produkte.

Schlüsselprüfung: ein id IS NULL für eine NOT NULL-Spalte der rechten Tabelle bedeutet "es gab keine Übereinstimmung". Sie filtern oft nach der PK der rechten Hand Tisch genau aus diesem Grund.

VOLLSTÄNDIGER ÄUSSERER JOIN

FULL OUTER JOIN hält beide Seiten ohne Übereinstimmung. Es wird selten verwendet, Typischerweise für Datenintegritätsprüfungen:

SQL
SELECT c.id AS customer_id, o.id AS order_id
FROM   customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id
WHERE  c.id IS NULL OR o.id IS NULL;

Zeilen mit c.id IS NULL wären verwaiste Aufträge (ein customer_id, der existiert nicht in customers). Diejenigen mit o.id IS NULL sind Kunden ohne Befehle. In unserem Datensatz garantieren die Fremdschlüssel, dass kein Waisenschlüssel vorhanden ist Aufträge liegen vor; Es bleiben nur die Kunden ohne Bestellungen übrig.

Probieren Sie es selbst aus

Übung#sql.m5.l3.e1
Versuche: 0Wird geladen…

Finden Sie alle Produkte, die ich noch nicht gelesen habe. Mostra solo la colonna name. Ordina pro Name.

Editor wird geladen…
Hinweis anzeigen

Muster Anti-Join: LEFT JOIN prüft su Produkt-ID, POI, WO r.id NULL IST.

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#sql.m5.l3.e2
Versuche: 0Wird geladen…

Ich suche Kunden, die ich nicht beauftragen konnte. Mostra-E-Mail. Bestellung per E-Mail.

Editor wird geladen…
Hinweis anzeigen

Stesso Pattern dell'esercizio previous, ma fra Kunden und Bestellungen.

Lösung nach 3 Versuchen verfügbar