Zum Inhalt
wannacode

Views

Kurz gesagt: Eine View ist eine Abfrage, die unter einem Namen gespeichert ist und wie eine Tabelle benutzt wird, aber selbst keine Daten speichert.

Problem

Dieselbe Rechnung überall

Wie viel ist eine Bestellung wert? In orders steht keine Summe. Sie wird aus den Zeilen der Bestellung berechnet:

SQLDatenbank: Shop

Diese Rechnung braucht man für die Tagesauswertung, für den Kontoauszug des Kunden, für die Liste der unbezahlten Bestellungen. Jedes Mal wird sie neu geschrieben. Kommt eines Tages eine Liefergebühr oder ein Rabatt dazu, muss man sie an zehn Stellen ändern. Und eine wird vergessen.

Die Idee

CREATE VIEW

CREATE VIEW Name AS SELECT … speichert eine Abfrage unter einem Namen. Das ist eine View. Danach wird die View wie eine Tabelle gelesen:

SQLDatenbank: Shop

Die Rechnung steht einmal in der View. Die Auswertungen sagen nur noch FROM order_totals.

Die Idee

Wie eine Tabelle

In SELECT wird eine View wie jede Tabelle benutzt: mit WHERE, ORDER BY, JOIN. In diesem Feld ist order_totals schon angelegt. Hier die neuen Bestellungen mit dem Kunden und dem Wert:

SQLDatenbank: Shop

Die Abfrage ist kürzer und klarer: „die Bestellung, der Kunde, der Wert“. Wie der Wert berechnet wird, ist in der View versteckt.

Probier es aus

Die großen Bestellungen

Die View order_totals ist fertig. Welche Bestellungen liegen über 100 €? Zeige die Nummer und den Wert.

SQLDatenbank: Shop

Sieh es dir an

Eine View enthält keine Daten

Der Kunde der Bestellung 1 ruft an: Er will 5 Packungen Weißkäse, nicht 4. Führ die Abfrage aus und sieh dir beide Ergebnisse an:

SQLDatenbank: Shop

Vorher sind es 31,60 €, nachher 39,50 €. Niemand hat die View angefasst. Die View speichert nicht die Werte, sondern nur die Abfrage. Jedes Lesen führt sie neu über die Tabellen aus, eine View kann also nicht veralten.

Deshalb kann man auch nicht in eine View schreiben:

SQLDatenbank: Shop

Die Daten ändert man in den Tabellen, aus denen die View liest.

Genauer, für Neugierige

PostgreSQL hat auch CREATE MATERIALIZED VIEW: eine View, die ihr Ergebnis wie eine Tabelle speichert. Sie ist schnell zu lesen, veraltet aber und wird mit REFRESH MATERIALIZED VIEW aktualisiert. Man benutzt sie für aufwendige Auswertungen, die nicht sekundengenau sein müssen. SQLite hat so eine View nicht.

Probier es aus

Verkäufe nach Produkt

Lege eine View product_sales an: für jedes Produkt (product_id), wie viele Stück bestellt wurden (sold), ohne die Zeilen stornierter Bestellungen.

SQLDatenbank: Shop

Die Idee

DROP VIEW

Eine View wird mit DROP VIEW entfernt. DROP TABLE funktioniert nicht:

SQLDatenbank: Shop
SQLDatenbank: Shop

Die Tabellen, aus denen die View liest, werden nicht angefasst. Du entfernst nur die gespeicherte Abfrage.

Genauer, für Neugierige

Um eine View in SQLite zu ändern, entfernst du sie mit DROP VIEW und legst sie mit CREATE VIEW neu an. PostgreSQL und MySQL haben CREATE OR REPLACE VIEW, SQLite nicht:

SQLDatenbank: Shop

Es funktioniert auch andersherum: Eine Spalte, die eine View benutzt, lässt sich nicht mit DROP COLUMN entfernen (die vorige Lektion hat es erwähnt).

Übung

Zwei Auswertungen

1. Der Inhaber will Dankeskarten an die drei Kunden schicken, die für das meiste Geld bestellt haben.

Zeige mit der View order_totals den Namen des Kunden und wie viel er insgesamt bestellt hat (spent), ohne stornierte Bestellungen. Nur die ersten drei, vom meisten zum wenigsten.

SQLDatenbank: Shop

2. Am Morgen sieht das Lager nach, welche Bestellungen warten.

Lege eine View open_orders an mit der Bestellnummer, dem Namen des Kunden und dem Wert der Bestellung, nur für neue und bezahlte Bestellungen (new, paid). Benutze order_totals.

SQLDatenbank: Shop

Test

Teste dich

1. Was speichert die View order_totals?
2. Wie entfernst du die View order_totals?
3. Die Menge in einer Zeile von Bestellung 1 wurde mit UPDATE geändert. Was musst du tun, damit der Wert in order_totals stimmt?
4. Kannst du einen JOIN zwischen einer View und einer Tabelle schreiben?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·