8. Lehreinheit

From DHVLab

Revision as of 09:24, 29 March 2017 by Jschulz (talk | contribs) (Verknüpfung von Tabellen: Joins)

Ergebnisse der Übungsaufgaben

→ SELECT * FROM personen_sqluebung WHERE geschlecht = 'w'
→ SELECT * FROM personen_sqluebung WHERE name LIKE 'R%'
→ SELECT * FROM personen_sqluebung WHERE function = 'König' OR function = 'Kaiser'

Ergänzung zu Abfrageergebnissen:

  • Abfrageergebnisse werden stets als neue Tabelle ausgegeben und sind beliebig weiter verarbeitbar
  • Abfrageergebnisse können exportiert werden und andernorts wiederum importieren


→ INSERT INTO `personen_sqluebung`(`name`, `funktion`, `geschlecht`, `geburtsjahr`, `sterbejahr`) SELECT `herrscher`, `titel`, `geschlecht`, `geburtsjahr`, `todesjahr` FROM `personen_zusatz`

Hinweis: Es ist nicht zwingend erforderlich, die Tabelle zunächst in die eigene Datenbank zu kopieren. Es können Datensätze auch aus einer anderen Datenbank (hier: Kursdatenbank) importiert werden; hierzu muss die Datenbank entsprechend gekennzeichnet werden, was durch Datenbankname.Tabellenname (durch einen Punkt verbunden) erfolgt.

→ INSERT INTO `personen_sqluebung`(`name`, `funktion`, `geschlecht`, `geburtsjahr`, `sterbejahr`) SELECT `herrscher`, `titel`, `geschlecht`, `geburtsjahr`, `todesjahr` FROM `lab_grabdenkmaeler.personen_zusatz`
→ UPDATE `personen` SET name = "Rudolf I." WHERE id_person = 5
→ DELETE FROM personen_sqluebung WHERE id_person > 26

Verknüpfung von Tabellen: Joins

Bisher haben wir immer nur mit einer Tabelle gearbeitet. Das Potential relationaler Datenbanken kommt aber erst zur Geltung, wenn man die vorher fein säuberlich getrennten Daten nun wieder in Verbindung setzt - und das erfolgt mit sogenannten Joins[A 1]. Bildlich gesprochen werden mehrere Tabellen nebeneinander gelegt. Wir unterscheiden verschiedene Arten von Joins:

  • INNER JOIN
  • LEFT JOIN/RIGHT JOIN
  • OUTER JOIN

Anwendungsfall "INNER JOIN":
~ Sie möchten die Grabstätten samt ihrer zugehörigen Orte in einer Tabelle ausgeben, jedoch nur den Namen der Grabstätte, ihre Geokoordinaten, den Ortsnamen und den Staat.
→ SELECT name, geokoordinate1, geokoordinate2, ortsname, staat FROM grabstaette INNER JOIN ort ON (grabstaette.id_ort = ort.id_ort)

Anwendungsfall "LEFT JOIN":
Bei einem LEFT JOIN werden alle Datensätze der "linken" Tabelle ausgegeben, auch wenn sie in der "rechten" Tabelle keine Entsprechung aufweisen. Die Datensätze der rechten Tabelle werden dagegen nur mit ausgegeben, wenn sie eine Entsprechung aufweisen, ansonsten wird das entsprechende Feld mit NULL ausgegeben. ~ Sie möchten sich alle Grabstätten anzeigen lassen und die zugehörigen Orte, sofern diese bereits vorhanden sind. Fälle, in denen der Ort nicht vorhanden ist, werden mit NULL ausgegeben. Damit können Sie sich einen Überblick verschaffen, wo noch nach Orten gesucht werden muss.
→ SELECT grabstaette.name, ort.ortsname FROM grabstaette LEFT JOIN ort ON grabstaette.id_ort = ort.id_ort

Anwendungsfall "RIGHT JOIN":
Beim RIGHT JOIN verhält es sich gegensätzlich zum LEFT JOIN, d.h. hier wird die Haupttabelle "grabstaette" mit der Tabelle ort "rechts herum" verbunden. Hier werden also alle Datensätze der rechten Tabelle (ort) angezeigt und fehlende der linken Tabelle (grabstaette) mit NULL ausgefüllt.
~ Sie möchten sich alle Orte anzeigen lassen und die zugehörigen Grabstätten, sofern diese bereits vorhanden sind. Fälle, in denen die Grabstätte nicht vorhanden ist, werden mit NULL ausgegeben.
→ SELECT grabstaette.name, ort.ortsname FROM grabstaette LEFT JOIN ort ON grabstaette.id_ort = ort.id_ort[A 2]

