Dies ist eine alte Version des Dokuments!
Als „VIEW“ kann man prinzipiell eine Art virtuelle Tabelle verstehen, die durch ein gespeichertes SQL-Statement mit SELECT, JOIN, WHERE, ORDER BY etc. in Echtzeit definiert wird und die wie jede andere Tabelle im DBMS per SQL wieder abgefragt werden kann.
Ein einfaches Beispiel anhand von Produkten und Bestellungen die in aktuelle Käufe und höchsten Umsatz resultieren:
Tabellen anlegen
create table products (asin varchar(50), name varchar(250), price decimal(5,2)); create table orders (asin varchar(50), quantity integer, buy datetime);
Daten einpflegen
INSERT INTO products(asin, name, price) VALUES ("A1", "Apfel", 1.23), ("B2", "Birne", 2.34), ("C3", "Orange", 3.45), ("D4", "Pflaume", 3.45);
INSERT INTO orders(asin, quantity, buy) VALUES ("A1", 2, "2016-01-08 12:00:00"), -- ok ("B2", 3, "2016-01-07 12:00:00"), -- ok ("E5", 4, "2016-01-06 12:00:00"), -- no related product ("A1", 5, "2016-01-05 12:00:00"), -- out of time ("C3", 1, "2016-01-06 12:00:00") -- insufficient quantity
Was steht drin?
SELECT * FROM products
asin | name | price |
---|---|---|
A1 | Apfel | 1.23 |
B2 | Birne | 2.34 |
C3 | Orange | 3.45 |
D4 | Pflaume | 3.45 |
SELECT * FROM orders
asin | quantity | buy |
---|---|---|
A1 | 2 | 2016-01-08 12:00:00 |
B2 | 3 | 2016-01-07 12:00:00 |
E5 | 4 | 2016-01-06 12:00:00 |
A1 | 5 | 2016-01-05 12:00:00 |
C3 | 1 | 2016-01-06 12:00:00 |
Eine View für Bestellungen ab dem 6.1.
CREATE VIEW recentOrders AS SELECT * FROM orders INNER JOIN products USING(asin) WHERE buy >= "2016-01-06 12:00:00" AND quantity > 1 ORDER BY buy ASC, quantity DESC
SELECT * FROM recentOrders
Ergebnis:
asin | quantity | buy | name | price |
---|---|---|---|---|
B2 | 3 | 2016-01-07 12:00:00 | Birne | 2.34 |
A1 | 2 | 2016-01-08 12:00:00 | Apfel | 1.23 |
Für C, D, und E sind keine Ergebnisse vorhanden, da kein entsprechendes Produkt vorlag, die Bestellung älter als einen Tag oder die Stückzahl zu klein war.
Und hier eine View für Artikel mit höchsten Umsatz:
CREATE VIEW highSalery AS SELECT p.*, COUNT(o.asin) AS sold, COUNT(o.asin) * price AS total FROM products p LEFT JOIN orders o USING(asin) GROUP BY asin ORDER BY total DESC
SELECT * FROM highSalery
Ergebnis:
asin | name | price | sold | total |
---|---|---|---|---|
C3 | Orange | 3.45 | 1 | 3.45 |
A1 | Apfel | 1.23 | 2 | 2.46 |
B2 | Birne | 2.34 | 1 | 2.34 |
D4 | Pflaume | 3.45 | 0 | 0.00 |
Bei einer „MATERIALIZED VIEW“ handelt es sich um eine Art Cache zur Performanceoptimierung. Im Gegensatz zur View wird hier das Ereignis, das zum Aktualisierung der Ergebnisse führt, vom Client in die Datenbank selbst verlegt:
Um eine Materialized View anzulegen braucht man nur das entsprechende Schlüsselwort voranzustellen, z.B.:
create materialized view recentOrders as ...