Zurück zur Artikelliste Artikel
8 Leseminuten

Ein illustrierter Leitfaden für den SQL Non Equi Join

Wussten Sie, dass eine Verknüpfung in SQL nicht auf identischen Übereinstimmungen beruhen muss? In diesem Beitrag befassen wir uns mit dem SQL-Non-Equi-Join, bei dem "Nicht-Gleichheits"-Operatoren zum Abgleichen von Datensätzen verwendet werden.

Wir haben bereits mehrere Arten von Joins besprochen, darunter Self-Joins und CROSS JOIN, INNER JOIN und OUTER JOIN. Diese Arten von Joins werden normalerweise mit dem Gleichheitszeichen (=) angezeigt. Einige Joins verwenden jedoch andere Bedingungen als das Gleichheitszeichen (=). Dies ist ein Beispiel für einen Nicht-Gleichheits-Join in SQL, über den wir in diesem Artikel sprechen werden.

Was ist ein Nicht-Gleichheits-Join in SQL?

Wenn Sie die anderen Beiträge in dieser Serie gelesen haben, wissen Sie, wie man SQL-Joins verwendet, um Datensätze auf der Grundlage exakter Wertübereinstimmungen zu kombinieren. Was aber, wenn Sie nach einem Datensatz suchen, für den keine exakte Übereinstimmung erforderlich ist? Angenommen, Sie möchten Datensätze auf der Grundlage eines Wertebereichs verknüpfen. Oder Sie suchen alle Datensätze, die mit einem bestimmten Wert nicht übereinstimmen. In diesen Fällen müssen Sie einen SQL non equi join verwenden.

Wie ein Self-Join hat auch ein SQL Non Equi Join kein spezielles Schlüsselwort; Sie werden die Worte NON EQUI JOIN in keinem SQL-Code finden. Stattdessen werden sie durch den Typ des Operators in der Join-Bedingung definiert: Alles außer einem Gleichheitszeichen bedeutet einen Non-Equi-Join. Wie Sie im nachstehenden Kasten sehen werden, ist das Gleichheitszeichen manchmal Teil des Operators. In einem SQL Non Equi Join ist es jedoch nie der gesamte Operator selbst. Nachfolgend finden Sie einige Nicht-Gleichheits-Join-Operatoren und ihre Bedeutung:

Operator Meaning
“>” Greater than
“>=” Greater than or equal to
“<” Less than
“<=” Less than or equal to
“!=” Not equal to
”<>” Not equal to (ANSI Standard)
BETWEEN … AND Values in a range between x and y

Schließlich ist es gut zu wissen, dass ein SQL non equi join nur mit einer oder zwei Tabellen verwendet werden kann.

Kennenlernen unserer Daten

Bevor wir mit der Beschreibung von Non Equi Joins beginnen, sollten wir uns mit einigen der Daten vertraut machen, die wir verwenden werden. Außerdem werden wir uns mit Equi-Joins beschäftigen.

Unten sehen Sie die Tabelle "person"Tabelle, die Datensätze für Personen enthält, die am Kauf einer Wohnung (z. B. einer Eigentumswohnung) beteiligt sind. Alle Spalten der Tabelle sind selbsterklärend, aber beachten Sie die Spalten "min_price" und "max_price". Sie geben die Preisspanne der Person für eine Wohnung an. Die Spalte "apartment_id" verbindet diese Tabelle mit der Tabelle "apartment" Tabelle.

id first_name last_name rooms min_price max_price apartment_id
1 Anne Miller 2 40,000 150,000 2
2 John Harris 1 20,000 50,000 2
3 Michael Moore 2 200,000 300,000 6
4 Oliver Watson 4 30,000 100,000 7

Die Tabelle "apartment" speichert Informationen über die Wohnungen, die Anzahl der Zimmer und die Stadt. Beachten Sie, dass die Werte in der Spalte "id" im Grunde dieselben sind wie in der Spalte "apartment_id" oben.

id rooms price city
1 2 30,000 Houston
2 2 45,000 Dallas
3 3 125,000 Chicago
4 5 245,000 Los Angeles
5 4 340,000 San Jose
6 4 220,000 San Diego
7 1 36,000 Cleveland

Lassen Sie uns nun die Equi-Joins besprechen.

Was ist ein SQL-Äqui-Join?