Anwendungsfall "OUTER JOIN":
Beim OUTER JOIN handelt es sich um eine Kombination aus einem LEFT- und einem RIGHT JOIN. Es werden alle Datensätze beider Tabellen ausgegeben, bei Übereinstimmung werden sie verknüpft, ansonsten wie gehabt mit NULL wiedergegeben. Da SQL keinen genuinen OUTER JOIN unterstützt, muss mit einem UNION-Statement nachgeholfen werden (= Verknüpfung des Ergebnisses zweier Abfragen) ~ Sie möchten sich alle Grabstätten und alle Orte in einer Tabelle ausgeben lassen, auch wenn diese keine jeweilige Verknüpfung zueinander vorweisen können.
→ SELECT grabstaette.name, ort.ortsname FROM grabstaette LEFT JOIN ort ON grabstaette.id_ort = ort.id_ort UNION SELECT grabstaette.name, ort.ortsname FROM grabstaette RIGHT JOIN ort ON grabstaette.id_ort = ort.id_ort

Fortsetzung: Datenstrukturierung unseres Mapping-Projekts

Wie finde ich heraus, ob die Person, der Ort oder die Grabstätte schon eingetragen wurde?

  • Immer zunächst nachsehen, ob der Eintrag bereits vorhanden ist!
  • Jedes Objekt wird stets nur einmal erfasst, d.h. wenn es schon vorhanden ist, umso besser!
  • Tipp Orte/Personen: Auf den Spaltennamen "name" in der Tabelle "ort"/"personen" klicken; mit der alphabetischen Sortierung lässt sich idR rasch ermitteln, ob der Ort/die Person schon vorhanden ist oder nicht.
  • Tipp Grabstätten: Hier hilft uns eine alphabetische Sortierung nur bedingt, da der Name in manchen Fällen von dem bei Lauro abweicht. Daher bietet es sich an, nach der Orts-ID zu sortieren. Daraufhin kann man anhand des bei Lauro angegebenen Ortes in der Ortstabelle die Orts-ID ermitteln und ihrer Hilfe wiederum in der Tabelle "grabstaette" überprüfen, ob die gesuchte Grabstätte bereits eingetragen wurde oder nicht.
  • Tipp allgemein: “Anzahl der Datensätze” erhöhen → "alles anzeigen": es werden alle bisherigen Einträge auf einer Seite ausgegeben.

Ortsnamen-Konkordanz

In manchen Fällen erweitern wir das Angebot über die Angaben bei Lauro hinaus, beispielsweise wenn dort nur eine Abtei oder Kirche angegeben ist, nicht aber wo diese gelegen ist (zum Beispiel "Stift Rein").
Damit wir nicht Gefahr laufen, dass Einträge doppelt erfasst werden, wurden davon betroffene Fälle im Team-Dokument gesammelt (d.h. neben der oben angeführten Überprüfung muss ergänzend hier ein Blick hinein geworfen werden, um Redundanzen zu vermeiden).

Vorgehen Phase "Orte und Grabstätten"

  • Orte sind in die Tabelle "ort" einzutragen.
  • Grabstätten sind in die Tabelle "grabstaette" aufzunehmen; im Feld id_ort ist die ID des zugehörigen Ortes einzutragen.
  • Wir verwenden bei den Bezeichnungen die der Wikipedia, da die von Lauro (aus Platzgründen) nicht immer komplett sind.
  • Wiki-Eintrag (falls vorhanden) einbinden via Wikidata Q-ID (Unter Werkzeuge → Wiki-Datenobjekt → Nummer samt Q kopieren und in das entsprechende Feld eintragen.
  • Geokoordinaten aus der Wikipedia beziehen: oben rechts im Wiki-Eintrag → unter "Kartendienste ohne Direktlinks" die "Decimal degrees latitude and longitude"-Werte kopieren

Anmerkungen

  1. Für eine ausführliche Beschreibung der verschiedenen Arten von Joins und ihre Verwendung sei verwiesen auf den entsprechenden Abschnitt im Handbuch: Erlernen einer Datenbanksprache: Structured Query Language (SQL) II#Verkn.C3.BCpfung von Tabellen: Joins.
  2. Das Ergebnis zeigt, dass es in der Tabelle Ort einige Orte gibt, die keiner Grabstätte zugewiesen sind, da sie als Geburts- oder Sterbeort, nicht aber als Begräbnisort in Erscheinung treten.