Referenzinformationen zu eXtreme-Scale-Abfragen

WebSphere eXtreme Scale hat eine eigene Sprache, mit der der Benutzer Daten abfragen kann.

FROM-Klausel in ObjectGrid-Abfragen

Die FROM-Klausel gibt die Sammlungen von Objekten an, auf die die Abfrage angewendet werden soll. Jede Sammlung wird anhand eines abstrakten Schemanamens und einer Identifikationsvariablen, einer so genannten Bereichsvariablen, oder anhand der Deklaration eines Sammlungselements identifiziert, die eine Beziehung mit einem einzelnen oder mehreren Werten und eine Identifikationsvariable angibt.

Konzeptionell ist die Semantik der Abfrage so, dass zuerst eine temporäre Sammlung von Tupeln (R) erstellt wird. Tupel setzen sich aus Elementen aus Sammlungen zusammen, die in der FROM-Klausel angegeben sind. Jedes Tupel enthält ein einziges Element aus jeder der Sammlungen in der FROM-Klausel. Alle möglichen Kombinationen werden auf der Basis der Vorgaben in den Deklarationen der Sammlungselemente erstellt. Wenn ein Schemaname eine Sammlung angibt, für die keine Datensätze im persistenten Speicher vorhanden sind, ist die temporäre Sammlung R leer.

Beispiele mit FROM

Das Objekt "DeptBean" enthält die Datensätze 10, 20 und 30. Das Objekt "EmpBean" enthält die Datensätze 1, 2 und 3, die sich auf Abteilung (Department) 10 beziehen, und die Datensätze 4 und 5, die sich auf Abteilung 20 beziehen. Abteilung 30 hat keine zugehörigen Mitarbeiterobjekte (employee).

FROM DeptBean d, EmpBean e

Diese Klausel erstellt eine temporäre Sammlung R, die 15 Tupel enthält.

FROM DeptBean d, DeptBean d1

Diese Klausel erstellt eine temporäre Sammlung R, die 9 Tupel enthält.

FROM DeptBean d, IN (d.emps) AS e

Diese Klausel erstellt eine temporäre Sammlung R, die 5 Tupel enthält. Abteilung 30 ist nicht in der temporären Sammlung R enthalten, weil es keine Mitarbeiterobjekte enthält. Abteilung 10 ist dreimal und Abteilung 20 zweimal in der temporären Sammlung R enthalten.

An Stelle von "IN(d.emps) as e" können Sie ein JOIN-Prädikat verwenden:

FROM DeptBean d JOIN d.emps as e

Nach der Erstellung der temporären Sammlung werden die Suchbedingungen der WHERE-Klausel auf die temporäre Sammlung R angewendet. Das Ergebnis ist eine neue temporäre Sammlung R1. Die ORDER-BY- und SELECT-Klauseln werden auf R1 angewendet, um die endgültige Ergebnismenge zu erhalten.

Eine Identifikationsvariable ist eine Variable, die in der FROM-Klausel über den Operator IN oder den optionalen Operator AS deklariert wird.

FROM DeptBean AS d, IN (d.emps) AS e

entspricht:

FROM DeptBean d, IN (d.emps) e

Eine Identifikationsvariable, die als abstrakter Schemaname deklariert wird, ist eine so genannte Bereichsvariable. In der vorherigen Abfrage ist "d" eine Bereichsvariable. Eine Identifikationsvariable, die als Pfadausdruck mit mehreren Werten deklariert wird, ist eine so genannte Sammlungselementdeklarationen. Die Werte "d" und "e" im vorherigen Beispiel sind Sammlungselementdeklarationen.

Im Folgenden sehen Sie ein Beispiel für die Verwendung eines Pfadausdrucks mit einem einzelnen Wert in der FROM-Klausel:

FROM EmpBean e, IN(e.dept.mgr) as m

SELECT-Klausel in ObjectGrid-Abfragen

Die Syntax der SELECT-Klausel wird im folgenden Beispiel veranschaulicht:

SELECT { ALL | DISTINCT } [ Auswahl , ]* Auswahl

selection  ::= {Pfadausdruck_mit_einem_einzelnen_Wert |
                Identifikationsvariable |
                OBJECT ( Identifikationsvariable) |
	       Aggregatfunktionen } [[ AS ] id ]

