.ds RH \f3Einfuehrung\f1 .ds LH Referenz_Manual .ds RF \f3QUEL\f1 .ds CH - % - .bp .RE .NH 2 .ft B Anfragesprache * .ft R .LP .sp 10 .NH 3 .ft B Beschreibung zur Anfragesprache Quel von \*(yy .ft R .br .ft B 6.3/3 * .ft R .LP Der folgende Abschnitt ist eine Beschreibung der grunds\o'a"'tzlichen Syntax von QUEL. Die einzelnen Statements werden in gesonderten Abschnitten behandelt, hier nur die Klassen syntaktischer Variablen, aus denen die QUEL\c -Statements aufgebaut sind. .NH 4 .ft B Kommentare * .ft R .LP Ein Kommentar ist eine beliebige Zeichenfolge, eingebunden links durch "/*" und rechts durch "*/": .IP /* Das ist ein Kommentar */ .NH 4 .ft B Namen * .ft R .LP Namen in QUEL sind Folgen von maximal 12 alphanumerischen Zeichen (Buchstaben oder Ziffern), beginnend mit einem Buchstaben. Das Unterstreichungszeichen ("_", ) gilt als Buchstabe. Alle grossen Buchstaben - mit Ausnahme solcher in Zeichenketten - werden stillschweigend, automatisch in die ihnen entsprechenden kleinen Buchstaben umgewandelt. .NH 4 .ft B Schl\o'u"'sselworte * .ft R .LP Die folgenden Bezeichner sind als Schl\o'u"'sselworte reserviert und d\o'u"'rfen nicht anderweitig verwendet werden: .sp 1 .DS I abs all and any append ascii at atan avg avgu by concat copy cos count countu create dba define delete destroy distribute exp float4 float8 from help in index integrity int1 int2 int4 into is log max min mod modify not of on onto or permit print range replace retrieve save sin sqrt sum sumu to unique until usercode view where .DE .NH 4 .ft B Konstanten * .ft R .LP Entsprechend den drei, in QUEL verf\o'u"'gbaren Datentypen, gibt es drei Typen von Konstanten. .NH 5 .ft B Zeichenketten-Konstanten (Strings) * .ft R .LP Zeichenketten in QUEL sind Folgen von maximal 255 ASCII-Zeichen, eingebunden in die (doppelten !) Anf\o'u"'hrungsstriche ( " " ). Grosse Buchstaben innerhalb von Zeichenketten bleiben, so wie sie sind, erhalten. Bei Verwendung des Begrenzers " innerhalb von Zeichenketten ( als deren Bestandteil ), muss diesem ein ( "\e" ) vorangestellt werden. Das muss auch f\o'u"'r selbst erfolgen. (s. auch Abschnitt "Pattern matching ..") .LP Innerhalb von Zeichenketten d\o'u"'rfen nur druckbare Zeichen verwendet werden. Nicht druckbare Zeichen (control_character) werden in Leerzeichen konvertiert. .NH 5 .ft B Ganzzahlige Konstanten (Integer) * .ft R .LP Ganzzahlige Konstanten liegen im Wertebereich von -2\ 147\ 483\ 648 bis +2\ 147\ 483\ 647. Ganzzahlige Konstanten ausserhalb dieses Wertebereiches werden in eine Gleitkomma-Darstellung umgewandelt. Wenn die ganzzahlige Konstante kleiner als 32 768 und gr\o'o"'sser als -32 769 ist, wird sie als eine 2-Byte-Integer dargestellt, anderenfalls wird sie in eine 4-Byte-Integer konvertiert. .NH 5 .ft B Gleitkomma- (floating_point) Konstanten * .ft R .LP Gleitkomma-Konstanten werden mit einem ganzen Teil, dem De\%zimalpunkt(!), einem gebrochenen Teil (zusammen als Mantisse bezeichnet) und einem Exponenten formuliert. Genauer gesagt werden sie in folgendem Format geschrieben: .IP {} [.] [eE [+-] {}] .LP Im obigen speziellen Fall steht f\o'u"'r eine beliebige Ziffer. Ein Exponent ohne Mantisse erh\o'a"'lt die Mantisse 1 zugeordnet. Innerhalb einer Gleitkomma-Konstanten d\o'u"'rfen keine weiteren Zeichen eingebettet werden. Gleitkomma-Konstanten werden in doppelter Genauigkeit mit einem Wertebereich von ann\o'a"'hernd -10**38 bis +10**38 und einer Genauigkeit von 17 Dezimalziffern dargestellt. .NH 4 .ft B Konstante Operatoren .ft R .LP Die konstanten Operatoren sind Operatoren, die Konstanten liefern. .ft B dba .ft R liefert den Datenbankadministrator der verwendeten Datenbanken und .ft B usercode .ft R den gerade aktiven Nutzer. .IP .ft B .ft R .br .ft B .ft R .RE .sp 1 Sie liefern in der Ersetzung den String f\o'u"'r den bzw. den . .NH 4 .ft B Attribute * .ft R .LP Ein Attribut ist ein Konstrukt der Form: .IP . .LP .ft B .ft R identifiziert eine bestimmte Relation. Man kann den Bezeichner .ft B .ft R auffassen, als st\o'u"'nde er f\o'u"'r die Zeilen bzw. Tupel dieser Relation. Eine Variable wird einer Relation durch Verwendung des .ft B range- .ft R Statements zugeordnet. .ft B .ft R ist der Name einer der Spalten der Relation, \o'u"'ber der die Variable definiert ist. Damit bezeichnet das Konstrukt ein Attribut, das einen Wert aus der Dom\o'a"'ne repr\o'a"'sentiert. .NH 4 .ft B Arithmetische Operatoren * .ft R .LP Arithmetische Operatoren haben Ausdr\o'u"'cke von numerischem Format als Operanden. Einstellige Operatoren gruppieren von rechts nach links; zweistellige Operatoren gruppieren von links nach rechts. Die Operatoren - in der Reihenfolge absteigende Bindungsst\o'a"'rke - sind: .DS L +,- (einstellig) plus, minus ** Potenzierung *,/ Multiplikation, Division +,- (zweistellig) Addition, Subtraktion .DE .LP In weiter abfallender Bindungsst\o'a"'rke schliessen sich hieran die weiter hinten aufgef\o'u"'hrten Operatoren: .sp 1 .br .br .LP Klammern ( ) sind f\o'u"'r eine spezielle Festlegung der Bindung der Operatoren einzusetzen. Bei ganzzahligen Operationen wird der arithmetische \o'U"'berlauf und die Division durch Null nicht gepr\o'u"'ft. Bei Gleitkomma-Operationen wird \o'U"'berlauf, Unterlauf und Division durch Null nur gepr\o'u"'ft, wenn die entsprechende Hardware existiert und aktiv ist. .NH 4 .ft B Ausdr\o'u"'cke * .ft R .LP Ein Ausdruck ist entweder/oder ein(e): .DS I Konstante Attribut Funktionaler Ausdruck Aggregat oder Aggregat-Funktion Kombination von numerischen Ausdr\o'u"'cken und arithmetischen Operatoren .DE .LP Innerhalb dieses Handbuchs wird ein beliebiger Ausdruck als .ft B .ft R bezeichnet. .NH 4 .ft B Formate * .ft R .LP Jeder .ft B .ft R hat ein Format , das durch einen Buchstaben (\c .ft B c, .ft R .ft B i .ft R oder .ft B f, .ft R f\o'u"'r Zeichenfolgen (character), ganze Zahlen (integer) oder Gleitkomma-Daten(float) ) und eine Ziffer, die die Anzahl der zur Speicherung n\o'o"'tigen Bytes anzeigt, bezeichnet wird. Die unterst\o'u"'tzten Formate sind folgend aufgez\o'a"'hlt, der Wertebereich der nume\%rischen Formate ist in Klammern angegeben. .DS L c1 - c255 Zeichenketten von 1\-255 Bytes L\o'a"'nge i1 1-Byte Integer (-128 bis +127) i2 2-Byte Integer (-32768 bis +32767) i4 4-Byte Integer (-2 147 483 448 bis +2 147 483 647) f4 4-Byte floating (-10**38 bis +10**38, 7 Dezimalen Genauigkeit) f8 8-Byte floating (-10**38 bis +10**38, 17 Dezimalen Genauigkeit) .DE .LP Eine Variable von numerischem Format kann einer jeden anderen numerischen Formats zugewiesen werden, sie wird dabei konvertiert. .NH 4 .ft B Format Konvertierung * .ft R .LP Bei Operationen \o'u"'ber zwei numerische Dom\o'a"'nen von unterschiedlichem Format f\o'u"'hrt \*(yy\ automatisch die notwendigen Konvertierungen durch. .LP Bei Operationen zwischen einem ganzzahligen Operanden und einem Gleitkomma Operanden wird der ganzzahlige vor der Operation in Gleitkomma umgewandelt. Bei Operationen zwischen zwei ganzzahligen Operanden unterschiedli\%cher L\o'a"'nge wird der k\o'u"'rzere auf die L\o'a"'nge des l\o'a"'ngeren konvertiert. Bei Operationen zwischen zwei Gleitkomma Operanden unterschiedlicher Genauigkeit wird der l\o'a"'ngere in die Genauigkeit des k\o'u"'rzeren konvertiert. .LP Die folgende Tabelle gibt alle m\o'o"'glichen Kombinationen an: .DS I i1 i2 i4 f4 f8 i1 - i1 i2 i4 f4 f8 i2 - i2 i2 i4 f4 f8 i4 - i4 i4 i4 f4 f8 f4 - f4 f4 f4 f4 f4 f8 - f8 f8 f8 f4 f8 .DE .LP \*(yy\ unterst\o'u"'tzt die folgenden Konvertierungsoperatoren, die man an Stelle der o.g. automatischen Standardaktionen einsetzen kann: .DS I int1() Resultat hat Format i1 int2() Resultat hat Format i2 int4() Resultat hat Format i4 float4() Resultat hat Format f4 float8() Resultat hat Format f8 .DE .LP Die Konvertierungsoperatoren konvertieren ihr Argument also in das von ihnen bezeichnete Format. .ft B .ft R kann irgendwelche Zeichen enthalten. Wenn ein Zeichen nicht konvertiert werden kann, wird ein Fehler angezeigt und die Berechnung abgebrochen - das kann nur eintreten, wenn die Syntax f\o'u"'r den zu konvertierenden .ft B .ft R nicht eingehalten wurde. .LP \o'U"'berlauf wird bei Konvertierungen nicht gepr\o'u"'ft. .NH 4 .ft B Zielliste * .ft R .LP Eine .ft B .ft R ist eine geklammerte Liste von einem oder mehreren Elementen, die untereinander durch Kommata getrennt werden. Jedes ihrer Elemente muss eines der folgend aufgez\o'a"'hlten sein: .LP a) .ft B is .ft R .IP ist hier der Name einer Dom\o'a"'ne, die erzeugt werden soll (oder die, im Falle von update-Statements, bereits existiert). Das Gleichheitszeichen ( "=" ) ist gleichbedeutend mit .ft B is. .ft R In dem Falle, wo kein einfaches Attribut ist, muss diese Form benutzt werden, um den Ausdruck einem namentlich angegebenem Resultat zuzuordnen. .LP b) .IP Im Falle eines .ft B retrieve-\c .ft R Statements wird als Ergebnisspalte die angenommen, die den gleichen Namen, wie der dabei angegebene hat. Im Falle von update-Statements\p (\c .ft B append, replace\c .ft R ), muss die zu ver\o'a"'ndernde Relation eine Dom\o'a"'ne mit genau dem bezeichneten Namen aufweisen. .LP Innerhalb einer kann das Schl\o'u"'sselwort .ft B all .ft R dazu benutzt werden, alle Dom\o'a"'nen zu bezeichnen. Zum Beispiel .IP range of p is personal .br retrieve (p.all) where p.gehalt > 1000 .LP sucht alle Tupel der Relation personal, die die Bedingung : gehalt > 1000 erf\o'u"'llen. .ft B all .ft R kann in der von .ft B retrieve- .ft R oder .ft B append- .ft R Statements benutzt werden. Die Dom\o'a"'nen werden in ihrer erzeugten Reihenfolge eingesetzt, d.h. in der, in der sie mit dem .ft B create- .ft R Statement erzeugt wurden. .NH 4 .ft B Vergleichsoperatoren .br und Klauseln * .ft R .LP Es gibt Vergleichsoperatoren , die beliebige Ausdr\o'u"'cke als Operanden haben: .DS I < (kleiner als) <= (kleiner als oder gleich) > (gr\o'o"'sser als) >= (gr\o'o"'sser als oder gleich) = (gleich mit) != (ungleich zu) .DE .LP Diese Operatoren sind alle von gleicher Bindungsst\o'a"'rke. Bei Vergleichen zwischen Zeichenketten werden alle Leerzeichen innerhalb der Zeichenketten ignoriert. .LP Eine Klausel ist ein Paar von Ausdr\o'u"'cken, die durch einen Vergleichsoperator verkn\o'u"'pft sind: .IP .NH 4 .ft B Logische Operatoren .br und Qualifikation .br (auch ) * .ft R .LP Logische Operatoren haben Klauseln () als Operanden. Sie gruppieren von links nach rechts. .DS I not (logische Negation) and (logisches und; Konjunktion) or (logisches inclusives oder; Disjunktion) .DE .LP .ft B not .ft R hat von den drei Operatoren die h\o'o"'chste Bindungsst\o'a"'rke. .ft B and .ft R und .ft B or .ft R haben die gleiche Bindungsst\o'a"'rke. Klammern ( ) kann man f\o'u"'r eine spezielle Bindung einsetzen. .LP Eine .ft B .ft R besteht aus einer Anzahl von Klauseln , die durch logische Operatoren verkn\o'u"'pft sind. Eine kann damit sein: .IP .ft B .ft R .br .ft B not .ft R .ft B .ft R .br .ft B .ft R .ft B or .ft R .ft B .ft R .br .ft B .ft R .ft B and .ft R .ft B .ft R .br ( .ft B .ft R ) .NH 4 .ft B Funktionale Ausdr\o'u"'cke * .ft R .LP Ein .ft B .ft R ist ein Konstrukt, bestehend aus einem Funktionsnamen, gefolgt von einem eingeklammerten Operanden oder einer eingeklammerten Liste durch Kommata getrennter Operanden. Funktionale Ausdr\o'u"'cke k\o'o"'nnen in beliebiger Tiefe geschachtelt werden. In der folgenden Aufz\o'a"'hlung der unterst\o'u"'tzten Funktionen repr\o'a"'sentiert (\c .ft B n .ft R ) einen beliebigen Ausdruck von nume\%rischem Format. Das Resultat-Format ist rechts angezeigt. .DS I abs(n) - dasselbe wie n (Absolutwert) ascii(n) - Zeichenkette (konvertiert numerisch in Zeichen) atan(n) - f8 (arctangens) concat(a,b) - Zeichenkette (Verkettung) cos(n) - f8 (cosinus) exp(n) - f8 (n. Potenz von e) log(n) - f8 (nat\o'u"'rlicher Logarithmus) mod(n,b) - dasselbe wie b (n modulo b, n und b m\o'u"'ssen vom Format i1, i2 oder i4 sein sin(n) - f8 (sinus) sqrt(n) - f8 (Quadratwurzel) .DE .NH 4 .ft B Aggregat-Ausdr\o'u"'cke * .ft R .LP Aggregat-Ausdr\o'u"'cke erm\o'o"'glichen es, \o'u"'ber einer Menge von Seiten zusammengefasste Werte zu berechnen. .NH 5 .ft B Aggregat-Operatoren * .ft R .LP Folgende Aggregat-Operatoren und ihr Resultat-Format sind definiert. .DS L count - (i4) Anzahl von Vorkommen countu - (i4) Anzahl von einmaligen (unique) Vorkommen sum - Summierung sumu - Summierung aller unterschiedlichen Werte avg - (f8) Durchschnitt (average) (sum/count) avgu - (f8) unique average (sumu/countu) max - Maximum min - Minimum any - (i2) ergibt 1, sobald sich ein Tupel qualifiziert, sonst 0 .DE .NH 5 .ft B Einfache Aggregate * .ft R .IP .ft B .ft R (\c .ft R .ft B .ft R .br [ .ft B where .ft R .ft B .ft R ] ) .LP Ein einfaches Aggregat erzeugt einen einzelnen skalaren Wert. .ft B .ft R wird \o'u"'ber der Menge der Tupel aggregiert, die die .ft B .ft R erf\o'u"'llen (oder \o'u"'ber alle Tupel im Geltungsbereich des Ausdrucks, wenn keine angegeben ist). Die Operatoren .ft B sum .ft R und .ft B avg .ft R verlangen .ft B .ft R in numerischem Format; .ft B count, any, max .ft R und .ft B min .ft R arbeiten sowohl auf Zeichenketten, als auch auf .ft B .ft R von numerischem Format. .LP .ft B Einfache Aggregate sind .ft R .ft B vollst\o'a"'ndig lokal, .ft R d.h. sie werden logisch von der \o'u"'brigen Anfrage abgetrennt, separat berechnet und danach in der Anfrage durch ihren skalaren Wert ersetzt. .NH 5 .ft B Das any Aggregat * .ft R .LP Manchmal m\o'o"'chte man wissen, ob es Tupel gibt, die eine be\%stimmte erf\o'u"'llen. Eine M\o'o"'glichkeit, das zu erfahren, bietet die Benutzung des .ft B count- .ft R Aggregates, nach welchem man dann pr\o'u"'fen kann, ob sich Tupel qualifizieren. Die Benutzung von .ft B any .ft R anstelle von .ft B count .ft R ist deshalb effizienter, weil dabei die Berechnung abgebrochen wird, sobald das erste sich qualifizierende Tupel gefunden wurde. .LP .ft B any .ft R gibt 1 zur\o'u"'ck, wenn sich mindestens ein Tupel qualifiziert und sonst 0. .NH 5 .ft B Aggregat-Funktionen * .ft R .IP .ft B .ft R (\c .ft B .ft R .ft B by .ft R .ft B .ft R .br .ft B {, } .ft R [ .ft B where .ft R .ft B .ft R ] ) .LP Aggregat-Funktionen sind Verallgemeinerungen der einfachen Aggregate. Die .ft B by- .ft R Phrase gruppiert (d.h. portioniert) die Menge der sich qualifizierenden Tupel nach den Werten der .ft B .ft R (das ist ein ). Bei Angabe von mehr als einem .ft B , .ft R sind die durch .ft B by .ft R gruppierten Werte die Verkettung der einzelnen .ft B . .ft R .ft B .ft R gilt wie bei einfachen Aggregaten. Eine Aggregat-Funktion ergibt eine Menge von Aggregaten, je eines f\o'u"'r jede Portion, in die die Menge der sich qualifizierenden Tupel gruppiert wurde. Das Aggregat, das w\o'a"'hrend der Berechnung der Query jeweils benutzt wird, ist das, das der Portion zugeordnet ist, in das das jeweils gerade behandelte Tupel f\o'a"'llt. .LP Anders als bei einfachen Aggregaten sind Aggregat-Funktionen nicht vollst\o'a"'ndig lokal. Die by-Phrase, durch welche sich eine Aggregat-Funktion von einfachen Aggregaten unterscheidet, ist f\o'u"'r die Query global. Dom\o'a"'nen in der by-Phrase werden automatisch an andere Dom\o'a"'nen der gleichen Relation gebunden, sofern solche in der Query vorkommen. .LP Zum Beispiel: .DS L /* Bilde das Durchschnittsgehalt f\o'u"'r die Angestellten einer Abteilung */ range of p is personal retrieve (p.abteilung, dgehalt=avg(p.gehalt by p.abteilung)) .DE .NH 5 .ft B Aggregate \o'u"'ber "einmalige"-Werte * .ft R .LP H\o'a"'ufig ist es notwendig, nur \o'u"'ber die .ft B verschiedenen .ft R Werte eines Ausdrucks zu aggregieren. Die .ft B avgu .ft R , .ft B sumu .ft R und .ft B countu .ft R Aggregate unterdr\o'u"'cken alle mehrfach auftretenden Werte, bevor das Aggregat gebildet wird. Zum Beispiel: .IP count(p.abteilung) .LP w\o'u"'rde ermitteln, wie oft in den, in unserem Beispiel pro Angestellten angelegten Tupeln, das Attribut .ft B "p.abteilung" .ft R mit Werten belegt ist. Aber .IP countu(p.abteilung) .LP erst w\o'u"'rde z\o'a"'hlen, wieviele unterschiedliche Werte f\o'u"'r die Dom\o'a"'ne .ft B p.abteilung .ft R existieren (wof\o'u"'r man sich wahrscheinlich auch in diesem Beipiel interessiert). .NH 4 .ft B Spezifische Zeichenketten-Operatoren * .ft R .LP Es werden drei speziell f\o'u"'r die Arbeit mit Zeichenketten eingerichtete Arbeitsm\o'o"'glichkeiten unterst\o'u"'tzt: .NH 5 .ft B Mustersuche auf Zeichenketten .br ("Pattern matching") * .ft R .LP Es gibt vier Zeichen, die eine spezielle Bedeutung haben, wenn sie innerhalb von Zeichenketten-Konstanten (strings) einer eingesetzt werden: .IP * symbolisiert eine Zeichenkette von einem oder mehreren Zeichen. .IP ? symbolisiert ein einzelnes, beliebiges Zeichen. .IP [..] symbolisiert eines der, in den Klammern aufgez\o'a"'hlten Zeichen. Von "-" bis Angaben sind erlaubt. .LP Diese Zeichen kann man in beliebigen Kombinationen benutzen, um eine Vielzahl von Tests zu formulieren. Zum Beispiel: .LP where p.name = "*" - qualifiziert jeden beliebigen Namen. .LP where p.name = "E*" - qualifiziert einen, mit "E" beginnenden, sonst beliebigen Namen. .LP where p.name = "*ung" - qualifiziert alle Namen, die auf "ung" enden. .LP where p.name = "*[aeiou]*" - qualifiziert alle Namen, die irgendwo einen kleingeschriebenen Vokal enthalten. .LP where p.name = "Schul?" - qualifiziert alle 6 Zeichen langen Namen, die mit "Schul" beginnen. .IP \\ where p.name = "[A-J]*" - qualifiziert alle Namen, die mit A,B,..,J beginnen. .LP Die spezielle Bedeutung der pattern_matching-Zeichen wird aufgehoben, wenn man ihnen ein ( "\e" ) voranstellt. So bezeichnet "\e*" das Zeichen "*". Pattern-matching-Zeichen in einer m\o'u"'ssen immer durch "\e" kaschiert werden. Zum Beispiel: .sp 1 .br titel = "\e*\e*\e* muster \e*\e*\e*" .sp 1 ist die korrekte Art, die Kette "*** muster ***" der Dom\o'a"'ne "titel" zuzuweisen. .NH 5 .ft B Verkettung * .ft R .LP Es gibt einen Verkettungs- (concatenation) Operator, mit dem man aus zwei Zeichenketten eine bilden kann. Seine Syntax ist .br concat(feld1, feld2) Die L\o'a"'nge der neuen Zeichenkette ist die Summe der L\o'a"'ngen der beiden Quellketten. In feld1 hinten stehende Leerzeichen werden unterdr\o'u"'ckt, feld2 wird angekettet und die Ergebniskette wird hinten mit Leerzeichen aufgef\o'u"'llt. Ver\%kettungen k\o'o"'nnen beliebig in andere Ver\%kettungen geschachtelt werden. Zum Beipiel: .sp 1 .br name = concat(concat(x.nachname, ","), x.vorname) verkettet den Nachnamen mit einem Komma und kettet daran den Vornamen. .NH 5 .ft B ascii - numerisch zu .br Zeichenketten wandeln * .ft R .LP Die .ft B ascii .ft R Funktion kann benutzt werden, um ein numerisches Feld in eine Zeichenketten-Darstellung zu \o'u"'berf\o'u"'hren - das kann n\o'u"'tzlich sein, wenn die Aufgabe steht, ein numerisches Feld mit einem Zeichenkettenfeld zu vergleichen. Zum Beipiel: .br retrieve ( ... ) .br where x.chardomname = ascii(x.numdomname) .ft B ascii .ft R kann auf einen Zeichenketten-Wert angewandt werden; das Ergebnis ist die unge\o'a"'nderte Zeichenkette. Das Konvertierungsformat wird durch das Druckformat (printing_format, s. quel(unix)) bestimmt. .ft B SIEHE AUCH .ft R .IP append(quel), delete(quel), range(quel), replace(quel), retrieve(quel), quel(unix) .LP .ft B HILFEN .ft R .IP Die maximale Anzahl von Variablen, die in einer Anfrage benutzt werden kann, ist 10. .IP Numerischer \o'U"'berlauf, Unterlauf und Division durch Null werden nicht entdeckt. .IP Bei der Konvertierung numerischer Formate wird ein \o'U"'berlauf nicht entdeckt.