programmierung
und datenbanken

Joern Ploennigs

SQL Select

Midjourney: Deep Dive in a Wimmelbild

Ablauf¶

Wie erhält man Daten aus den Tabellen?¶

  • Die Tabellen werden nicht wie Dateien sequentiell ausgelesen, sondern wir führen Anfrageoperationen aus
  • Diese berechnen aus einer Menge an Tabellen eine neue Ergebnistabelle
  • Diese Operationen sind dabei ähnlich wie bekannte Rechenarten kombinierbar
  • Wir nutzen also ein System aus Berechnungen über Tabellen: eine Relationenalgebra

Wie führen wir diese in der Praxis aus?¶

  • Historisch haben sich hier eigene Anfragesprachen entwickelt, anstatt nur Zusatz-Funktionen und Bibliotheken in anderen Programmiersprachen
  • Die populärste dieser Sprachen ist die Structured Query Language (SQL)
  • Hat eine Syntax die speziell auf die hier erlaubten Operationen ausgelegt ist
  • Damit in der Anwendung deutlich fokussierter als Python

SQL (Structured Query Language)¶

  • 1975 SEQUEL = Structured English Query Language
  • seit 1986 SQL ANSI-Standard, seit 1987 ISO-Standard
  • 1992 SQL 2 (SQL-92) neuer ISO-Standard
  • 1999 SQL 3 (SQL:1999) neuer ISO-Standard
  • 2016 SQL 7 (SQL:2011) neuer ISO-Standard
  • 2019 SQL 9 (SQL:2019) stable release
  • SQL:2016 ISO/IEC 9075-1:2016 ist der derzeitige ISO-Standard

Projektion¶

  • Gegeben sei die Relation Gemeinden {GemeindeID, Name, Einwohner}

  • Projektion bedeutet das Auswählen bestimmter Spalten durch explizite Auflistung

  • Beispiel: GemeindeID, Name

GemeindeID Name Einwohner
1 Dummerstorf 7.329
2 Graal-Müritz 4.278
3 Sanitz 5.831

Projektion - in SQL¶

Syntax:

SELECT … FROM …


  • SELECT – Selektiert die benötigten Spalten (mit * werden alle Spalten gewählt)
  • FROM – Legt die Relationen fest, aus denen selektiert wird


SELECT GemeindeID, Name 
FROM Gemeinden

Ergebnis:

GemeindeID Name
1 Dummerstorf
2 Graal-Müritz
3 Sanitz

Selektion¶

  • Selektion bedeutet das Auswählen bestimmter Zeilen anhand einer Bedingung

  • Für die Bedingungen werden wie gehabt Vergleichsoperatoren genutzt

  • Bedingung: Einwohner > 5000

GemeindeID Name Einwohner
1 Dummerstorf 7.329
2 Graal-Müritz 4.278
3 Sanitz 5.831

Selektion - in SQL¶

Syntax:

SELECT … FROM … WHERE …


  • WHERE – Filtert in den ausgewählten Tabellen nach bestimmten Bedingungen


Beispiel:

SELECT * FROM Gemeinden 
WHERE Einwohner > 5000
GemeindeID Name Einwohner
1 Dummerstorf 7.329
3 Sanitz 5.831

Natürlicher Verbund¶

Bei einem JOIN kombinieren wir die Einträge aus beiden Tabellen da wo immer Fremdschlüssel und Primärschlüssel übereinstimmen

Gemeinden Tabelle

GemeindeID Name Einwohner
1 Dummerstorf 7.329
2 Graal-Müritz 4.278
3 Sanitz 5.831


Primärschlüssel: GemeindeID

Bauwerke Tabelle

BauwerksID Bauwerkstyp GemeindeID
5000 Tankstelle 2
5001 Hotel 1
5002 Kirche 2


Fremdschlüssel: GemeindeID

Natürlicher Verbund - Ergebnis¶

Verknüpfung von Tabellen durch übereinstimmende Spalten:

Gemeinden Tabelle

GemeindeID Name Einwohner
1 Dummerstorf 7.329
2 Graal-Müritz 4.278
3 Sanitz 5.831


Primärschlüssel: GemeindeID

Bauwerke Tabelle

BauwerksID Bauwerkstyp GemeindeID
5000 Tankstelle 2
5001 Hotel 1
5002 Kirche 2


Fremdschlüssel: GemeindeID

Ergebnis

BauwerksID Bauwerkstyp GemeindeID Name Einwohner
5000 Tankstelle 2 Graal-Müritz 4.278
5001 Hotel 1 Dummerstorf 7.329
5002 Kirche 2 Graal-Müritz 4.278

Wichtig: Tupel, deren Attributwert in der jeweiligen Spalte der anderen Relation nicht auftaucht, werden auch in der Ergebnistabelle nicht auftauchen.

Im Beispiel: Sanitz taucht im Ergebnis nicht auf, weil keines der vorhandenen Bauwerke hier gebaut ist.

Natürlicher Verbund - in SQL¶

Syntax:

SELECT … FROM … NATURAL JOIN


  • NATURAL JOIN – Verbindet zwei Tabellen über den natürlichen Verbund


Beispiel:

