Ich habe Probleme, die relationale Algebra zu verstehen, wenn es um Theta-Verknüpfungen, Equijoins und natürliche Verknüpfungen geht. Könnte mir bitte jemand helfen, es besser zu verstehen? Wenn ich das = -Zeichen für einen Theta-Join verwende, ist es genau das Gleiche wie für einen natürlichen Join?
sql
database
relational-database
relational-algebra
Maclunian
quelle
quelle
Antworten:
Ein Theta-Join ermöglicht beliebige Vergleichsbeziehungen (z. B. ≥).
Ein Equijoin ist eine Theta-Verknüpfung mit dem Gleichheitsoperator.
Ein natürlicher Join ist ein Äquivalent zu Attributen, die in jeder Beziehung denselben Namen haben.
Zusätzlich entfernt eine natürliche Verknüpfung die doppelten Spalten, die am Gleichheitsvergleich beteiligt sind, sodass nur 1 von jeder verglichenen Spalte übrig bleibt. in groben relationalen algebraischen Begriffen:
⋈ = πR,S-as ○ ⋈aR=aS
quelle
theta
bezieht sich der In-Theta-Join auf eine beliebige Bedingung, die als Kriterium für den Join verwendet wird. (Siehe Datenbanksysteme: Das vollständige Buch von Garcia-Molina, Ullman, Widom, Kapitel 2, Theta Join)Während die Antworten, die die genauen Unterschiede erklären, in Ordnung sind, möchte ich zeigen, wie die relationale Algebra in SQL umgewandelt wird und wie der tatsächliche Wert der drei Konzepte ist.
Das Schlüsselkonzept in Ihrer Frage ist die Idee eines Joins. Um einen Join zu verstehen, müssen Sie ein kartesisches Produkt verstehen (das Beispiel basiert auf SQL, wobei das Äquivalent als Cross-Join bezeichnet wird, wie an einem Tag, wenn darauf hingewiesen wird).
Dies ist in der Praxis nicht sehr nützlich. Betrachten Sie dieses Beispiel.
Das kartesische Produkt Product x Component ist unten oder SQL Geige . Sie können sehen, dass es 12 Zeilen = 3 x 4 gibt. Offensichtlich haben Zeilen wie "Laptop" mit "Rädern" keine Bedeutung, weshalb das kartesische Produkt in der Praxis selten verwendet wird.
JOINs sind hier, um diesen Produkten mehr Wert zu verleihen. Was wir wirklich wollen, ist, das Produkt mit den zugehörigen Komponenten zu "verbinden", da jede Komponente zu einem Produkt gehört. Der Weg, dies zu tun, ist mit einem Join:
Die zugehörige SQL - Abfrage wäre wie folgt aus (Sie mit allen Beispielen spielen hier )
und das Ergebnis:
Beachten Sie, dass das Ergebnis nur 4 Zeilen enthält, da der Laptop 3 Komponenten hat, das Auto 1 und das Flugzeug keine. Das ist viel nützlicher.
Zurück zu Ihren Fragen: Alle Joins, nach denen Sie fragen, sind Variationen des JOIN, den ich gerade gezeigt habe:
Natural Join = Der Join (die ON-Klausel) wird für alle Spalten mit demselben Namen ausgeführt. Im Gegensatz zu allen anderen Verknüpfungen werden doppelte Spalten aus dem Ergebnis entfernt. Die meisten DBMS (Datenbanksysteme, die von verschiedenen Anbietern wie Microsoft SQL Server, Oracle MySQL usw. erstellt wurden) unterstützen dies nicht einmal, es ist nur eine schlechte Praxis (oder sie haben sich absichtlich entschieden, sie nicht zu implementieren). Stellen Sie sich vor, ein Entwickler kommt und ändert den Namen der zweiten Spalte im Produkt von Preis zu Kosten. Dann würden alle natürlichen Verknüpfungen auf PName UND auf Kosten durchgeführt, was zu 0 Zeilen führt, da keine Zahlen übereinstimmen.
Theta Join = Dies ist der allgemeine Join, den jeder verwendet, da Sie damit die Bedingung angeben können (die ON-Klausel in SQL). Sie können unter so ziemlich jeder Bedingung beitreten, die Sie möchten, zum Beispiel bei Produkten, bei denen die ersten beiden Buchstaben ähnlich sind oder die einen anderen Preis haben. In der Praxis ist dies selten der Fall - in 95% der Fälle treten Sie unter der Bedingung der Gleichstellung bei, was uns zu folgenden Ergebnissen führt:
Equi Join = die in der Praxis am häufigsten verwendete. Das obige Beispiel ist ein Equi-Join. Datenbanken sind für diese Art von Joins optimiert! Das Gegenteil eines Equi-Joins ist ein Nicht-Equi-Join, dh wenn Sie unter einer anderen Bedingung als "=" beitreten. Datenbanken sind dafür nicht optimiert! Beide sind Teilmengen des allgemeinen Theta-Joins. Die natürliche Verbindung ist auch eine Theta-Verbindung, aber die Bedingung (die Theta) ist implizit.
Informationsquelle: Universität + zertifizierter SQL Server-Entwickler + hat kürzlich die MOO "Einführung in Datenbanken" von Stanford abgeschlossen, also wage ich zu sagen, dass ich die relationale Algebra im Auge habe.
quelle
CROSS JOIN
Operation in SQL führt zu einem Tabellenausdruck (Spaltenzeilen). Die Set-Operation Kartesisches Produkt führt zu einer Menge von Paaren.SELECT * FROM...
(und vielleicht auch Sie). Aber es ist in der Sprache, es ist in jeder SQL-Implementierung und ich benutze es oft (und ich wette, dass Sie es auch tun!). Hinweis: Nicht jeder Code ist Produktionscode.Die Antwort von @ outis ist gut: prägnant und korrekt in Bezug auf die Beziehungen.
In Bezug auf SQL ist die Situation jedoch etwas komplizierter.
Betrachten Sie die übliche Lieferanten- und Teiledatenbank, die jedoch in SQL implementiert ist:
würde eine Ergebnismenge ** mit Spalten zurückgeben
SNO, SNAME, STATUS, CITY, PNO, QTY
Der Join wird für die gleichnamige Spalte in beiden Tabellen ausgeführt
SNO
. Beachten Sie, dass die Ergebnismenge sechs Spalten enthält und nur eine Spalte für enthältSNO
.Betrachten Sie nun ein Theta-Äquivalent, bei dem die Spaltennamen für den Join explizit angegeben werden müssen (plus Bereichsvariablen
S
undSP
erforderlich):Die Ergebnismenge enthält sieben Spalten, darunter zwei Spalten für
SNO
. Die Namen der Ergebnismenge werden vom SQL-Standard als "implementierungsabhängig" bezeichnet, könnten jedoch folgendermaßen aussehen:SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
oder vielleicht das hier
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
Mit anderen Worten
NATURAL JOIN
kann in SQL betrachtet werden Spalten mit duplizierten Namen aus dem Suchresultates entfernen (aber leider nicht entfernen doppelte Zeilen - Sie müssen Änderungen erinnernSELECT
anSELECT DISTINCT
sich selbst).** Ich weiß nicht genau, was das Ergebnis
SELECT * FROM table_expression;
ist. Ich weiß, dass es sich nicht um eine Beziehung handelt, da sie unter anderem Spalten mit doppelten Namen oder eine Spalte ohne Namen enthalten kann. Ich weiß, dass es sich nicht um eine Menge handelt, da unter anderem die Spaltenreihenfolge von Bedeutung ist. Es ist nicht einmal eine SQL-Tabelle oder ein SQL-Tabellenausdruck. Ich nenne es eine Ergebnismenge.quelle
JOIN ... USING(...)
.SELECT * FROM table_expression;
ist" ?Natürlich ist eine Teilmenge von Equi, die eine Teilmenge von Theta ist.
Nicht unbedingt, aber es wäre ein Equi. Natürlich bedeutet, dass Sie mit allen ähnlich benannten Spalten übereinstimmen. Equi bedeutet nur, dass Sie ausschließlich '=' verwenden (und nicht 'kleiner als', wie usw.).
Dies ist jedoch eine reine akademische Angelegenheit. Sie könnten jahrelang mit relationalen Datenbanken arbeiten und nie jemanden hören, der diese Begriffe verwendet.
quelle
Theta-Join: Wenn Sie mit einem beliebigen Operator (z. B. =, <,>,> = usw.) eine Abfrage für den Join durchführen, fällt diese Join-Abfrage unter den Theta-Join.
Equi Join: Wenn Sie eine Abfrage für den Join nur mit dem Gleichheitsoperator durchführen, wird diese Join-Abfrage unter Equi Join angezeigt.
Beispiel:
Hinweis: Equi Join ist auch ein Theta Join!
Natürlicher Join: Ein Typ von Equi Join, der implizit durch Vergleichen aller Spalten mit denselben Namen in beiden Tabellen erfolgt.
Hinweis: Hier enthält das Verknüpfungsergebnis nur eine Spalte für jedes Paar gleichnamiger Spalten.
Beispiel
quelle
Das kartesische Produkt zweier Tabellen gibt allen möglichen Kombinationen von Tupeln wie im Beispiel in der Mathematik das Kreuzprodukt zweier Mengen. da es oft einige Junk-Werte gibt, die auch unnötigen Speicherplatz im Speicher belegen, kommen hier Joins zur Rettung, die nur die Kombination der Attributwerte ergeben, die erforderlich und sinnvoll sind.
Inner Join gibt das wiederholte Feld in der Tabelle zweimal an, während Natural Join hier das Problem löst, indem nur die wiederholten Spalten gefiltert und nur einmal angezeigt werden. Andernfalls funktionieren beide gleich. Natural Join ist effizienter, da der Speicher erhalten bleibt. Außerdem werden Redundanzen bei Natural Join entfernt.
Die Equi-Verknüpfung zweier Tabellen ist so, dass nur die Tupel angezeigt werden, die dem Wert in einer anderen Tabelle entsprechen. Beispiel: Lassen Sie new1 und new2 zwei Tabellen sein. Wenn die SQL-Abfrage * aus new1 auswählen, verbinden Sie new2 mit new1.id = new.id (ID ist dieselbe Spalte in zwei Tabellen), beginnen Sie mit der Tabelle new2 und verbinden Sie sich mit der ID in der zweiten Tabelle. Außerdem haben Nicht-Equi-Joins keinen Gleichheitsoperator, den sie <,> und zwischen Operatoren haben.
Der Theta-Join besteht aus allen Vergleichsoperatoren einschließlich Gleichheit und anderen <,> Vergleichsoperatoren. Wenn der Gleichheitsoperator (=) verwendet wird, spricht man von Equi Join.
quelle
Natürliche Verknüpfung: Natürliche Verknüpfung kann möglich sein, wenn in zwei Beziehungen mindestens ein gemeinsames Attribut vorhanden ist.
Theta-Join: Theta-Join kann möglich sein, wenn zwei unter bestimmten Bedingungen agieren.
Equi Join: Equi kann möglich sein, wenn zwei unter Eigenkapitalbedingungen handeln. Es ist eine Art von Theta-Join.
quelle