Die SELECT-Klausel setzt sich aus einem oder mehreren der folgenden Elemente zusammen: einer einzelnen Identifikationsvariablen, die in der FROM-Klausel definiert ist, einem Pfadausdruck mit einem einzelnen Wert, der in Objektreferenzen oder -werte ausgewertet wird, und einer Aggregatfunktion. Sie können das Schlüsselwort DISTINCT verwenden, um doppelte Referenzen auszuschließen.

Ein skalares Subselect ist ein Subselect, das einen Einzelwert zurückgibt.

Beispiele mit SELECT

Alle Mitarbeiter (employees) suchen, die mehr als der Mitarbeiter Job verdienen:

SELECT OBJECT(e) FROM EmpBean ej, EmpBean eWHERE ej.name = 'John' and e.salary > ej.salary

Alle Abteilungen (departments) suchen, die einen oder mehrere Mitarbeiter haben, die weniger als 20000 verdienen:

SELECT DISTINCT e.dept FROM EmpBean e where e.salary < 20000

Eine Abfrage kann einen Pfadausdruck enthalten, der in einen beliebigen Wert ausgewertet wird:

SELECT e.dept.name FROM EmpBean e where e.salary < 20000

Die vorherige Abfrage gibt eine Sammlung von Namenswerten für Abteilungen zurück, die Mitarbeiter haben, die weniger als 20000 verdienen.

Eine Abfrage kann einen Ergebniswert zurückgeben:

SELECT avg(e.salary) FROM EmpBean e

Im Folgenden sehen Sie eine Abfrage, die die Namen und Objektreferenzen für unterbezahlte Mitarbeiter zurückgibt:

SELECT e.name as name , object(e) as emp from EmpBean e where e.salary < 50000

WHERE-Klausel in ObjectGrid-Abfragen

Die WHERE-Klausel enthält Suchbedingungen, die sich aus den im Folgenden beschriebenen Elementen zusammensetzen. Wenn eine Suchbedingung mit TRUE ausgewertet wird, wird das Tupel der Ergebnismenge hinzugefügt.

ObjectGrid-Abfrageliterale

Ein Zeichenfolgeliteral wird in einfache Anführungszeichen eingeschlossen. Ein einfaches Anführungszeichen, das in einem Zeichenfolgeliteral enthalten ist, wird durch zwei einfache Anführungszeichen dargestellt, z. B. 'Tom''s'.

Ein numerisches Literal kann jeder der folgenden Werte sein:

  • ein genauer Wert wie 57, -957 oder +66,
  • ein vom Java-Typ "long" unterstützter Wert,
  • ein Dezimalliteral wie 57,5 oder -47,02,
  • ein ungefährer numerischer Wert wie 7E3 oder -57,4E-2
  • ein Datentyp 'float', der das Qualifikationsmerkmal "F" enthalten muss, z. B. 1.0F
  • ein Datentyp 'long', der das Qualifikationsmerkmal "L" enthalten muss, z. B. 123L

Boolesche Literale sind TRUE und FALSE.

Temporale Literale folgen der JDBC-Escape-Syntax auf der Basis des Attributtyps:

  • java.util.Date: jjjj-mm-ss
  • java.sql.Date: jjjj-mm-ss
  • java.sql.Time: hh-mm-ss
  • java.sql.Timestamp: jjjj-mm-tt hh:mm:ss.f...
  • java.util.Calendar: jjjj-mm-tt hh:mm:ss.f...

Auflistungsliterale (Enum-Literale) werden in der Java-Syntax für Enum-Literale mit dem vollständig qualifizierten Namen der Enum-Klasse ausgedrückt.

Eingabeparameter für ObjectGrid-Abfragen

Sie können Eingabeparameter über eine Ordinalposition oder über einen Variablennamen angeben. Es wird dringend empfohlen, Abfragen zu schreiben, die Eingabeparameter verwenden, weil die Verwendung von Eingabeparametern die Leistung erhöht, da das ObjectGrid auf diese Weise den Abfrageplan zwischen aktiven Aktionen abfangen kann.

Ein Eingabeparameter kann jeder der folgenden Typen sein: Byte, Short, Integer, Long, Float, Double, BigDecimal, BigInteger, String, Boolean, Char, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, ein Enum-Typ von Java SE 5, ein Entitäts- oder POJO-Objekt oder eine binäre Datenzeichenfolge im Format Java byte[].

Ein Eingabeparameter darf keinen Nullwert haben. Wenn Sie nach dem Vorkommen eines Nullwerts suchen möchten, verwenden Sie das Prädikat NULL.