SELECT * FROM Bauwerke 
NATURAL JOIN Gemeinden

Weitere Verbundformen in SQL¶

Kreuzprodukt:

SELECT … FROM Table1, Table2


  • Separiert man statt mit NATURAL JOIN mit einem Komma, wird ein Kreuzprodukt gebildet – alle Zeilen werden mit allen Zeilen verbunden!


Sinnvoll um mehrere Tabellen nach bestimmten Bedingungen zu kombinieren:

SELECT … FROM Table1, Table2 
WHERE Table1.Foreign = Table2.Primary

Kann damit auch den Natürlichen Verbund erzeugen

Umbenennung¶

  • Manchmal haben die gleichen Attributwerte in verschiedenen Tabellen verschiedene Bedeutungen, besonders beim Erzeugen von Verbunden

  • Gegeben Relation Bauwerke {BauwerksID, Bauwerkstyp, Name}

  • Verbund: Bauwerke × Gemeinden

  • Spalten: BauwerksID, Bauwerkstyp, Name

  • Umbenennung: Name → Gemeindename

BauwerksID Bauwerkstyp Gemeindename
5000 Tankstelle Graal-Müritz
5001 Hotel Dummerstorf
5002 Kirche Graal-Müritz

Umbenennung - in SQL¶

Mit AS Keyword:

SELECT tbl1.attr1 AS Identifikationsnummer 
FROM Table1 AS tbl1


Das Beispiel von vorhin:

SELECT BauwerksID, Bauwerkstyp, Name AS Gemeindename
FROM Bauwerke
NATURAL JOIN Gemeinden


Sowohl im SELECT als auch im FROM möglich durch die Nutzung des AS Keywords

Aggregatfunktionen¶

  • Fassen Spaltenwerte nach einer bestimmten Vorgehensweise zusammen

  • Bilden dabei standardmäßig eine 1×1 Tabelle als Ergebnis

  • Soll mehr als nur ein Wert erscheinen, muss nach einer bestimmten Bedingung aggregiert werden

  • Gibt es eine Bedingung, repräsentieren die Zeilen verschiedene Fälle

  • Häufige Aggregatfunktionen: Summenbildungen oder Zählungen

GemeindeID Name Einwohner
1 Dummerstorf 7.329
2 Graal-Müritz 4.278
3 Sanitz 5.831


Summe: 17.438

Aggregatfunktionen - in SQL¶

COUNT-Funktion zählt die Anzahl der Zeilen:

SELECT COUNT(GemeindeID) FROM Gemeinden
*COUNT: 3*

SUM-Funktion summiert eine Spalte numerisch auf:

SELECT SUM(Einwohner) FROM Gemeinden
*SUM: 17.438*

Bedingte Aggregation - in SQL¶

  • Aggregiert man nach einem bestimmten Attribut, dann werden nur jeweils jene Tupel zusammengefasst (summiert, gezählt, gemittelt,…) die den gleichen Attributwert haben
  • Hierfür ist in SQL der GROUP BY Befehl zuständig

Beispiel: Eine Tabelle Mitarbeiter enthält Honorarzahlungen an Mitarbeiter, pro Zahlung ist dabei eine Zeile angelegt. Man will nun das gemittelte Honorar für jeden Mitarbeiter ausgeben lassen.

Gegeben die Relation Mitarbeiter{MitarbeiterID, Name, Honorar}

SELECT MitarbeiterID, Name, AVG(Honorar) 
FROM Mitarbeiter
GROUP BY MitarbeiterID

Weitere Operationen: Sortierung & Anzahl¶

Sortierung:

SELECT * FROM Gemeinden 
ORDER BY Einwohner DESC


  • ORDER BY mit ASC (aufsteigend) oder DESC (absteigend)


Begrenzung der Ergebnismenge:

SELECT * FROM Gemeinden 
ORDER BY Einwohner DESC 
LIMIT 2


  • LIMIT schneidet die Ergebnistabelle nach einer gewissen Anzahl an Elementen ab
  • Hier: Die zwei Gemeinden mit der höchsten Einwohnerzahl

Kombination von Bedingungen¶

Bedingungen können wie in Python mit AND und OR kombiniert werden:

SELECT * FROM Bauwerke 
NATURAL JOIN Gemeinden
WHERE Einwohner > 5000 AND Bauwerkstyp = "Hotel"

Ergebnis:

BauwerksID Bauwerkstyp GemeindeID Name Einwohner
5001 Hotel 1 Dummerstorf 7.329

Ausblick: SQL - Mehr als eine Anfragesprache¶

Bisher: Nur ein einzelner Aspekt von SQL (SELECT …)

SQL bietet weit mehr Funktionalitäten:

  • DML (Data Manipulation Language):

    • Daten aus Tabellen anfragen und modifizieren (SELECT, UPDATE, DELETE ...)
  • DDL (Data Definition Language):

    • Definieren und Verwalten von Schemas und Tabellen (CREATE, ALTER, DROP …)
  • DCL (Data Control Language):

    • Nutzerzugriffsrechte (GRANT, REVOKE …)
    • Kontrollieren von Transaktionen (COMMIT, ROLLBACK …)

fragen?

programmierung
und datenbanken