Wie sieht die Ausgabe einer JOIN-Anweisung aus?


8

Ich wollte schon seit einiger Zeit Joins verwenden, habe aber Probleme, die Ausgabe zu visualisieren, damit ich weiß, wie ich sie verwenden kann.

Angenommen, ich habe 2 Tabellen:

CREATE TABLE Cities (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    city tinyblob
);

CREATE TABLE Users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username TINYBLOB,
    city INT UNSIGNED,
    FOREIGN KEY (city) REFERENCES Cities (id)
);

Wenn meine Anwendung eine SQL-Abfrage ausführen soll, um die Profildaten eines Benutzers abzurufen, wie würde ich einen Join verwenden, um die Stadt zu ermitteln, die dem Datensatz eines Benutzers zugeordnet ist, und wie würde der ausgegebene Datensatz angezeigt?

Antworten:


12

Jedes Ergebnis einer SQL-Operation ist funktional eine neue Tabelle, unabhängig davon, ob sie auf der Festplatte oder im Speicher gespeichert ist

Die Funktion eines Joins besteht darin, zwei Tabellen zu einer synthetischen dritten Tabelle zu "verbinden", die (normalerweise) nur während der Ausgabe an die Anwendung im Speicher vorhanden ist.

Der Grund für die Verwendung eines Joins besteht darin, Datenanomalien zu reduzieren , indem sichergestellt wird, dass Daten nur an einer Stelle in der Datenbank angezeigt werden.

Folgendes berücksichtigen:

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

Wenn die Regierung die Postleitzahl ändert (was für den Geschmack der Datenbankentwickler viel zu häufig vorkommt *), muss die Personentabelle so aktualisiert werden, dass alle alten Postleitzahlen korrekt zur richtigen Stadt und neuen Postleitzahl gehören.

In diesem Fall befindet sich dieselbe Postleitzahl in mehreren Tupeln der Tabelle. Wenn die Tabelle manuell bearbeitet werden kann, treten schwerwiegende Aktualisierungsanomalien auf, da neue Kombinationen aus Stadt und Postleitzahl eingegeben werden, ohne dass die gesamte Datenbank aktualisiert wird.

Wenn wir stattdessen drei Tabellen haben, erhalten wir dieselben Daten, jedoch mit erhöhter Flexibilität und Zuverlässigkeit (auf Kosten einer gewissen Leistung, obwohl Fragen der "angemessenen Denormalisierung" ein Thema für eine andere Reihe von Antworten sind).

Person ( PersonID Integer Primary Key, FName String, LName String)

City ( CityID Integer Primary Key, City String, State String, ZipCode String )

Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`

Und wir können eine einzelne "Tabelle" aus dem Obigen durch die folgende Abfrage erhalten: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Auf diese Weise können wir die einzelnen Tabellen aktualisieren, wenn sich etwas Spezifisches an ihnen ändert, ohne den Rest der zugehörigen Daten zu beschädigen.

An INNER JOINist der Standardtyp der Verknüpfung. Grob gesagt heißt es: "Kombiniere Tupel, bei denen dieser Datensatz aus Tabelle a mit diesem Datensatz aus Tabelle b übereinstimmt." Die anderen Arten von Verknüpfungen sind OUTER JOINSund was als a bekannt ist CARTESIAN PRODUCT. Ein äußerer Join ist "Nehmen Sie alles aus der linken oder rechten Tabelle (wie angegeben) und wo die andere Tabelle übereinstimmt, verbinden Sie es. Wenn es nicht übereinstimmt, füllen Sie es mit Nullen" und ein kartesisches Produkt (ohne in die relationale Algebra einzusteigen ist: Nehmen Sie jede mögliche Kombination von Tupeln in beiden Tabellen und geben Sie sie in einer Tabelle aus, ohne dass etwas übereinstimmt.

* Mehr als nie, insbesondere beim Verschieben der Grenzen von Postleitzahlen aufgrund von Gerrymandering


6

Ich denke du suchst

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

was würde dir geben

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

Aber nehmen Sie nicht mein Wort: Probieren Sie es in Ihrer Datenbank aus und sehen Sie, was Sie bekommen!


3

Kurz gesagt, Ihre SQL-Anweisung lautet:

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn sind die Felder, die Sie abrufen möchten - von einem oder beiden Tabls.


Klammern sind nicht obligatorisch, da die Abfrage schwerer zu lesen ist.
Spredzy

1
@Spredzy Reverse ist der Fall für mich, Klammer erhöht die Lesbarkeit für mich
Sathyajith Bhat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.