SQL Joins + View

Tabellen verbinden:

  • Normalisierung: Datensätze auf mehrere Tabellen aufteilen, um Redundanzen zu vermeiden
  • Tabellen über eine Spalte verbunden (Foreign key)
  • Können beim Abruf zu einer Tabelle zusammengeführt werden (Join)
  • Ergebnis kann als virtuelle Tabelle gespeichert werden (View)

Foreign key

  • Werte in Spalte verweisen auf Primary key von anderer Tabelle
  • Constraint, der für Spalte mit angegeben wird
  • Befehl: FOREIGN KEY (spalte) REFERENCES table_name(key)

Joins

TypFunktion
INNER JOINSchnittmenge (nur die Einträge, für die es einen Eintrag in der gejointen Tabelle gibt)
LEFT JOINTabelle + Schnittmenge (alle Einträge der Tabelle + soweit vorhanden dazu passende Einträge der gejointen Tabelle)

gibt noch weitere

View

  • Virtuelle Tabelle mit zusammengeführten Daten aus bestehenden Tabellen
  • z. B. Erzeugung von Datensätzen passend für Anzeige in Anwendung
  • Befehl: CREATE VIEW view_name AS + Daten (z. B. durch SELECT ausgewählt)

Beispiel

  • umgesetzt mit SQLite (einfache SQL Datenbank für Prototypen; besteht aus einer Datei)
  • Zur Ansicht in VS Code kann SQLiteViewer verwendet werden.
  • hochschule.db (SQLite Datenbank-Datei mit Beispieldaten -> Rechtsklick -> Speichern unter)

INNER JOIN

SQLSELECT *
FROM student
INNER JOIN course ON student.course = course.id;

gleiches Ergebnis:

SQLSELECT *
FROM course
INNER JOIN student ON student.course = course.id;

LEFT JOIN

SQLSELECT *
FROM course
LEFT JOIN student ON student.course = course.id;

verschachtelter JOIN

SQLSELECT student.studentNr, student.firstName, student.lastName, course.name AS "course", faculty.name AS "faculty"
FROM (student
INNER JOIN course ON student.course = course.id)
INNER JOIN faculty ON course.faculty = faculty.id;

VIEW

SQLCREATE VIEW student_data AS
SELECT student.studentNr, student.firstName, student.lastName, course.name AS "course", faculty.name AS "faculty"
FROM (student
INNER JOIN course ON student.course = course.id)
INNER JOIN faculty ON course.faculty = faculty.id;
SQLSELECT * FROM student_data