Die meisten SQL-Joins sind Äqui-Joins. Ein Äqui-Join ist jede JOIN-Operation, die ein Gleichheitszeichen und nur ein Gleichheitszeichen verwendet. Sie werden Abfragen sehen, die mehr als eine Join-Bedingung verwenden; wenn eine Bedingung ein Gleichheitszeichen ist und die andere nicht, wird dies in SQL als Nicht-Gleichheits-Join betrachtet.

Wie wir bereits gesagt haben, benötigen gleichwertige Verknüpfungen eine exakte Übereinstimmung zwischen zwei Spalten. Schauen Sie sich die folgende Abfrage an:

SELECT first_name, last_name, price, city 
FROM person 
JOIN  apartment  ON   apartment.id = person.apartment_id ;

Diese Abfrage wählt den Vor- und Nachnamen des Kunden, den Preis der Wohnung und die Stadt, in der sich die Wohnung befindet, aus. Wir haben eine JOIN (auch bekannt als INNER JOIN) verwendet, um die Daten aus den Spalten "person" und "apartment" Tabellen. Diese Verknüpfung zeigt nur Datensätze an, die in beiden Tabellen übereinstimmen können. In der Verknüpfungsbedingung haben wir den Gleichheitsoperator auf die Spalte "apartment_id" in der Tabelle "person" und die Spalte "id" in der Tabelle "apartment" verwendet, um eine genaue Übereinstimmung zu finden.

Die resultierende Tabelle enthält die folgenden Zeilen:

first_name last_name price city
Anne Miller 30,000 Houston
John Harris 45,000 Dallas
Michael Moore 220,000 San Diego
Oliver Watson 36,000 Cleveland

Wir haben gesehen, wie ein Äqui-Join funktioniert. Kommen wir nun zu den SQL Non Equi Joins.

Verwendung eines SQL Non Equi Join mit zwei Tabellen

SELECT first_name, last_name, min_price, max_price, price, city 
FROM person JOIN apartment ON apartment.id != person.apartment_id
    AND price BETWEEN min_price AND max_price
ORDER BY last_name;

Mit dem Operator JOIN werden die Datensätze aus den Tabellen "person" und "apartment" Tabellen. Wir haben den Vor- und Nachnamen jeder Person, den minimalen und maximalen Wunschpreis sowie den Preis und die Stadt aller Wohnungen, die nicht vom Kunden ausgewählt wurden, ausgewählt. Wir haben den Operator BETWEEN... AND verwendet, um die Wohnungspreise abzugleichen. Wir haben auch den Operator "!=" in einer Bedingung mit "apartment_id" aus der Tabelle "person" Tabelle und "id" aus der "apartment" Tabelle. Auf diese Weise haben wir die ausgewählte Wohnung aus der Ergebnistabelle entfernt.

Die Ergebnistabelle sieht wie folgt aus:

first_name last_name min_price max_price price city
John Harris 20,000 50,000 30,000 Houston
John Harris 20,000 50,000 36,000 Cleveland
Anne Miller 40,000 150,000 125,000 Chicago
Michael Moore 200,000 300,000 245,000 Los Angeles
Oliver Watson 30,000 100,000 45,000 Dallas
Oliver Watson 30,000 100,000 30,000 Houston

Die von John Harris gewählte Wohnung in Dallas wurde nicht angezeigt. Beachten Sie, dass er auch eine Wohnung in Houston (30.000 $) oder in Cleveland (36.000 $) hätte wählen können. Beide Wohnungen liegen in seiner Preisspanne von 20.000 $ - 50.000 $.

SQL Non Equi Join in Self Join

Sehen wir uns nun an, wie ein SQL non equi join funktioniert, wenn eine Tabelle mit sich selbst verbunden wird. Unsere Beispiele basieren auf der Tabelle "playing_cards" Tabelle, die unten abgebildet ist. Sie enthält die folgenden Spalten: "id" (ein interner Bezeichner), "rank" (der Rang oder Nennwert der Karte) und "suit" (die Farbe der Karte).

id rank suit
1 A Hearts
2 A Spades
3 A Clubs
4 K Spades
5 K Diamonds
6 Q Clubs
7 J Spades

Dies sind die Karten, die in der Tabelle "playing_cardsTabelle" gespeichert sind:

Beachten Sie, dass wir nur sieben Karten in dem Satz haben.

Schauen wir uns drei Möglichkeiten an, wie wir Non Equi Joins unter diesen Umständen verwenden können.

