Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Both sides previous revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
views [2016/01/08 13:46] chorn |
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 7: | Zeile 117: | ||
===== Materialisierte Sicht ===== | ===== Materialisierte Sicht ===== | ||
- | 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, umgedreht: | + | 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: |
+ | |||
+ | * 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. | ||
+ | |||
+ | 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 | ||
- | * 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 | + | <code sql> |
- | * Beim Abruf der //Materialized View// werden die Daten aus dem Cache zurückgeliefert. Der Cache wird erst aktualisiert, sobald //Daten geändert// werden (Update). Die Last entsteht ausschliesslich bei Schreiboperationen. | + | CREATE TRIGGER materialize after insert or update or delete on orders EXECUTE PROCEDURE materialize(); |
+ | </code> |