Datenbanken und Queries Datenbank OPT (Standarddaten, Optimierung) Einfache Kommandos und Anfragen delete x; delete inc; query 3 * 7 query "Ralf Hartmut Güting" contains "Ralf" create x: int query x update x := 7 query x let inc = fun(n:int) n + 1 query inc query inc(7) list algebras list algebra StandardAlgebra Ausführbare Ebene "Wieviele Tupel hat die Postleitzahlenrelation?" query plz count "Finde die Orte, die im Namen "wald" enthalten. query plz feed filter[.Ort contains "wald"] consume Wieviele sind das? query plz feed filter[.Ort contains "wald"] count "Finde die Postleitzahlen für Hagen." (mit Index) query plz_Ort plz exactmatch["Hagen"] consume Mit Optimierer ============== "Wieviele Postleitzahlen gehören zu Orten mit über 10000 Einwohnern?" select count(*) from [orte as o, plz as p] where [o:ort = p:ort, o:bevt > 100] Query mit 5 Bedingungen (3 Selektion, 2 Join) select count(*) from [orte as o, plz as p1, plz as p2] where [o:ort = p1:ort, o:bevt > 70, p1:plz = p2:plz + 7, p2:plz > 60000, p2:ort contains "d"] -> 156 [erzeugten Plan ansehen] Ergebnis ansehen: select * from [orte as o, plz as p1, plz as p2] where [o:ort = p1:ort, o:bevt > 70, p1:plz = p2:plz + 7, p2:plz > 60000, p2:ort contains "d"] Datenbank GERMANY (Geodaten) ============================ Queries Mit graphischer Oberfläche: Kategorien Germany.cat Mit Optimierer ============== "Finde die Nachbarkreise von Magdeburg" select * from kreis where [gebiet touches magdeburg, not(kname contains "Magdeburg")] "Finde die Gebiete, die vom Rhein durchquert werden und deren Fläche größer als 1000 ist; gib den Namen, die Bevölkerungszahl und das Gebiet an." select [k:kname, k:bev, k:gebiet] from [kreis as k, fluss as f] where [f:fname = "Rhein", k:gebiet intersects f:fverlauf, k:flaeche > 1000] "Finde die übrigen Gebiete" (graphisch anders darstellen) select [k:kname, k:bev, k:gebiet] from [kreis as k, fluss as f] where [f:fname = "Rhein", k:gebiet intersects f:fverlauf, k:flaeche <= 1000] Den Rhein darstellen: select * from fluss where fname = "Rhein" "Welche Kreise liegen im Umkreis von 100 km um Dortmund?" (Einheiten stimmen nicht wirklich) select * from kreis where distance(dortmund, gebiet) < 1 Welche Autobahnen überqueren den Rhein? select [a:aname, a:anr, a:averlauf] from [autobahn as a, fluss as f] where [f:fname = "Rhein", a:averlauf intersects f:fverlauf] Datenbank BERLIN (Geodaten, Moving Objects) =========================================== Queries Graphische Oberfläche Hintergrund: berlinU.ses Ausführbare Ebene delete zug1; delete sixthirty; "Sei zug1 der erste Zug der Linie U7Hin." let zug1 = U7Hin feed extract[zug] "Zu welcher Zeit war zug1 unterwegs?" query deftime(zug1) "Welche Strecke ist zug1 gefahren?" query trajectory(zug1) "Wo war zug1 um 6:30?" let sixthirty = theInstant(2003, 11, 20, 6, 30) query val(zug1 atinstant sixthirty) "Wo war zug1 zwischen 6:30 und 6:45?" query trajectory(zug1 atperiods theperiod(theminute(2003,11,20,6,30), theminute(2003,11,20,6,44))) "Wo waren die Züge der Linie U7Hin, die um 8 Uhr unterwegs waren, zu dieser Zeit? query U7Hin feed extend[at8: val(.zug atinstant eight)] filter[not(isempty(.at8))] project[at8] consume Andere Formulierung: query U7Hin feed filter[.zug present eight] extend[at8: val(.zug atinstant eight)] project[at8] consume "Wann halten Züge der Linie U6Hin an der Station Mehringdamm" Mehringdamm ist schon definiert in der Datenbank. query mehringdamm query U6Hin feed extend[atMD: deftime(.zug at mehringdamm)] project[atMD] consume "Finde alle Züge, die um 9 Uhr unterwegs waren." query nine query Trains feed filter[.zug present nine] consume "Wo waren alle Züge um 9 Uhr, die dann fuhren?" query Trains feed filter[.Trip present nine] extend[at9: val(.Trip atinstant nine)] project[Id, Line, Up, at9] consume Queries mit Optimierer: "Finde alle Züge, die um 9 Uhr unterwegs waren." select * from trains where present(trip, nine) "Wo waren alle Züge um 9 Uhr, die dann fuhren?" select [id, line, up, val(atinstant(trip, nine)) as at9] from trains where present(trip, nine) Query aus Flyer: =============== Graphische Oberfläche Hintergrund: berlin.ses "Finde Name, Straße und Ort aller italienischen Restaurants, die nicht weiter als 2 km vom Brandenburger Tor liegen." select [r:name, r:strasse, r:geodata] from [restaurants as r, sehenswuerdpoi as s] where [s:name = "Brandenburger Tor", r:art = "Italienisch", distance(r:geoData, s:geoData) < 2000]