Positionsgebundene Parameter

Positionsgebundene Eingabeparameter werden mit einem Fragezeichen, gefolgt von einer positiven Zahl definiert:

?[positive ganze Zahl].

Positionsgebundene Eingabeparameter werden, angefangen bei 1, nummeriert und entsprechen den Argumenten der Abfrage. Deshalb darf eine Abfrage keinen Eingabeparameter enthalten, der die Anzahl der Eingabeargumente überschreitet.

Beispiel: SELECT e FROM Employee e WHERE e.city = ?1 and e.salary >= ?2

Benannte Parameter

Benannte Eingabeparameter werden mit einem Variablennamen im folgenden Format definiert: :[Parametername].

Beispiel: SELECT e FROM Employee e WHERE e.city = :city and e.salary >= :salary

Prädikat BETWEEN in ObjectGrid-Abfragen

Das Prädikat BETWEEN bestimmt, ob ein bestimmter Wert zwischen zwei angegebenen Werten liegt.

expression [NOT] BETWEEN expression-2 AND expression-3

Beispiel 1

e.salary BETWEEN 50000 AND 60000

entspricht:

e.salary >= 50000 AND e.salary <= 60000

Beispiel 2

e.name NOT BETWEEN 'A' AND 'B'

entspricht:

e.name < 'A' OR e.name > 'B'

Prädikat IN in ObjectGrid-Abfragen

Das Prädikat IN vergleicht einen Wert mit einer Gruppe von Werten. Sie können das Prädikat IN in einem der folgenden beiden Formen verwenden:

Ausdruck [NOT] IN ( Subselect )Ausdruck [NOT] IN ( Wert1, Wert2, .... )

Der Wert WertN kann entweder der Literalwert oder ein Eingabeparameter sein. Der Ausdruck kann nicht in einen Referenztyp ausgewertet werden.

Beispiel 1

e.salary IN ( 10000, 15000 )

entspricht:

( e.salary = 10000 OR e.salary = 15000 )

Beispiel 2

e.salary IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

entspricht:

e.salary = ANY ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

Beispiel 3

e.salary NOT IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

entspricht:

e.salary <> ALL ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

Prädikat LIKE in ObjectGrid-Abfragen

Das Prädikat LIKE sucht einen Zeichenfolgewert für ein bestimmtes Muster.

Zeichenfolgeausdruck [NOT] LIKE Muster [ ESCAPE Escape-Zeichen ]

Der Musterwert ist ein Zeichenfolgeliteral oder eine Parametermarke des Typs "string" (Zeichenfolge), in dem bzw. der das Unterstreichungszeichen (_) für ein beliebiges einzelnes Zeichen und das Prozentzeichen (%) für eine Folge von Zeichen, einschließlich einer leeren Folge stehen kann. Jedes andere Zeichen steht für sich selbst. Das Escape-Zeichen kann verwendet werden, um das Zeichen _ oder % zu suchen. Das Escape-Zeichen kann als Zeichenfolgeliteral oder als Eingabeparameter angegeben werden.

Wenn der Zeichenfolgeausdruck null ist, ist das Ergebnis unbekannt.

Wenn Zeichenfolgeausdruck und Muster leer sind, ist das Ergebnis "true".

Beispiel

'' LIKE '' ist true
'' LIKE '%' ist true
e.name LIKE '12%3' ist true für '123' '12993' und false für '1234'
e.name LIKE 's_me' ist true für 'some' und 'same', false für 'soome'
e.name LIKE '/_foo' escape '/' ist true für '_foo', false für 'afoo'
e.name LIKE '//_foo' escape '/' ist true für '/afoo' und für '/bfoo'
e.name LIKE '///_foo' escape '/' ist true für '/_foo', aber false für '/afoo'

Prädikat NULL in ObjectGrid-Abfragen

Das Prädikat NULL prüft, ob Nullwerte vorhanden sind.

{Pfadausdruck_mit_einem_einzelnen_Wert | Eingabeparameter} IS [NOT] NULL

Beispiel

e.name IS NULL
e.dept.name IS NOT NULL
e.dept IS NOT NULL

Sammlungsprädikat EMPTY in ObjectGrid-Abfragen

Verwenden Sie das Sammlungsprädikat EMPTY, um zu prüfen, ob eine Sammlung leer ist.

Um festzustellen, ob eine Beziehung mit mehreren Werten leer ist, verwenden Sie die folgende Syntax:

