Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Both sides previous revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
views [2016/01/08 14:24] chorn [Materialisierte Sicht] |
views [2016/01/08 00:00] (aktuell) |
||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
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. | 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 | ||
+ | |||
+ | <code sql> | ||
+ | insert into products(asin, name, price) values | ||
+ | ("A1", "Apfel", 1.23), | ||
+ | ("B2", "Birne", 2.34), | ||
+ | ("C3", "Orange", 3.45), | ||
+ | ("D4", "Pflaume", 3.45); | ||
+ | </code> | ||
+ | |||
+ | <code sql> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | Was steht drin? | ||
+ | |||
+ | <code sql> | ||
+ | select * from products | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ^ asin ^ name ^ price ^ | ||
+ | | A1 | Apfel | 1.23 | | ||
+ | | B2 | Birne | 2.34 | | ||
+ | | C3 | Orange | 3.45 | | ||
+ | | D4 | Pflaume | 3.45 | | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | select * from orders | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ^ 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. | ||
+ | |||
+ | <code sql> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | <code sql> | ||
+ | select * from recentOrders | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code sql> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | <code sql> | ||
+ | select * from highSalery | ||
+ | </code> | ||
+ | |||
+ | 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 | | ||
+ | |||
---- | ---- | ||
Zeile 11: | Zeile 121: | ||
* Bei der Abfrage einer **View** durch den **Client** werden die geforderten Daten aus den einzelnen Tabellen und Relationen zusammengetragen und zurückgeliefert, der Trigger liegt auf der **Abfrage** der Sicht | * Bei der Abfrage einer **View** durch den **Client** werden die geforderten Daten aus den einzelnen Tabellen und Relationen zusammengetragen und zurückgeliefert, der Trigger liegt auf der **Abfrage** der Sicht | ||
* Beim Abruf der **Materialized View** werden die Daten aus dem Cache zurückgeliefert. Der Cache wird erst durch den **Server** aktualisiert, sobald **Daten geändert** werden (Update). Die Last entsteht ausschliesslich bei Schreiboperationen. | * Beim Abruf der **Materialized View** werden die Daten aus dem Cache zurückgeliefert. Der Cache wird erst durch den **Server** aktualisiert, sobald **Daten geändert** werden (Update). Die Last entsteht ausschliesslich bei Schreiboperationen. | ||
+ | |||
+ | Um eine Materialized View anzulegen braucht man nur das entsprechende Schlüsselwort voranzustellen, z.B.: | ||
+ | |||
+ | <code sql> | ||
+ | create materialized view recentOrders as ... | ||
+ | </code> | ||
+ | |||
+ | danach kann man die View durch beliebige Trigger auf involvierte Relationen aktualisieren | ||
+ | |||
+ | <code sql> | ||
+ | CREATE TRIGGER materialize after insert or update or delete on orders EXECUTE PROCEDURE materialize(); | ||
+ | </code> |