WebSphere eXtreme Scale tiene su propio lenguaje mediante el cual el usuario puede consultar datos.
La cláusula FROM especifica las colecciones de objetos a los que se aplica la consulta. Cada colección se identifica por un nombre de esquema abstracto y una variable de identificación, llamada variable de rango, o por una declaración de miembro de colección que identifica una relación de un solo valor o de varios valores y una variable de identificación.
Conceptualmente, la semántica de la consulta es primero formar una colección temporal de tuples, denominados R,. Los tuples están compuestos de elemento de las colecciones que se identifican en la cláusula FROM. Cada tuple contiene un elemento de cada una de las colecciones en la cláusula FROM. Se forman todas las combinaciones posibles sujetas a las limitaciones que se imponen por las declaraciones de miembros de colección. Si algún nombre de esquema identifica una colección para la que no hay ningún registro en el almacén persistente, la colección temporal R está vacía.
El objeto DeptBean contiene los registros 10, 20 y 30. El objeto EmpBean contiene los registros 1, 2 y 3 que están relacionados con el departamento 10 y los registros 4 y 5 que están relacionados con el departamento 20. El departamento 30 no tiene empleados asociados.
FROM DeptBean d, EmpBean e
Esta cláusula forma una colección temporal R que contiene 15 tuples.
FROM DeptBean d, DeptBean d1
Esta cláusula forma una colección temporal R que contiene 9 tuples.
FROM DeptBean d, IN (d.emps) AS e
Esta cláusula forma una colección temporal R que contiene 5 tuples. El departamento 30 no está en la colección temporal R porque no contiene ningún empleado. El departamento 10 está contenido tres veces en la colección temporal R y el departamento está contenido dos veces en R.
En lugar de usar IN(d.emps) as e, puede usar un predicado JOIN:
FROM DeptBean d JOIN d.emps as e
Después de formar la colección temporal, las condiciones de búsqueda de cláusula WHERE se aplican a la colección temporal R, lo que da una nueva colección temporal R1. Las cláusulas ORDER BY y SELECT se aplican a R1 para producir el conjunto de resultados final.
Una variable de identificación es una variable que se declara en la cláusula FROM utilizando el operador IN o el operador AS opcional.
FROM DeptBean AS d, IN (d.emps) AS e
es equivalente a:
FROM DeptBean d, IN (d.emps) e
Una variable de identificación que se declara de modo que sea un nombre de esquema abstracto se llama variable de rango. En la consulta anterior, "d" es una variable de rango. Una variable de identificación que se declara de modo que sea una expresión path de varios valores se llama declaración de miembro de colección. Los valores "d" y "e" en el ejemplo anterior son declaraciones de miembro de colección.
A continuación se muestra un ejemplo del uso de una expresión path de un solo valor en la cláusula FROM:
FROM EmpBean e, IN(e.dept.mgr) as m
La sintaxis de la cláusula SELECT se ilustra en el siguiente ejemplo:
SELECT { ALL | DISTINCT } [ selection , ]* selection
selection ::= {single_valued_path_expression |
identification_variable |
OBJECT ( identification_variable) |
aggregate_functions } [[ AS ] id ]
La cláusula SELECT consta de uno o más de los siguientes elementos: una sola variable de identificación que se define en la cláusula FROM, una expresión path de un solo valor que se evalúa en valores o referencias de objetos, y una función agregada. Puede usar la palabra clave DISTINCT para eliminar las referencias duplicadas.
Una subselección de escala es una subselección que devuelve un valor individual:
Buscar todos los empleados que ganan más que el empleado John:
SELECT OBJECT(e) FROM EmpBean ej, EmpBean eWHERE ej.name = 'John' and e.salary > ej.salary
Buscar todos los departamentos que tienen uno o más empleados que ganan menos que 20000:
SELECT DISTINCT e.dept FROM EmpBean e where e.salary < 20000
Una consulta puede tener una expresión path que se evalúa en un valor arbitrario:
SELECT e.dept.name FROM EmpBean e where e.salary < 20000
La consulta anterior devuelve una colección de valores de nombre para los departamentos que tienen empleados que ganan menos de 20000.
Una consulta puede devolver un valor agregado:
SELECT avg(e.salary) FROM EmpBean e
A continuación se muestra una consulta que recupera los nombres y referencias de objetos para los empleados con sueldo bajo:
SELECT e.name as name , object(e) as emp from EmpBean e where e.salary < 50000
La cláusula WHERE contiene condiciones de búsqueda que están compuestas de los elementos indicados a continuación. Cuando una condición de búsqueda se evalúa en TRUE, el tuple se añade al conjunto de resultados.
Literales de consulta de ObjectGrid
Un literal de serie se especifica en comillas simples. Una comilla simple que se encuentra dentro de un literal de serie se representa mediante dos comillas simples, por ejemplo: 'Tom''s'.
Un literal numérico puede ser cualquiera de los siguientes valores:
Los literales booleanos son TRUE y FALSE.
Los literales temporales siguen la sintaxis de escape JDBC en base al tipo de atributo:
Los literales enum se expresan utilizando la sintaxis de literales enum de Java utilizando el nombre de clase enum plenamente calificado.
Parámetros de entrada de consulta de ObjectGrid
Puede especificar parámetros de entrada utilizando una posición ordinal o utilizando un nombre de variable. Se recomienda grabar consultas que utilicen parámetros de entrada, porque si se usan parámetros de entrada se aumentará el rendimiento permitiendo a ObjectGrid captar el plan de consulta entre acciones en ejecución.
Un parámetro de entrada puede adoptar cualquiera de los tipos siguientes: 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, un Java SE 5 enum, una objeto Entity o POJO, o una serie de datos binarios con el formato de Java byte[].
Un parámetro de entrada no debe tener un valor nulo. Para buscar la aparición de un valor nulo NULL), utilice el predicado NULL.
Parámetros posicionales
Los parámetros de entrada posicionales se definen utilizando el signo de interrogación seguido de un número positivo:
?[entero positivo].
Los parámetros de entrada posicionales se enumeran empezando por 1 y corresponden a los argumentos de la consulta; por lo tanto, una consulta no puede contener un parámetro de entrada que supera el número de argumentos de entrada.
Ejemplo: SELECT e FROM Employee e WHERE e.city = ?1 and e.salary >= ?2
Parámetros con nombre
Los parámetros de entrada con nombre se definen utilizando un nombre de variable en el formato: :[nombre de parámetro].
Ejemplo: SELECT e FROM Employee e WHERE e.city = :city and e.salary >= :salary
Predicado BETWEEN de consulta de ObjectGrid
El predicado BETWEEN determina si un valor dado está comprendido entre dos otros valores dados.
expression [NOT] BETWEEN expression-2 AND expression-3
Ejemplo 1
e.salary BETWEEN 50000 AND 60000
es equivalente a:
e.salary >= 50000 AND e.salary <= 60000
Ejemplo 2
e.name NOT BETWEEN 'A' AND 'B'
es equivalente a:
e.name < 'A' OR e.name > 'B'
Predicado IN de consulta de ObjectGrid
El predicado IN compara un valor con un conjunto de valores. Puede utilizar el predicado IN de dos formas distintas:
expression [NOT] IN ( subselect )expression [NOT] IN ( value1, value2, .... )
El valor ValueN puede ser un valor literal o un parámetro de entrada. La expresión no se puede evaluar en un tipo de referencia.
Ejemplo 1
e.salary IN ( 10000, 15000 )
es equivalente a
( e.salary = 10000 OR e.salary = 15000 )
Ejemplo 2
e.salary IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)
es equivalente a
e.salary = ANY ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)
Ejemplo 3
e.salary NOT IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)
es equivalente a
e.salary <> ALL ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)
Predicado LIKE de consulta de ObjectGrid
El predicado LIKE busca un valor de serie para un patrón determinado.
string-expression [NOT] LIKE pattern [ ESCAPE escape-character ]
El valor del patrón es un literal de serie o un marcador de parámetro de tipo serie en el que el subrayado ( _ ) representa un carácter individual y un signo de porcentaje ( % ) representa cualquier secuencia de caracteres, incluida una secuencia vacía. Cualquier otro carácter se representa a sí mismo. El carácter de escape se puede utilizar para buscar el carácter _ y %. El carácter de escape se puede especificar como literal de serie o como parámetro de entrada.
Si la expresión de serie es nula, entonces el resultado se desconoce.
Si ambas expresiones de serie y de patrón están vacías, entonces el resultado es true.
Ejemplo
'' LIKE '' is true
'' LIKE '%' is true
e.name LIKE '12%3' is true for '123' '12993' and false for '1234'
e.name LIKE 's_me' is true for 'some' and 'same', false for 'soome'
e.name LIKE '/_foo' escape '/' is true for '_foo', false for 'afoo'
e.name LIKE '//_foo' escape '/' is true for '/afoo' and for '/bfoo'
e.name LIKE '///_foo' escape '/' is true for '/_foo' but false for '/afoo'
Predicado NULL de consulta de ObjectGrid
El predicado NULL comprueba los valores nulos.
{single-valued-path-expression | input_parameter} IS [NOT] NULL
Ejemplo
e.name IS NULL
e.dept.name IS NOT NULL
e.dept IS NOT NULL
Predicado de colección EMPTY de consulta de ObjectGrid
Utilice el predicado de colección EMPTY para comprobar una colección vacía.
Para comprobar si una relación de varios valores está vacía, utilice la siguiente sintaxis:
collection-valued-path-expression IS [NOT] EMPTY
Ejemplo
Predicado de colección vacía. Para buscar todos los departamentos que no tienen empleados:
SELECT OBJECT(d) FROM DeptBean d WHERE d.emps IS EMPTY
Predicado MEMBER OF de consulta de ObjectGrid
La siguiente expresión comprueba si la consulta de objeto especificada por el parámetro de entrada o la expresión path de un solo valor es miembro de la colección indicada. Si la expresión path con valor de colección designa una colección vacía, el valor de la expresión MEMBER OF es FALSE.
{ single-valued-path-expression | input_parameter } [ NOT ] MEMBER [ OF ] collection-valued-path-expression
Ejemplo
Buscar empleados que no sean miembros de un número de departamento dado:
SELECT OBJECT(e) FROM EmpBean e , DeptBean d
WHERE e NOT MEMBER OF d.emps AND d.deptno = ?1
Buscar empleados cuyo gestor es un miembro de un número de departamento dado:SELECT OBJECT(e) FROM EmpBean e, DeptBean d
WHERE e.dept.mgr MEMBER OF d.emps and d.deptno=?1
Predicado EXISTS de consulta de ObjectGrid
El predicado EXISTS comprueba si existe o no una condición especificada por una subselección.
EXISTS ( subselect )
El resultado de EXISTS es true si la subselección devuelve como mínimo un valor, de lo contrario el resultado es false.
Para negar un predicado EXISTS, debe precederlo con el operador lógico NOT.
Ejemplo
Devuelve los departamentos que tienen como mínimo un empleado que gana más de 1000000:
SELECT OBJECT(d) FROM DeptBean d
WHERE EXISTS ( SELECT e FROM IN (d.emps) e WHERE e.salary > 1000000 )
Devuelve los departamentos que no tienen empleados: SELECT OBJECT(d) FROM DeptBean d
WHERE NOT EXISTS ( SELECT e FROM IN (d.emps) e)
También puede volver a escribir la consulta anterior como en el siguiente ejemplo:SELECT OBJECT(d) FROM DeptBean d WHERE SIZE(d.emps)=0
La cláusula ORDER BY especifica una ordenación de los objetos en la colección de resultados. A continuación se muestra un ejemplo:
ORDER BY [ order_element ,]* order_element order_element ::={ path-expression }[ ASC | DESC ]
La expresión path debe especificar un campo de valor individual que sea de un tipo primitivo de byte, short, int, long, float, double, char, o de un tipo de derivador de Byte, Short, Integer, Long, Float, Double, BigDecimal, String, Character, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp y java.util.Calendar. El elemento de orden ASC especifica que los resultados se visualizan en orden ascendente, que es el valor predeterminado. Un elemento de orden DESC especifica que los resultados se visualicen en orden descendente.
Ejemplo
Devuelve objetos de departamento. Muestra los números de departamento en orden descendente:
SELECT OBJECT(d) FROM DeptBean d ORDER BY d.deptno DESC
Devuelve los objetos de empleado, ordenados por nombre y número de departamento:
SELECT OBJECT(e) FROM EmpBean e ORDER BY e.dept.deptno ASC, e.name DESC
Las funciones de agregación operan en un conjunto de valores para devolver un solo valor escalar. Puede utilizar estas funciones en los métodos select y subselect. En el siguiente ejemplo se muestra una agregación:
SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20
Esta agregación calcula el sueldo total del departamento 20.
Las funciones de agregación son: AVG, COUNT, MAX, MIN y SUM. La sintaxis de una función de agregación se muestra en el siguiente ejemplo:
aggregation-function ( [ ALL | DISTINCT ] expression )
o:
COUNT( [ ALL | DISTINCT ] identification-variable )
La opción DISTINCT elimina valores duplicados antes de aplicar la función. La opción ALL es la opción predeterminada, y no elimina valores duplicados. Los valores nulos se ignoran durante el cálculo de la función de agregación excepto cuando se utiliza la función COUNT(identification-variable), que devuelven un recuento de todos los elementos del conjunto.
Definición del tipo de retorno
Las funciones MAX y MIN pueden aplicarse a cualquier tipo de datos numérico, serie o fecha-hora y devolver el correspondiente tipo de datos. Las funciones SUM y AVG aceptan un tipo numérico como entrada. La función AVG devuelve un tipo double. La función SUM devuelve un tipo long si el tipo de entrada es un tipo de entero, excepto si la entrada es un tipo BigInteger de Java, en ese caso la función devuelve un tipo BigInteger de Java. La función SUM devuelve un tipo doble, si el tipo de entrada no es un tipo de entero, excepto si la entrada de un tipo BigDecimal de Java, en ese caso, la función devuelve un tipo BigDecimal de Java. La función COUNT puede aceptar cualquier tipo de datos excepto colecciones, y devuelve un tipo long.
Cuando se aplican a un conjunto vacío, las funciones SUM, AVG, MAX y MIN pueden devolver un valor nulo. La función COUNT devuelve cero (0) cuando se aplica a un conjunto vacío.
Utilización de cláusulas GROUP BY y HAVING
El conjunto de valores que se utiliza para la función agregada lo determina la colección que resulta de la cláusula FROM y WHERE de la consulta. Puede dividir el conjunto en grupos y aplicar la función de agregación a cada grupo. Para realizar esta acción, utilice una cláusula GROUP BY en la consulta. La cláusula GROUP BY define la agrupación de miembros, que incluyen una lista de las expresiones path. Cada expresión de vía de acceso especifica un campo que es un tipo primitivo de byte, short, int, long, float, double, boolean, char, o un tipo de derivador de 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 o un Java SE 5 enum.
El siguiente ejemplo muestra el uso de la cláusula GROUP BY en una consulta que calcula el sueldo promedio de cada departamento:
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno
Al dividir un conjunto en grupos, se considera un valor NULL igual a otro valor NULL.
Los grupos se pueden filtrar utilizando una cláusula HAVING que comprueba las propiedades del grupo antes de requerir funciones de agregación o agrupación de miembros. Este filtro es parecido a cómo la cláusula WHERE filtra tuples (es decir, los registros de los valores de colección devueltos) de la cláusula FROM. A continuación se muestra un ejemplo de la cláusula HAVING:
SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(e) > 3 AND e.dept.deptno > 5
Esta consulta devuelve el sueldo promedio de los departamentos que tiene más de tres empleados y el número de departamento es mayor que cinco.Puede utilizar una cláusula HAVING sin una cláusula GROUP BY. En este caso, todo el conjunto se considera un grupo individual, al que se aplica la cláusula HAVING.