Pfadausdruck_mit_Sammlungswert IS [NOT] EMPTY

Beispiel

Alle Abteilungen suchen, die keine Mitarbeiter haben:

SELECT OBJECT(d) FROM DeptBean d WHERE d.emps IS EMPTY

Prädikat MEMBER OF in ObjectGrid-Abfragen

Der folgende Ausdruck prüft, ob die Objektreferenz, die mit dem Pfadausdruck mit einem einzelnen Wert oder Eingabeparameter angegeben wurde, zur angegebenen Sammlung gehört. Wenn der Pfadausdruck mit Sammlungswert eine leere Sammlung bezeichnet, ist der Wert des MEMBER-OF-Ausdrucks FALSE.

{ Pfadausdruck_mit_einem_einzelnen_Wert | Eingabeparameter } [ NOT ] MEMBER [ OF ] Pfadausdruck_mit_Sammlungswert

Beispiel

Mitarbeiter suchen, die nicht zu einer Abteilung mit einer bestimmten Nummer gehören:

SELECT OBJECT(e) FROM EmpBean e , DeptBean d 
WHERE e NOT MEMBER OF d.emps AND d.deptno = ?1
Mitarbeiter suchen, deren Manager zu einer Abteilung mit einer bestimmten Nummer gehört:
SELECT OBJECT(e) FROM EmpBean e, DeptBean d 
WHERE e.dept.mgr MEMBER  OF d.emps  and d.deptno=?1

Prädikat EXISTS in ObjectGrid-Abfragen

Das Prädikat EXISTS prüft, ob eine in einem Subselect angegebene Bedingung vorhanden ist oder nicht.

EXISTS ( Subselect )

Das Ergebnis von EXISTS ist "true", wenn das Subselect mindestens einen Wert zurückgibt, andernfalls ist das Ergebnis "false".

Zum Verneinen eines Prädikats EXISTS, stellen Sie dem Prädikat den logischen Operator NOT voran.

Beispiel

Abteilungen zurückgeben, die mindestens einen Mitarbeiter haben, der mehr als 1000000 verdient:

SELECT OBJECT(d) FROM DeptBean d 
WHERE EXISTS ( SELECT  e  FROM IN (d.emps) e WHERE  e.salary > 1000000 )
Abteilungen zurückgeben, die keine Mitarbeiter haben:
SELECT OBJECT(d) FROM DeptBean d 
WHERE NOT EXISTS  ( SELECT e FROM IN (d.emps) e)
Sie können die vorherige Abfrage auch wie im folgenden Beispiel schreiben:

SELECT OBJECT(d) FROM DeptBean d WHERE SIZE(d.emps)=0

ORDER-BY-Klausel in ObjectGrid-Abfragen

Die ORDER-BY-Klausel gibt die Reihenfolge der Objekte in der Ergebnissammlung an. Es folgt ein Beispiel:

ORDER BY [ Sortierelement ,]* Sortierelement Sortierelement ::={ Pfadausdruck }[ ASC | DESC ]

Der Pfadausdruck muss ein Einzelwertfeld angeben, das einen primitiven Typ (byte, short, int, long, float, double, char) oder einen Wrapper-Typ (Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Character, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp oder java.util.Calendar) hat. Das Sortierelement ASC gibt an, dass die Ergebnisse in aufsteigender Reihenfolge angezeigt werden sollen. Dies ist die Standardeinstellung. Ein Sortierelement DESC gibt an, dass die Ergebnisse in absteigender Reihenfolge angezeigt werden sollen.

Beispiel

Abteilungsobjekte zurückgeben und die Abteilungsnummern in absteigender Reihenfolge anzeigen:

SELECT OBJECT(d) FROM DeptBean d ORDER BY d.deptno DESC

Mitarbeiterobjekte, sortiert nach Abteilungsnummer und Namen zurückgeben:

SELECT OBJECT(e) FROM EmpBean e ORDER BY e.dept.deptno ASC, e.name DESC

Aggregationsfunktionen in ObjectGrid-Abfragen

Aggregationsfunktionen arbeiten mit einer Gruppe von Werten, um einen einzelnen skalaren Wert zurückzugeben. Sie könne diese Funktionen in SELECT- und Subselect-Methoden verwenden. Das folgende Beispiel veranschaulicht eine Aggregation:

SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20

Diese Aggregation berechnet das Gesamtgehalt für die Abteilung 20.