1. Suche nach allen Kartenpaaren

Ausgehend von der Menge der Karten in der Tabelle "playing_cards" finden wir alle möglichen Paare von Karten.

Werfen Sie einen Blick auf die Abfrage:

SELECT c1.rank, c1.suit, c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.id != c2.id 
ORDER BY c1.rank;

In der obigen Abfrage haben wir die Tabelle "playing_cards" mit sich selbst verbunden, indem wir die Aliasnamen c1 und c2. (Weitere Informationen über Self-Joins und Aliase finden Sie in unserem vorherigen Artikel.) Anschließend haben wir den Ungleichheitsoperator "!=" verwendet und damit einen SQL Non Equi Join erstellt, um alle möglichen Kartenpaare zu erhalten. Dieser Operator zeigt Kartenpaare in unterschiedlicher Reihenfolge an und entfernt gleichzeitig Paare mit identischen Karten.

Die Tabelle unten zeigt einige der resultierenden Zeilen. Wir haben Zeilen mit doppelten Paaren hervorgehoben.

rank suit rank suit
A Spades A Hearts
A Spades A Clubs
A Spades K Spades
A Spades K Diamonds
A Spades Q Clubs
A Spades J Spades
A Clubs A Hearts
A Clubs A Spades
A Clubs K Spades
A Clubs K Diamonds
A Clubs Q Clubs
A Clubs J Spades

Wir sehen die ersten 12 von insgesamt 42 Datensätzen. Das Bild unten zeigt diese ausgewählten Paare:

2. Eliminierung doppelter Kartenpaare

Die von der letzten Abfrage zurückgegebenen Kartenpaare waren nicht eindeutig, da das Abfrageergebnis Paare in umgekehrter Reihenfolge enthielt, d. h. "Pik-Ass mit Kreuz-Ass" und "Kreuz-Ass mit Pik-Ass".

In der nächsten Abfrage werden wir nur eindeutige Paare zurückgeben. Die Position der Karten im Paar spielt keine Rolle.

SELECT c1.rank, c1.suit,c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.id < c2.id 
ORDER BY c1.rank;

Wie Sie sehen, haben wir einen SQL non equi join mit dem Operator "<" anstelle von "!=" verwendet. Als Ergebnis erhielten wir eindeutige Kartenpaare.

Und das sind die Ergebnisse:

rank suit rank suit
A Spades A Hearts
A Clubs A Hearts
A Clubs A Spades
J Spades A Hearts
J Spades A Spades
J Spades A Clubs
J Spades K Spades
J Spades K Diamonds
J Spades Q Clubs
K Spades A Hearts
K Spades A Spades
K Spades A Clubs
K Diamonds A Hearts
K Diamonds A Spades
K Diamonds A Clubs
K Diamonds K Spades
Q Clubs A Hearts
Q Clubs A Spades
Q Clubs A Clubs
Q Clubs K Spades
Q Clubs K Diamonds

In diesem Fall entsprachen 21 Datensätze der Bedingung, und alle resultierenden Paare kamen nur einmal vor.

3. Finden von Kartenpaaren mit der gleichen Farbe

In der nächsten Abfrage werden wir eindeutige Kartenpaare mit der gleichen Farbe (Herz, Pik, Kreuz und Karo) auswählen. Können Sie den von uns verwendeten Operator "non equi" finden?

SELECT c1.rank, c1.suit,c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.rank < c2.rank AND c1.suit = c2.suit ;

Die obige Abfrage verwendet zwei Bedingungen: eine, die den "Rang" der Karten vergleicht, und eine weitere, die die Spalte "suit" vergleicht.

Werfen Sie einen Blick auf das Abfrageergebnis.

rank suit rank suit
A Spades K Spades
J Spades K Spades
A Clubs Q Clubs
A Spades J Spades

Nur vier Datensätze entsprachen den Bedingungen von JOIN. Die Situation ist unten dargestellt.

Erfahren Sie mehr über SQL

Sie wissen nun, was ein SQL non equi join ist und wie er funktioniert. Wenn Sie mehr über SQL lernen möchten, schauen Sie sich die Kurse vonLearnSQL.de an. Sie können Ihre neuen Kenntnisse mit interaktiven Übungen üben. Mehr über SQL-Joins erfahren Sie auch in unseren Beiträgen SQL Joins und Learning SQL-JOINs Using Real-Life Situations.