Frage

Ich wollte schon eine Weile eng mit Joins eingesetzt, aber ich habe Probleme, die Ausgabe zu visualisieren, damit ich weiß, wie man sie verwendet.

Nehmen wir an, ich habe 2 Tische:

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 zu erhalten, wie würde ich einen Join verwenden, um die Stadt mit dem Datensatz eines Benutzers zu verknüpfen, und wie würde der ausgegebene Datensatz angezeigt?

War es hilfreich?

Lösung

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

Die Funktion eines Join besteht darin, zwei Tabellen in eine synthetische dritte Tabelle zu "verbinden", die (normalerweise) nur während der Zeit, in der sie an die Anwendung ausgegeben wird, im Speicher existiert.

Der Grund für die Verwendung eines Join ist die Reduzierung Datenanomalien, durch die Versicherung, dass Daten an nur einem Ort in der Datenbank angezeigt werden.

Folgendes berücksichtigen:

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

Hier, wenn die Regierung Reißverschluss-Codes ändert (was für Datenbankentwicklergeschmack auf den Geschmack von Datenbankentwicklern * ist, muss die Tabelle der Personen so aktualisiert werden, dass alle alten Zipcodes korrekt zur richtigen Stadt und zum neuen Zip-Code gehören.

In diesem Fall befindet sich die gleiche Postleitzahl in mehreren Tupeln der Tabelle und unterliegt den starken Aktualisierungsanomalien als strenge Aktualisierungsanomalien Neu City/Zip-Code-Kombinationen werden ohne Aktualisierung der Datenbank als Ganzes eingegeben.

Durch stattdessen drei Tabellen erhalten wir die gleichen Daten, aber mit erhöhter Flexibilität und Zuverlässigkeit (auf Kosten einiger Leistung, obwohl Fragen der "geeigneten Denormalisierung" ein Thema für eine andere Reihe von Antworten sind.)

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

Stadt (Cityid Integer Primärschlüssel, Stadtstring, Staatszeichenfolge, Zipcode -String)

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

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

Dies ermöglicht es uns, die einzelnen Tabellen zu aktualisieren, wann immer etwas Spezifisch Über sie ändert sich, ohne den Rest der zugehörigen Daten zu verderben.

Ein INNER JOIN ist der Standardtyp Join. Ungefähr gespielt: "Kombinieren OUTER JOINS und was ist als ein bekannt CARTESIAN PRODUCT. Ein äußerer Join ist "Nehmen Sie alles aus der linken oder rechten Tabelle (wie angegeben) und wo die andere Tabelle übereinstimmt. Wo sie nicht übereinstimmt, füllen Sie ihn mit Nulls" und einem kartesischen Produkt (ohne in die relationale Algebra zu gelangen IS: Nehmen Sie jede mögliche Kombination von Tupeln in beiden Tabellen und geben Sie sie in eine Tabelle aus, ohne etwas zu entsprechen.

* Mehr als nie, vor allem beim Verschieben der Grenzen von Zipcodes aufgrund von Gerrymandering

Andere Tipps

Ich denke du suchst nach

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

das würde dir geben

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

Aber nimm mein Wort nicht dafür: Probieren Sie es in Ihrer Datenbank aus und sehen Sie, was Sie bekommen!

Kurz gesagt, Ihre SQL -Anweisung wird - sein -

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 beiden Tabellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top