Die Aggregationsfunktionen sind AVG, COUNT, MAX, MIN und SUM. Die Syntax einer Aggregationsfunktion wird im folgenden Beispiel veranschaulicht:

Aggregationsfunktion ( [ ALL | DISTINCT ] Ausdruck )

oder:

COUNT( [ ALL | DISTINCT ] Identifikationsvariable )

Die Option DISTINCT schließt doppelte Werte aus, bevor die Funktion angewendet wird. Die Option ALL ist die Standardoption und schließt keine doppelten Werte aus. Nullwerte werden in den Berechnungen der Aggregatfunktion ignoriert, es sei denn, Sie verwenden die Funktion "COUNT(Identifikationsvariable)", die die Anzahl aller Elemente in der Gruppe zurückgibt.

Rückgabetyp definieren

Die Funktionen MAX und MIN können auf jeden numerischen, Zeichenfolge- oder Datum/Zeit-Datentyp angewendet werden und geben den entsprechenden Datentyp zurück. Die Funktionen SUM und AVG akzeptieren einen numerischen Typ als Eingabe. Die Funktion AVG gibt den Datentyp "double" zurück. Die Funktion SUM gibt den Datentyp "long" zurück, wenn der Eingabetyp ein ganzzahliger Typ ist, es sei denn, die Eingabe ist ein Java-Typ "BigInteger" (große ganze Zahl). In diesem Fall gibt die Funktion einen Java-Typ "BigInteger" zurück. Die Funktion SUM gibt den Datentyp "double" zurück, wenn der Eingabetyp kein ganzzahliger Typ ist, es sei denn, die Eingabe ist ein Java-Typ "BigDecimal" (große Dezimalzahl). In diesem Fall gibt die Funktion einen Java-Typ "BigDecimal" zurück. Die Funktion COUNT akzeptiert jeden Datentyp mit Ausnahme von Sammlungen und gibt den Datentyp "long" zurück.

Wenn die Funktionen SUM, AVG, MAX und MIN auf eine leere Gruppe angewendet werden, können diese einen Nullwert zurückgeben. Die Funktion COUNT gibt null (0) zurück, wenn sie auf eine leere Gruppe angewendet wird.

GROUP-BY- und HAVING-Klauseln anwenden

Die Gruppe von Werten, die für die Aggregatfunktion verwendet wird, wird von der Sammlung bestimmt, die das Ergebnis der FROM- und WHERE-Klauseln der Abfrage ist. Sie können die Gruppe in weitere Gruppen einteilen und die Aggregationsfunktion auf jede einzelne Gruppe anwenden. Zum Durchführen dieser Aktion verwenden Sie eine GROUP-BY-Klausel in der Abfrage. Die GROUP-BY-Klausel definiert die Gruppierungselemente, die sich aus einer Liste von Pfadausdrücken zusammensetzen. Jeder Pfadausdruck gibt ein Feld an, das einen primitiven Datentyp (byte, short, int, long, float, double, boolean, char) oder einen Wrapper-Typ (Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Boolean, Character, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar oder Enum-Typ von Java SE 5) hat.

Das folgende Beispiel veranschaulicht die Verwendung der GROUP-BY-Klausel in einer Abfrage, die das Durchschnittsgehalt für jede Abteilung berechnet:

SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno

Bei der Aufteilung einer Gruppe in weitere Gruppen wird ein Nullwert mit einem anderen Nullwert gleich gesetzt.

Gruppen können mit einer HAVING-Klausel gefiltert werden, die die Gruppeneigenschaften prüft, bevor Aggregatfunktionen eingesetzt oder Elemente gruppiert werden. Diese Filtervorgang gleicht dem, den die WHERE-Klausel für die Tupel (d. h. Datensätze der zurückgegebenen Sammlungswerte) aus der FROM-Klausel durchführt. Im Folgenden sehen Sie ein Beispiel für die HAVING-Klausel:

SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(e) > 3 AND e.dept.deptno > 5
Diese Abfrage gibt das Durchschnittsgehalt für Abteilungen zurück, die mehr als drei Mitarbeiter haben und deren Abteilungsnummer größer als fünf ist.

Sie können eine HAVING-Klausel ohne eine GROUP-BY-Klausel verwenden. In diesem Fall wird die gesamte Gruppe als eine einzige Gruppe behandelt, auf die die HAVING-Klausel angewendet wird.