From bd4c46c653b786bcea0c400d5f33de59ade9255d Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Mon, 19 Jun 1989 09:51:46 +0000 Subject: [PATCH] ING_DB --- WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_aa | 2088 +++++++++++++++++ 1 file changed, 2088 insertions(+) create mode 100644 WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_aa diff --git a/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_aa b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_aa new file mode 100644 index 0000000..2f8282f --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_doc/teil2/doc2_aa @@ -0,0 +1,2088 @@ + + + + Anwendung - 162 - QQQQUUUUEEEELLLL + + + _2. AAAAnnnnwwwweeeennnnddddeeeerrrrddddooookkkkuuuummmmeeeennnnttttaaaattttiiiioooonnnn + IIIINNNNGGGG____DDDDBBBB 6666....3333////3333 ---- TTTTeeeeiiiillll IIIIIIII + + + + + + ############################################################# + ############################################################# + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ### # # ##### ###### ###### ## + ## # ## # # # # # # # ## + ## # # # # # # # # # ## + ## # # # # # #### # # ###### ## + ## # # # # # # # # # # ## + ## # # ## # # # # # # ## + ## ### # # ##### ####### ###### ###### ## + ## ## + ## ## + ## ## + ## ## + ## ####### ####### ### # ##### ## + ## # # # # # # ## + ## # # # # # ## + ## # ##### # # ##### ## + ## # # # # # ## + ## # # # # # ## + ## # ####### ### ####### ####### ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ## ## + ############################################################# + ############################################################# + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 163 - QQQQUUUUEEEELLLL + + + _2._1. AAAAnnnnwwwweeeennnndddduuuunnnngggg ddddeeeerrrr QQQQUUUUEEEELLLL **** + + + + + + + + + + + + Dieser Einfu"hrungskurs beschreibt, wie das ING_DB 6.3-DBS + anzuwenden ist. Sie sollten in der Lage sein, den angege- + benen Beispielen zu folgen und die gleichen Ergebnisse zu + erhalten. Die Datenbank "demo" ist in der ausgelieferten + Vertriebsversion enthalten. Nach den U"bungen in diesem + Kapitel sind sie in der Lage die anschliessenden beiden + Kapitel besser zu verstehen. Es empfiehlt sich auch, das + Referenz-Manual noch einmal gru"ndlich zu lesen. + + Die Daten-Manipulations-Sprache, die von ING_DB 6.3 + unterstu"tzt wird, nennt sich QUEL (Query Language) bzw. in + Kurzform Query. Eine vollsta"ndige Information zur QUEL wird + im ING_DB 6.3-Referenz-Manual (Teil I) gebracht. Dieser + Kurs beabsichtigt nicht, jedes Detail von ING_DB 6.3 zu + beru"hren. Es wird aber versucht, sie zu befa"higen, die QUEL + aktiv zu beherrschen und auf dieser Basis Schritt fu"r + Schritt in die Geheimnisse von ING_DB 6.3 einzusteigen. + + Fangen wir mit dem Eintritt in UNIX , dem Time-Sharing- + System, unter dem ING_DB 6.3 la"uft, an. Wenn irgend + mo"glich, benutzen sie ein Terminal, das u"ber Gross- und + Kleinbuchstaben verfu"gt, anderenfalls werden sie ein + schweres Leben haben. Wenn sie an einem Terminal arbeiten, + das nur Grossbuchstaben hat, geben sie "\\" anstelle "\" fu"r + Beispiele dieses Einfu"hrungskurses ein. + + Nach Eintritt in das Mehrnutzersystem (Eingabe des "login"- + Namens) wird auf dem Terminal die Bereitschaft mit "%" + angezeigt. (Durch A"nderung von PS1 im .profile + "/mnt/ing_db/.profile" auf "%" erhalten sie U"bereinstimmung + mit den angefu"hrten Beispielen, wobei "%" vom Terminal aus- + gegeben wird !) Um ING_DB 6.3 zu nutzen, geben sie + beispielsweise das Kommando: + + + % quel dt + + + + Das veranlasst UNIX , die Datenbank "demo" zur Nutzung durch + ING_DB 6.3 bereitzustellen. Nach einigen Sekunden + erscheint folgendes: + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 164 - QQQQUUUUEEEELLLL + + + + + ING_db version 6.3/3 login + Tue Aug 30 14:52:23 1985 + + ING_db> + * + + + + (Sofern sys/etc/dayfile nicht leer ist bzw. die Ausgabe + nicht unterdru"ckt wird, wird vor ING_db> noch der Inhalt + dieses File's angegeben.) Die ersten beiden Zeilen beinhal- + ten die ING_DB 6.3-Version (in diesem Fall "Version 6.3") + und das aktuelle Datum. Danach folgt die Ausgabe des "day- + file", das Mitteilungen - bezogen auf ING_DB 6.3 - entha"lt. + Das I N G - d b > zeigt an, dass ING_DB 6.3 bereit ist, + ihre Kommandos anzunehmen. + + Der Monitor erinnert mit einem Stern ("*") am Zeilenanfang + daran, dass ING_DB 6.3 auf eine Eingabe wartet. + Wenn Sie den Monitor zur Ausfu"hrung der Query angewiesen + haben, erscheint die Ausschrift Zu Beginn arbeiten wir mit + einer Relation "teile", die folgende Struktur hat: + + + * help teile + * \g + + I N G - d b . . . + + Relation: teile + --------- + Besitzer: ing_db + Tupellaenge: 34 + Verfallsdatum: Tue Apr 26 19:57:10 1988 + Tupelanzahl: 13 + Speicherstruktur: HEAP + Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel + ------------------------------------------- + tnum i 2 + tname c 20 + farbe c 8 + gewicht i 2 + menge i 2 + ------------------------------------------- + + ING-db: + + + Geben sie das Kommando: + + + * print teile + * \g + + I N G - d b . . . + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 165 - QQQQUUUUEEEELLLL + + + Die Zeile "print teile" fordert eine Anzeige von Daten, die + in der Datenbank gespeichert sind. Das "\g" weist den Moni- + tor zur Ausfu"hrung der Query an. Die Mitteilung + "I N G - d b . . . " + informiert, dass ING_DB 6.3 ihre Query ausfu"hrt. Der + Ausschrift wird noch der Maschinentyp vorangestellt. Das + Ergebnis sieht dann so aus: + + + Relation: teile + + + |tnum |tname |farbe |gewich|menge | + |--------------------------------------------------| + | 1|Zentraleinheit |rosa | 10| 1| + | 2|Hauptspeicher |grau | 20| 32| + | 3|Plattenspeicher |schwarz | 685| 2| + | 4|Magnetbandspeicher |schwarz | 450| 4| + | 5|Magnetbaender |grau | 1| 250| + | 6|Zeilendrucker |gelb | 578| 3| + | 7|Zeilendruckerpapier |weiss | 15| 95| + | 8|Terminals |blau | 19| 15| + | 13|Lochbandleser |schwarz | 107| 0| + | 14|Lochbandstanzer |schwarz | 147| 0| + | 9|Konsolpapier |weiss | 2| 350| + | 10|Kartenleser |grau | 327| 0| + | 11|Kartenstanzer |grau | 427| 0| + |--------------------------------------------------| + + ING_db: + * + + + + Das, was auf Ihrem Terminal angezeigt wurde, ist die + "teile"- Relation. Intuitiv, eine Relation ist nicht mehr, + als eine Tabelle mit Zeilen und Spalten. + + In diesem Fall ist der Name der Relation "teile". Sie hat + fu"nf Spalten (, wir nennen sie Doma"nen,) bezeichnet mit + "tnum" (Teile-Nummer), "tname" (Teile-Bezeichnung), "farbe", + "gewicht" und "menge" (Bestand). Jede Zeile der Relation + (genannt Tupel) repra"sentiert einen Eintrittspunkt (Satz), + der in diesem Fall ein Teil fu"r eine Computer-Installation + bezeichnet. Eine Relation kann bis zu 49 Doma"nen und eine + im Grunde genommen unbegrenzte Zahl von Tupeln haben. + + Beachten sie, nachdem die Query ausgefu"hrt ist, gibt ING_DB + 6.3 """"IIIINNNNGGGG____ddddbbbb::::"""" aus, wa"hrend anfangs nach dem Eintritt + """"IIIINNNNGGGG____ddddbbbb>>>>"""" angezeigt wurde. Wenn sie eine Query eingeben, + legt sie ING_DB 6.3 in einem "Arbeitsspeicher" ab. Wenn + sie eine Query falsch eingegeben haben, ko"nnen sie mit "\r", + also "reset" (dh. lo"schen) den Arbeitsspeicher lo"schen. + (Spa"ter werden wir Wege kennen lernen, um Fehler zu edi- + tieren, so, als wu"rden wir die eingegebene Query korri- + gieren.) + + Jederzeit ko"nnen sie sich den Arbeitsspeicher durch Eingabe + von "\p" ansehen. Versuchen sie "\p": + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 166 - QQQQUUUUEEEELLLL + + + + + * \p + print teile + ING-db: + * + + + + Der aktuelle Inhalt des Arbeitsspeichers wird angezeigt. + Versuchen sie jetzt "\r": + + + * \r + ING_db> + * + + + + Der Arbeitsspeicher ist jetzt leer. Solange ING_DB 6.3 + "ING_db:" ausgibt, ist der Arbeitsspeicher nicht-leer; + solange ING_DB 6.3 "ING_db>" ausgibt, ist er leer. + + Nachdem eine Query ausgefu"hrt wurde, gibt ING_DB 6.3 nor- + malerweise "ING_db:" aus. Wenn sie dann eine neue Query + eingeben, lo"scht ING_DB 6.3 automatisch die vorhergehende, + obwohl sie nicht nach jeder Query "\r" eingegeben haben. + Das wird spa"ter noch erkla"rt. + + Die Verwendung des "retrieve"-Kommandos erlaubt uns, spezi- + fische Queries u"ber Relationen zu schreiben. Als Beispiel + wollen wir ING_DB 6.3 veranlassen, nur "tname" als Doma"ne + aus der "teile"- Relation auszugeben. Geben sie das Kom- + mando: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 167 - QQQQUUUUEEEELLLL + + + + + * range of t is teile + * retrieve (t.tname) + * \g + + I N G - d b . . . + + |tname | + |--------------------| + |Zentraleinheit | + |Hauptspeicher | + |Plattenspeicher | + |Magnetbandspeicher | + |Magnetbaender | + |Zeilendrucker | + |Zeilendruckerpapier | + |Terminals | + |Lochbandleser | + |Lochbandstanzer | + |Konsolpapier | + |Kartenleser | + |Kartenstanzer | + |--------------------| + 13 tuples touched + + ING_db: + * + + + + Die Ausgabe beschra"nkt sich auf die Doma"ne "tname" aus der + Relation "teile". Dazu beno"tigten wir zwei Schritte. + Zuerst haben wir eine sogenannte "Tupel-Variable" deklariert + und ihren Bereich der Relation "teile" zugewiesen. + + + range of t is teile + + + Damit ist gemeint, dass der Buchstabe "t" die Relation + "teile" repra"sentiert. Man kann sich das als eine Mar- + kierung vorstellen, die die Relation "teile" eine Stufe + niedriger einordnet. ING_DB 6.3 merkt sich die Verbindung, + sodass, wenn "t" einmal als Bereich u"ber "teile" deklariert + wurde, eine Wiederholung der Deklaration nicht notwendig + ist. Das ist, wie wir spa"ter sehen werden, u"blich, falls + wir mit mehr als einer Relation arbeiten. + + Als na"chstes benutzten wir das "retrieve"-Kommando. Seine + Form ist + + + retrieve ( listen sie hier, wonach sie suchen ) + + + + "t" referenziert durch sich selbst die Relation "teile". + "t.tname" referenziert die Doma"ne "tname" der Relation + "teile", sozusagen: + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 168 - QQQQUUUUEEEELLLL + + + + + retrieve (t.tname) + + + meint die Recherche nach der Doma"ne "tname" der Relation + "teile". + + Versuchen wir nach "tname" und "farbe" zu recherchieren: + + + * retrieve t.tname, t.farbe + * \g + + I N G - d b . . . + + 2500: syntax error on line 1 + last symbol read was: . + + ING_db: + * + + + + Unglu"cklicherweise haben wir einen Fehler gemacht. ING_DB + 6.3 teilt uns mit, dass es einen Syntax-Fehler auf der + ersten Zeile der Query gefunden hat. "Syntax error" bedeu- + tet, dass wir etwas eingegeben haben, was ING_DB 6.3 nicht + wiedererkennen bzw. interpretieren kann. Der Fehler trat + auf Zeile 1 auf. ING_DB 6.3 fu"hrt einen manchmal undeutli- + chen Versuch zur Diagnose des Problems durch. Sofern + mo"glich, teilt uns ING_DB 6.3 mit, was es gelesen hat, + bevor es durcheinander kam. + + In diesem Fall ist der Fehler der, dass die Liste der + Rechercheobjekte (, die sogenannte "target_list",) in Klam- + mern eingeschlossen werden muss. Die korrekte Query ist: + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 169 - QQQQUUUUEEEELLLL + + + + + * retrieve (t.tname, t.farbe) + * \g + + I N G - d b . . . + + |tname |farbe | + |-----------------------------| + |Zentraleinheit |rosa | + |Hauptspeicher |grau | + |Plattenspeicher |schwarz | + |Magnetbandspeicher |schwarz | + |Magnetbaender |grau | + |Zeilendrucker |gelb | + |Zeilendruckerpapier |weiss | + |Terminals |blau | + |Lochbandleser |schwarz | + |Lochbandstanzer |schwarz | + |Konsolpapier |weiss | + |Kartenleser |grau | + |Kartenstanzer |grau | + |-----------------------------| + 13 tuples touched + + ING_db: + * + + + + Sie ko"nnen durch Hinzufu"gung einer "Qualifikation" an die + Query einschra"nken, welche Tupel ausgegeben werden sollen. + Beispielsweise, um die Namen und Farben nur der Teile zu + erhalten, die grau sind, geben sie ein: + + * retrieve (t.tname, t.farbe) + * where t.farbe = "grau" + * \g + + I N G - d b . . . + + |tname |farbe | + |-----------------------------| + |Hauptspeicher |grau | + |Magnetbaender |grau | + |Kartenleser |grau | + |Kartenstanzer |grau | + |-----------------------------| + 4 tuples touched + + ING-db: + * + + + Beachten sie, dass ING_DB 6.3 nur die Teile angibt, wo + "t.farbe" gleich "grau" ist. Beachten sie auch, dass grau + in Anfu"hrungsstrichen ("grau") stehen muss. Das ist notwen- + dig. Der einzige Weg, ING_DB 6.3 zur Erkennung von + Zeichenketten zu veranlassen (z.B. Worte), ist, sie in + Anfu"hrungsstriche einzuschliessen. + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 170 - QQQQUUUUEEEELLLL + + + Was ist, wenn wir die Bezeichnungen der Teile wissen wollen, + die grau oder rosa sind? Wir brauchen nur an die vorher- + gehende Query den Ausdruck + + + or t.farbe = "rosa" + + + anha"ngen. Erinnern sie sich, wie auch immer, wenn die + na"chste Zeile eingegeben wurde, beginnt ING_DB 6.3 eine + neue Query und wird automatisch den Arbeitsspeicher lo"schen. + Der Arbeitsspeicher kann nur ggggeeeerrrreeeetttttttteeeetttt werden, wenn die + na"chste Zeile mit einem solchen Kommando wie "\p" oder "\g" + beginnt. (Es gibt noch andere Mo"glichkeiten, wie wir spa"ter + sehen werden.) Wenn so ein Kommando eingegeben wird, ist die + vorhergehende Query gerettet und anschliessend kann an diese + Query angeha"ngt werden. + + Wir geben ein: + + + * \p + retrieve (t.tname, t.farbe) + where t.farbe = "grau" + ING-db: + * + + + + Sie ko"nnen die vorhergehende Query sehen. Jetzt geben sie + ein: + + + * or t.farbe = "rosa" + * + + + ING_DB 6.3 ha"ngt die letzte Zeile an das Ende der Query an. + Sie ko"nnen sich davon u"berzeugen, indem sie den + Arbeitsspeicher ausgeben: + + + * \p + retrieve (t.tname, t.farbe) + where t.farbe = "grau" + or t.farbe = "rosa" + ING-db: + * + + + Jetzt starten wir die Query: + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 171 - QQQQUUUUEEEELLLL + + + + + * \g + + I N G - d b . . . + + |tname |farbe | + |-----------------------------| + |Zentraleinheit |rosa | + |Hauptspeicher |grau | + |Magnetbaender |grau | + |Kartenleser |grau | + |Kartenstanzer |grau | + |-----------------------------| + 5 tuples touched + + ING-db: + * + + + Die Regeln dazu, wann der Arbeitsspeicher gelo"scht ist, + mo"gen anfangs etwas verwirrend erscheinen. Im Allgemeinen + wird ING_DB 6.3 genau das tun, was sie erwarten, ohne dass + sie viel daran denken. + + Wir haben die verwendeten Qualifikationen "or" und "=" + gesehen. Im Allgemeinen kann eine der folgenden verwendet + werden: + + + and + or + not + = (equal) + != (not equal) + > (greater than) + >= (greater than or equal) + < (less than) + <= (less than or equal) + + + Die Wertigkeit bestimmt sich in der Reihenfolge, wie die + Qualifikationen angegeben sind (d.h. von links nach rechts). + Klammern ko"nnen verwendet werden, um Zusammenha"nge in der + gewu"nschten Reihenfolge zu gruppieren. + + ING_DB 6.3 kann Berechnungen mit den, in der Relation + gespeicherten Daten ausfu"hren. Beispielsweise beinhaltet + die Relation "teile" den Bestand und das Gewicht fu"r jedes + Tupel. Wir mo"chten das Gesamtgewicht fu"r jede Gruppe von + Teilen wissen (,d.h. Gewicht multipliziert mit Bestand). + + Um die Bezeichnung, die Teile-Nummer und das Gesamtgewicht + fu"r jedes Teil zu erhalten, geben wir ein: + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 172 - QQQQUUUUEEEELLLL + + + + + * retrieve (t.tname, t.tnum, t.menge * t.gewicht) + * \g + + I N G - d b . . . + + 2500: syntax error on line 1 + last symbol read was: * + + ING_db: + * + + + Ein anderer Fehler! Das Problem besteht darin, dass nach + Ausfu"hrung einer Rechnung ING_DB 6.3 nicht weiss, wie es + die entstandene Doma"ne bei der Ausgabe bezeichnen soll. Fu"r + eine einfache Doma"ne nutzt ING_DB 6.3 den Doma"nen-Namen als + Titel (U"berschrift in der Kopfzeile). Wie auch immer, sie + mu"ssen eine neue Doma"ne gru"nden, um den Titel zu spezi- + fizieren: + + + tot = t.menge * t.gewicht + + + Die allgemeine Form ist: + + + title = expression + + + Zum Beispiel: + + + name = t.tname + berechnung = t.gewicht / 2000 * (t.menge + 2) + + + Wir wollen uns noch mit dem Fehler, der eine Korrektur der + Query erfordert, bescha"ftigen. Solange die erste Zeile nach + einer Query nicht mit "\p" oder "\g" beginnt, wird ING_DB + 6.3 automatisch den Arbeitsspeicher lo"schen und die vorher- + gehende Query ist fu"r uns verloren. + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 173 - QQQQUUUUEEEELLLL + + + + * retrieve (t.tname, t.tnum, tot=t.menge * t.gewicht) + \g + + I N G - d b . . . + + |tname |tnum |tot | + |----------------------------------| + |Zentraleinheit | 1| 10| + |Hauptspeicher | 2| 640| + |Plattenspeicher | 3| 1370| + |Magnetbandspeicher | 4| 1800| + |Magnetbaender | 5| 250| + |Zeilendrucker | 6| 1734| + |Zeilendruckerpapier | 7| 1425| + |Terminals | 8| 285| + |Lochbandleser | 13| 0| + |Lochbandstanzer | 14| 0| + |Konsolpapier | 9| 700| + |Kartenleser | 10| 0| + |Kartenstanzer | 11| 0| + |Hauptspeicher | 2| 640| + |Kartenleser | 10| 0| + |----------------------------------| + 13 tuples touched + + ING_db: + * + + + Ausser der Multiplikation unterstu"tzt ING_DB 6.3 bspw. die + Operatoren + + + Addition + - Subtraktion (und Bina"rnegation) + / Division + * Multiplikation + ** Exponentation (z.B. 3**10) + abs Absolutwert (z.B. abs(p.qoh - 50) ) + mod Modulo-Division (Divisionsrest) + + und einige andere mehr. U"berpru"fen sie bitte im ING_DB + 6.3-Referenz-Manual diese kurze Darstellung und + vervollsta"ndigen sie, was unterstu"tzt wird. + + Wenn wir anschliessend die Teile-Nummer 2 oder 10 auswa"hlen + wollen, dann ko"nnen wir die Qualifikation + + + where t.tnum = 2 or t.tnum = 10 + + angeben. + + VVVVOOOORRRRSSSSIIIICCCCHHHHTTTT:::: Wenn wir gerade damit beginnen "where t.tnum .... + " einzugeben, wird ING_DB 6.3 das als Beginn einer neuen + Query verstehen und den Arbeitsspeicher lo"schen. Um das zu + umgehen, ko"nnen sie "\p" eingeben und ein anschliessendes + "append"-Kommando garantiert ("\a" (append)), dass, was + immer sie eingeben, dem Inhalt des Arbeitsspeichers + hinzugefu"gt wird. Dieses Kommando wird nur beno"tigt, + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 174 - QQQQUUUUEEEELLLL + + + nachdem zwischenzeitlich eine Query zur Ausfu"hrung + angewiesen wurde. Zum anderen werden Daten automatisch + hinzugefu"gt. Versuchen sie folgendes: + + + * \a + * where t.tnum = 2 or t.tnum = 10 + * \g + + I N G - d b . . . + + |tname |tnum |tot | + |----------------------------------| + |Hauptspeicher | 2| 640| + |Kartenleser | 10| 0| + |----------------------------------| + 2 tuples touched + + ING_db: + * + + + Um alle Teile-Nummern gro"sser als 2 und kleiner, gleich 10 + auszuwa"hlen, folgendes: + + + * retrieve (t.tname, t.tnum, tot=t.menge * t.gewicht) + * where t.tnum > 2 and t.tnum <= 10 + * \g + + I N G - d b . . . + + |tname |tnum |tot | + |----------------------------------| + |Plattenspeicher | 3| 1370| + |Magnetbandspeicher | 4| 1800| + |Magnetbaender | 5| 250| + |Zeilendrucker | 6| 1734| + |Zeilendruckerpapier | 7| 1425| + |Terminals | 8| 285| + |Konsolpapier | 9| 700| + |Kartenleser | 10| 0| + |----------------------------------| + 8 tuples touched + + ING_db: + * + + + + Nun wollen wir Unterstu"tzung, um die vorhergehende Query so + zu a"ndern, dass sie die Ergebnisse der Teile-Nummern + zwischen 5 und 10, anstelle von 2 und 10 liefert. Sie wa"ren + sicher vera"rgert, wenn sie nur ein Zeichen a"ndern mu"ssten, + sollen aber dafu"r die ganze Query nocheinmal eingeben. + Deshalb gestattet ING_DB 6.3 die Verwendung des UNIX -Text- + editors, um Korrekturen und/oder Hinzufu"gungen zu Ihrem + Arbeitsspeicher vorzunehmen. Jederzeit ko"nnen sie "\e" + eingeben, der ING_DB 6.3-Monitor schreibt ihren + Arbeitsspeicher auf ein File und ruft das UNIX -Programm + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 175 - QQQQUUUUEEEELLLL + + + "ed". Zum Beispiel: + + + * \e + >>ed + 83 + + + Die ">>ed"-Mitteilung sagt Ihnen, dass sie jetzt den Editor + nutzen. Die Zahl 83 ist die Anzahl der Bytes in Ihrem + Arbeitsspeicher. + + Wir ko"nnen nun die Query editieren und 2 auf 5 a"ndern. Die + UNIX -Dokumentation (Manual 1, "ed") beschreibt, wie der + Texteditor zu nutzen ist. Aber wir wollen lieber etwas dop- + pelt bringen und zeigen einige Editor-Kommandos, um zu + illustrieren, wie zu editieren ist: + + + 1p + retrieve (t.tname,t.tnum,tot = t.menge * t.gewicht) + 2p + where t.tnum > 2 and t.tnum <= 10 + s/2/5/p + where t.tnum > 5 and t.tnum <= 10 + w + 83 + q + * + + + Ganz kurz, was ereignet sich. "1p" und "2p" gibt die Zeilen + 1 und 2 aus. "s/2/5/p" ersetzt 5 durch 2 auf der aktuellen + Zeile (Zeile 2) und gibt diese Zeile anschliessend aus. "w" + schreibt die Query zuru"ck in den ING_DB 6.3- + Arbeitsspeicher. + + Innerhalb des Editors ko"nnen sie alle "ed"-Kommandos, ausser + "e" (,es vera"ndert den File-Namen) verwenden. Wenn sie mit + "quit" den Editor (q-Kommando) verlassen, sind sie wieder + zum Monitor zuru"ckgekehrt. Beachten sie, dass vor einem + "q"-Kommando ein "w"-Kommando gegeben werden muss, um den + Arbeitsspeicher zuru"ckzuschreiben (Aber keine Angst! Der + Editor erinnert sie daran, wenn sie es vergessen haben!). + + Um sich zu vergewissern, dass die Query korrekt ist, und um + sie auszufu"hren, geben sie ein: + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 176 - QQQQUUUUEEEELLLL + + + + * \p\g + retrieve (t.tname,t.tnum,tot = t.menge * t.gewicht) + where t.tnum > 5 and t.tnum <= 10 + + I N G - d b . . . + + + |tname |tnum |tot | + |----------------------------------| + |Zeilendrucker | 6| 1734| + |Zeilendruckerpapier | 7| 1425| + |Terminals | 8| 285| + |Konsolpapier | 9| 700| + |Kartenleser | 10| 0| + |----------------------------------| + 5 tuples touched + + ING_db: + * + + + + Wir nehmen an, dass ihr Interesse, soweit es die Relation + "teile" betrifft, erscho"pft ist. Sehen wir uns deshalb eine + neue Relation, genannt "lieferung" an. Geben sie ein: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 177 - QQQQUUUUEEEELLLL + + + + + * print lieferung + * \g + + I N G - d b . . . + + + lieferung relation + + |lnum |tnum |bnum |liefdat |menge | + |------------------------------------| + | 475| 1| 1001|73-12-31| 1| + | 475| 2| 1002|74-05-31| 32| + | 475| 3| 1001|73-12-31| 2| + | 475| 4| 1002|74-05-31| 1| + | 122| 7| 1003|75-02-01| 144| + | 122| 7| 1004|75-02-01| 48| + | 122| 9| 1004|75-02-01| 144| + | 440| 6| 1001|74-10-10| 2| + | 241| 4| 1001|73-12-31| 1| + | 62| 3| 1002|74-06-18| 3| + | 475| 2| 1001|73-12-31| 32| + | 475| 1| 1002|74-07-01| 1| + | 5| 4| 1003|74-11-15| 3| + | 5| 4| 1004|75-01-22| 6| + | 20| 5| 1001|75-01-10| 20| + | 20| 5| 1002|75-01-10| 75| + | 241| 1| 1005|75-06-01| 1| + | 241| 2| 1005|75-06-01| 32| + | 241| 3| 1005|75-06-01| 1| + | 67| 4| 1005|75-07-01| 1| + | 999| 10| 1006|76-01-01| 144| + | 241| 8| 1005|75-07-01| 1| + | 241| 9| 1005|75-07-01| 144| + |------------------------------------| + + ING_db: + * + + + Die "lieferung"-Relation beinhaltet "lnum" (, die Lieferer- + Nummer), "tnum" (, die Teile-Nummer des gelieferten Teils), + "bnum" (, die Bestellnummer), "liefdat" (, das Lieferdatum) + und "menge" (, die Liefermenge). + + Um herauszufinden, welche Teile von der Lieferer-Nummer 122 + geliefert werden, geben sie ein: + + + * retrieve (l.tnum) where l.lnum = 122 + * \g + + I N G - d b . . . + + 2109: line 1, Variable 'l' not declared in RANGE statement + + ING_db: + * + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 178 - QQQQUUUUEEEELLLL + + + Wir haben die Tupel-Variable "l" (, d.h. l.tnum) verwendet, + ohne ING_DB 6.3 mitzuteilen, was "l" repra"sentiert. Wir + haben die Bereichsdeklaration "range" vergessen. Korri- + gieren wir die Query wie folgt: + + + * range of l is lieferung + * retrieve (l.tnum) where l.lnum = 122 + * \g + + I N G - d b . . . + + + |tnum | + |------| + | 7| + | 7| + | 9| + |------| + 3 tuples touched + + ING_db: + * + + + Die Lieferer-Nummer 122 liefert die Teile-Nummern 7, 7 und + 9. Beachten sie, dass 7 zweimal aufgelistet wurde. Bei der + Recherche nach Tupeln u"ber das Terminal ist es effizienter + fu"r ING_DB 6.3, nnnniiiicccchhhhtttt nach doppelten Tupeln suchen zu + mu"ssen. ING_DB 6.3 ist in der Lage doppelte Tupel zu + lo"schen. Wir wollen darauf spa"ter zuru"ckkommen. + + Wir wissen jetzt, dass der Lieferer 122 die Teile-Nummern 7 + und 9 liefert. Wenn sie diese Query nicht einige hundert + mal abarbeiten, wissen sie sicher nicht, was mit den Teile- + Nummern 7 und 9 gemeint ist. Wir ko"nnen das einfach heraus- + finden, wenn wir die Query + + + * retrieve (t.tname) where t.tnum = 7 or + * t.tnum = 9 + * \g + + I N G - d b . . . + + |tname | + |--------------------| + |Zeilendruckerpapier | + |Konsolpapier | + |--------------------| + 2 tuples touched + + ING_db: + * + + + abarbeiten. Nach zwei Queries wissen wir die Teile- + Bezeichnung der Teile, die der Lieferer 122 liefert. Wir + ko"nnen dasselbe in einer Query erreichen, wenn wir fragen: + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 179 - QQQQUUUUEEEELLLL + + + + + * retrieve (t.tname) where t.tnum = l.tnum + * and l.lnum = 122 + * \g + + I N G - d b . . . + + + |tname | + |--------------------| + |Zeilendruckerpapier | + |Zeilendruckerpapier | + |Konsolpapier | + |--------------------| + 3 tuples touched + + ING_db: + * + + + Beachten sie, dass "Zeilendruckerpapier" doppelt vorkommt. + Schauen sie sich schliesslich die Query an. Sie bemerken, + dass die Doma"ne "tnum" sowohl in der Relation "teile", als + auch in "lieferung" vorkommt. Mit der Aussage "t.tnum = + l.tnum" verbinden wir logisch die beiden Relationen. + + Um alle Lieferer, die die Zentraleinheit liefern, zu finden, + folgende Unterstu"tzung. Wir wissen, wie wir nach "l.lnum" + recherchieren. Wir mo"chten aber nur jene "l.lnum"'s wissen, + wo die korrespondierende "l.tnum" gleich der Teile-Nummer + der Zentraleinheit ist. + + Wenn wir den "t.tname" finden, der gleich "Zentraleinheit" + ist, dann haben wir die korrekte Teile-Nummer "t.tnum". + Schliesslich mo"chten wir "l.tnum = t.tnum", die Query lau- + tet: + + + * retrieve (l.lnum) where + * l.tnum = t.tnum and t.tname = "Zentraleinheit" + * \g + + I N G - d b . . . + + |lnum | + |------| + | 475| + | 475| + | 241| + |------| + 3 tuples touched + + ING_db: + * + + + Wir wollen die Relationen "teile" und "lieferung" verlassen + und etwas anderes probieren. Zuerst ko"nnen wir feststellen, + welche anderen Relationen die Datenbank besitzt, wenn wir + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 180 - QQQQUUUUEEEELLLL + + + eingeben: + + + * help \g + I N G - d b . . . + help \g + K1630 / EVK Olbernhau - k 1630 / DBA ing_db + DB nicht parallel verwendbar + keine QRYMOD-Unterstuetzung + Seitengroesse 1024 Byte + + Relation Besitzer Typ + ---------------------------------------------- + attribute ing_db Systemkatalog + relation ing_db Systemkatalog + indexes ing_db Systemkatalog + integrities ing_db Systemkatalog + lager ing_db Systemkatalog + personal ing_db Nutzerkatalog + lieferant ing_db Systemkatalog + abt ing_db Systemkatalog + teile ing_db Nutzerkatalog + artikel ing_db Systemkatalog + protect ing_db Systemkatalog + lieferung ing_db Nutzerkatalog + tree ing_db Systemkatalog + ---------------------------------------------- + + ING-db: + * + + + Schauen wir uns die Relation "personal" an. Sofern wir + nichts u"ber die Relation wissen, ko"nnen wir das "help"- + Kommando nutzen, um etwas daru"ber zu erfahren. Geben sie + ein: + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 181 - QQQQUUUUEEEELLLL + + + + + * help personal + * \g + + I N G - d b . . . + + relation: personal + --------- + Besitzer: ing_db + Tupellaenge: 30 + Verfallsdatum: Tue Apr 26 11:01:30 1988 + Tupelanzahl: 25 + Speicherstruktur: HEAP + Relationentyp: Nutzerrelation + + Domaenenname Typ Laenge Schluessel. + ---------------------------------------- + num i 2 + name c 20 + gehalt i 2 + leiter i 2 + gebdat i 2 + einstdat i 2 + ---------------------------------------- + + ING_db: + * + + + Das "help"-Kommando listet U"bersichtsinformationen zur Rela- + tion "personal" aus, weiterhin zu jedem Attribut, seinem Typ + und seiner La"nge. + + ING_DB 6.3 unterstu"tzt drei Datentypen: Integerzahlen, + Gleitkommazahlen und Zeichenketten. Zeichenketten-Doma"nen + ko"nnen von 1 bis 255 Zeichen lang sein. Integer-Doma"nen + ko"nnen 1, 2, oder 4 Bytes lang sein. Das bedeutet, dass + Integerzahlen einen Wertebereich von 127, 32767 und + 2147483647 maximal annehmen ko"nnen. Gleitkommazahlen ko"nnen + entweder 4 oder 8 Bytes lang sein. Beide erhalten einen + Maximalwert von u"ber 10**38; mit 7 oder 17 Ziffern genauer + Abbildung. + + Um alle Doma"nen anzusehen, ko"nnen wir das "print"-Kommando + oder das "retrieve"-Kommando nutzen und geben jede Doma"ne in + der "target_list" an. ING_DB 6.3 verschafft uns einen Weg, + mit wenig Arbeitsaufwand, das zu realisieren. Versuchen sie + folgendes: + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 182 - QQQQUUUUEEEELLLL + + + + + * range of p is personal + * retrieve (p.all) + * \g + + I N G - d b . . . + + |num |name |gehalt|leiter|gebdat|einstd| + |-------------------------------------------------------| + | 157|Schmidt, Petra | 1200| 199| 1940| 1960| + | 1110|Kayser, Helmut | 600| 33| 1952| 1973| + | 35|Loda, Dieter | 500| 32| 1952| 1974| + | 129|Thoms, Rolf | 1000| 199| 1941| 1962| + | 13|Wunsch, Peter-Paul | 900| 199| 1928| 1958| + | 215|Mueller, Ernst | 700| 10| 1950| 1971| + | 55|Malter, Juergen | 1200| 199| 1920| 1969| + | 26|Schneider, Peter | 1300| 199| 1930| 1970| + | 98|Weise, Juergen | 900| 199| 1935| 1969| + | 32|Heine, Rolf | 905| 199| 1929| 1967| + | 33|Ernst, Eva | 1010| 199| 1931| 1963| + | 199|Gruene, Peter | 1700| 0| 1920| 1952| + | 4901|Baum, Klaus | 837| 32| 1956| 1975| + | 843|Schmidt, Hermann | 1120| 26| 1936| 1956| + | 2398|Warnke, Peter | 788| 26| 1940| 1959| + | 1639|Maerz, Udo | 1116| 55| 1947| 1970| + | 5119|Mueller, Petra | 1362| 55| 1939| 1963| + | 37|Neumann, Inge | 1198| 26| 1950| 1974| + | 5219|Weber, Franz | 1337| 33| 1944| 1959| + | 1523|Zeidler, Fritz | 1686| 129| 1928| 1949| + | 430|Moser, Otto | 1567| 129| 1938| 1959| + | 994|Schulze, Ernst | 1564| 129| 1944| 1970| + | 1330|Fleischer, Karl | 877| 13| 1952| 1971| + | 10|Rose, Peter | 1590| 199| 1927| 1953| + | 11|Rose, Petra | 1206| 0| 1931| 1951| + |-------------------------------------------------------| + 25 tuples touched + + ING_db: + * + + + "all" ist ein Schlu"sselwort, das bei ING_DB 6.3 angewendet + wird, um alle Doma"nen zu erhalten. Fu"r die Doma"nen ist eine + besondere Reihenfolge nicht sichergestellt. Die vorher- + gehende Query ist a"quivalent zu: + + + range of p is personal + retrieve (p.num, p.name, p.gehalt, p.leiter + p.gebdat, p.einstdat) + + + Wir wollen nach dem Gehalt von Peter Wunsch recherchieren. + An diesem Punkt ist es gu"nstig, u"ber Gross- und Klein- + buchstaben zu verfu"gen. Wenn sie an einem Grossbuchstaben- + Terminal arbeiten, geben sie einen einfachen "\" vor jenen + Buchstaben, die sie in Grossbuchstaben umwandeln wollen. + Damit mu"sste an einem Grossbuchstaben-Terminal "\WUNSCH, + \PETER" eingegeben werden. Wenn sie an einem Gross- + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 183 - QQQQUUUUEEEELLLL + + + /Kleinbuchstaben-Terminal arbeiten, benutzen sie die + Umschalttaste (u.U. auch SHIFT) um Grossbuchstaben zu + schreiben. + + Starten sie die Query: + + + * retrieve (p.name,p.gehalt) + * where p.name = "Wunsch, Peter" + * \g + + I N G - d b . . . + + + |name |gehalt| + |---------------------------| + |---------------------------| + + ING_db: + * + + + Das Ergebnis ist leer. Es gibt keinen "p.name", der die + Qualifikation erfu"llt. Das befremdet, weil wir wissen, dass + es einen Peter Wunsch gibt. Jedoch weiss ING_DB 6.3 nicht, + dass "Peter-Paul" und "Peter" semantisch das Gleiche ist. + + Um in dieser Situation die korrekte Antwort zu erhalten, + mu"ssen sie die speziellen "pattern matching"-Zeichen (Ver- + gleichsmuster), die ING_DB 6.3 bereitha"lt, verwenden. Ein + solches Zeichen ist "*". Es ist irgendeiner Zeichenkette + von 0 bis mehreren Zeichen ebenbu"rtig. Versuchen sie es: + + + * retrieve (p.name,p.gehalt) + * where p.name = "Wunsch, P*" + * \g + + I N G - d b . . . + + + |name |gehalt| + |---------------------------| + |Wunsch, Peter-Paul | 900| + |---------------------------| + 1 tuples touched + + ING_db: + * + + + + Probieren wir damit etwas anderes. + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 184 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name, p.gehalt) where p.name = "Rose, P*" + * \g + + I N G - d b . . . + + |name |gehalt| + |---------------------------| + |Rose, Peter | 1590| + |Rose, Petra | 1206| + |---------------------------| + 2 tuples touched + + ING-db: + * + + Im ersten Fall ersetzt "*" die Zeichenkette "eter" und im + zweiten Fall "etra". + + Hier ein anderes Beispiel. Finden sie die Geha"lter der Per- + sonen, deren Vorname "Peter" ist: + + + * retrieve (p.name,p.gehalt) + * where p.name = "*, Peter*" + * \g + + I N G - d b . . . + + |name |gehalt| + |---------------------------| + |Wunsch, Peter-Paul | 900| + |Schneider, Peter | 1300| + |Gruene, Peter | 1700| + |Warnke, Peter | 788| + |Rose, Peter | 1590| + |---------------------------| + 5 tuples touched + + ING_db: + * + + + Beachten sie, wenn wir nach p.name = "*, Peter" gefragt + ha"tten, wa"re das 1. Tupel nicht ausgewa"hlt worden. Ebenso + ignoriert ING_DB 6.3 "blanks" in irgendeinem Zeichenketten- + vergleich, egal ob sie "pattern matching" anwenden oder + nicht. Das bedeutet, dass die folgenden Varianten alle das + gleiche Ergebnis bringen: + + + p.name = "Rose,Peter" + p.name = "Rose, Peter " + p.name = "R o s e,Peter" + + + Einzelne Zeichen oder Bereiche von Zeichen ko"nnen in eckige + Klammern ([]) eingeschlossen werden. Zum Beispiel, finde + alle Personen, deren Namen mit "B" bis "F" beginnen: + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 185 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,p.gehalt) + * where p.name = "[B-F]*" + * \g + + I N G - d b . . . + + |name |gehalt| + |---------------------------| + |Ernst, Eva | 1010| + |Baum, Klaus | 837| + |Fleischer, Karl | 877| + |---------------------------| + 3 tuples touched + + ING_db: + * + + + Beachten sie, dass die letzte Query auch auf einem anderen + Weg realisiert werden ko"nnte: + + + * retrieve (p.name,p.gehalt) + * where p.name >"A*" and p.name <"G*" + * \g + + I N G - d b . . . + + |name |gehalt| + |---------------------------| + |Ernst, Eva | 1010| + |Baum, Klaus | 837| + |Fleischer, Karl | 877| + |---------------------------| + 3 tuples touched + + ING_db: + * + + + Die beiden Ergebnisse sind identisch; jedoch ist der zweite + Weg in der Ausfu"hrung fu"r ING_DB 6.3 effizienter. + + Es gibt drei Typen von "pattern matching"-Konstruktionen. + Alle drei Typen ko"nnen in einer Kombination fu"r + Zeichenketten-Vergleiche genutzt werden. Das sind: + + + * A"quivalent zu einer beliebig langen Zeichenkette; + + ? A"quivalent zu einem Zeichen (nicht "blank") + + [] Kann irgendein Zeichen u"berdecken, das in Klammern + eingeschlossen ist. Wenn zwei Zeichen durch Binde- + strich (-) getrennt werden, dann wird jedes Zeichen, + das zwischen beiden in der alphabetischen Folge stehen + wu"rde u"berdeckt. + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 186 - QQQQUUUUEEEELLLL + + + Die spezielle Bedeutung der "pattern matching"-Zeichen kann + durch die Kaschierung mit "\" aufgehoben werden. Damit + referenziert "\*" nur das Zeichen "*". + + Wir wenden uns nun den Aggregat-Operatoren, die ING_DB 6.3 + unterstu"tzt, zu. Sie befa"higen den Nutzer, Berechnungen auf + Doma"nen einer Relation vorzunehmen. Zum Beispiel ist einer + dieser Aggregat-Operatoren Durchschnitt (avg) ="average". + Um das durchschnittliche Gehalt fu"r alle Angestellten zu + berechnen, geben wir ein: + + + * retrieve (dgehalt=avg(p.gehalt)) + * \g + + I N G - d b . . . + + + |dgehalt | + |----------| + | 1126.520| + |----------| + 1 tuples touched + + ING_db: + * + + + Der Name "dgehalt" ist willku"rlich, aber notwendig; ING_DB + 6.3 beno"tigt eeeeiiiinnnneeeennnn Namen fu"r irgendeinen Ausdruck in der + "target_list" (anders als fu"r eine einfache Doma"ne). + + Wir ko"nnen auch das niedrigste (Minimum) und ho"chste (Ma- + ximum) Gehalt finden: + + + * retrieve (mingeh=min(p.gehalt),maxgeh=max(p.gehalt)) + * \g + + I N G - d b . . . + + + |mingeh|maxgeh| + |-------------| + | 500| 1700| + |-------------| + 1 tuples touched + + ING_db: + * + + + Wenn wir die Namen der Angestellten wissen wollen, die das + niedrigste und ho"chste Gehalt beziehen, dann mu"sste die + Query lauten: + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 187 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name, p.gehalt) + * where p.gehalt = min(p.gehalt) or p.gehalt = max(p.gehalt) + * \g + + I N G - d b . . . + + |name |gehalt| + |---------------------------| + |Loda, Dieter | 500| + |Gruene, Peter | 1700| + |---------------------------| + 2 tuples touched + + ING_db: + * + + + ING_DB 6.3 unterstu"tzt folgende Aggregat-Operatoren: + + + count Za"hle Tupel + min Minimum der Doma"ne + max Maximum der Doma"ne + avg Berechne Durchschnitt + sum Summiere Tupel entsprechend Doma"ne + any logischer Wert entsprechend Qualifikation + + + Wir wollen jetzt eine Query vorstellen, die je Angestelltem + das Durchschnittsgehalt u"ber alle Angestellten auslistet: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 188 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,pergeh=avg(p.gehalt)) + * \g + + I N G - d b . . . + + |name |pergeh | + |-------------------------------| + |Schmidt, Petra | 1126.520| + |Kayser, Helmut | 1126.520| + |Loda, Dieter | 1126.520| + |Thoms, Rolf | 1126.520| + |Wunsch, Peter-Paul | 1126.520| + |Mueller, Ernst | 1126.520| + |Malter, Juergen | 1126.520| + |Schneider, Peter | 1126.520| + |Weise, Juergen | 1126.520| + |Heine, Rolf | 1126.520| + |Ernst, Eva | 1126.520| + |Gruene, Peter | 1126.520| + |Baum, Klaus | 1126.520| + |Schmidt, Hermann | 1126.520| + |Warnke, Peter | 1126.520| + |Maerz, Udo | 1126.520| + |Mueller, Petra | 1126.520| + |Neumann, Inge | 1126.520| + |Weber, Franz | 1126.520| + |Zeidler, Fritz | 1126.520| + |Moser, Otto | 1126.520| + |Schulze, Ernst | 1126.520| + |Fleischer, Karl | 1126.520| + |Rose, Peter | 1126.520| + |Rose, Petra | 1126.520| + |-------------------------------| + 25 tuples touched + ING_db: + * + + + Ein Aggregat-Operator erzeugt immer einen einfachen Wert. + Um die letzte Query auszufu"hren, bildet ING_DB 6.3 das + Durchschnittsgehalt zuna"chst zu jedem Namen ("p.name") ab. + + Aggregat-Operatoren ko"nnen ihre eigene Qualifikation haben. + Zum Beispiel ko"nnen wir eine Liste u"ber alle Angestellten + herstellen und das Durchschnittsgehalt fu"r alle Angestellten + u"ber 50 (Jahre) berechnen und eintragen: + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 189 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,pergeh= + * avg(p.gehalt where 1985-p.gebdat > 50)) + * \g + + I N G - d b . . . + + |name |pergeh | + |-------------------------------| + |Schmidt, Petra | 1277.444| + |Kayser, Helmut | 1277.444| + |Loda, Dieter | 1277.444| + |Thoms, Rolf | 1277.444| + |Wunsch, Peter-Paul | 1277.444| + |Mueller, Ernst | 1277.444| + |Malter, Juergen | 1277.444| + |Schneider, Peter | 1277.444| + |Weise, Juergen | 1277.444| + |Heine, Rolf | 1277.444| + |Ernst, Eva | 1277.444| + |Gruene, Peter | 1277.444| + |Baum, Klaus | 1277.444| + |Schmidt, Hermann | 1277.444| + |Warnke, Peter | 1277.444| + |Maerz, Udo | 1277.444| + |Mueller, Petra | 1277.444| + |Neumann, Inge | 1277.444| + |Weber, Franz | 1277.444| + |Zeidler, Fritz | 1277.444| + |Moser, Otto | 1277.444| + |Schulze, Ernst | 1277.444| + |Fleischer, Karl | 1277.444| + |Rose, Peter | 1277.444| + |Rose, Petra | 1277.444| + |-------------------------------| + 25 tuples touched + + ING_db: + * + + + Im Gegensatz zur vorhergehenden Query folgendes Beispiel. + Wir wollen die Namen derjenigen Angestellten u"ber fu"nfzig + suchen und das Durchschnittsgehalt fu"r alle berechnen. + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + + + + + + Anwendung - 190 - QQQQUUUUEEEELLLL + + + + + * retrieve (p.name,pergeh=avg(p.gehalt)) + * where 1985-p.gebdat > 50 + * \g + + I N G - d b . . . + + |name |pergeh | + |-------------------------------| + |Wunsch, Peter-Paul | 1126.520| + |Malter, Juergen | 1126.520| + |Schneider, Peter | 1126.520| + |Heine, Rolf | 1126.520| + |Ernst, Eva | 1126.520| + |Gruene, Peter | 1126.520| + |Zeidler, Fritz | 1126.520| + |Rose, Peter | 1126.520| + |Rose, Petra | 1126.520| + |-------------------------------| + 9 tuples touched + + ING_db: + * + + + Es gibt einen bedeutenden Unterschied zwischen den beiden + letzten Queries. Der Aggregat-Operator ist vollsta"ndig in + sich abgeschlossen. Er wird nicht durch die Qualifikation + der Query als Ganzes beeinflusst. + + Im ersten Fall wurde der Durchschnitt nur fu"r die + Angestellten u"ber fu"nfzig berechnet und u"ber alle + Angestellten durchsucht. Im zweiten Fall jedoch, wurde der + Durchschnitt fu"r alle Angestellten berechnet, aber nur fu"r + die Angestellten u"ber fu"nfzig eingetragen. + + Wenn wir eine Liste aller Angestellten u"ber 50 zusammen mit + dem durchschnittlichen Gehalt wu"nschen, kombinieren wir die + vorhergehenden zwei Queries zu einer. Diese Query ko"nnte + sein: + + + + + + + + + + + + + + + + + + + + + + + ING_DB 6.3/3 Juni 16, 1989 IIIINNNNGGGG____DDDDBBBB + +