Es un lenguaje comercial que se desarrolló para INGRES, está basado en el cálculo relacional de tuplas.
A) Consultas.
La estructura general de una consulta es la siguiente:
RANGE OF t1 IS r1
RANGE OF t2 IS r2
...................................
..................................
RANGE OF tm IS rm
RETRIEVE (ti1.Aj1, ti2.Aj2, ........, tim.Ajm)
WHERE P
donde t1,.....,tm son las tuplas que usamos para la consulta, r1,...,rm son las relaciones correspondientes a t1,...,tm. La cláusula RETRIEVE es equivalente a la cláusula SELECT de SQL, y P es el predicado de selección.
Ejemplo: Obtener todos los clientes que tienen cuenta en la sucursal principal.
RANGE OF t IS deposito RETRIEVE (t.nombre_cliente) WHERE t.nombre_sucursal = "Principal".
Como ejemplo de una consulta en la que aparezcan dos tuplas de dos relaciones distintas podríamos usar el siguiente: " Obtener todos los nombres de los clientes y sus ciudades de residencia que tienen préstamo en la sucursal principal."
RANGE OF t IS cliente RANGE OF s IS prestamo RETRIEVE (s.nombre_cliente, t.ciudad_cliente) WHERE s.nombre_sucursal = "Principal" AND t.nombre_cliente = s.nombre_cliente
QUEL no incluye eliminación de duplicados por defecto, si se quiere conseguir ésta, es necesario indicarlo mediante la cláusula UNIQUE.
RANGE ............. RETRIEVE UNIQUE (.............) WHERE .......
Así mismo QUEL tampoco incluye las operaciones de unión, intersección y diferencia , como tampoco permite subconsultas anidadas, por lo que es un poco menos amigable que SQL.
Sin embargo, QUEL sí incluye operaciones de grupo. éstas pueden aparecer en la cláusula RETRIEVE o bien en la cláusula WHERE. Las posibles operaciones son las siguientes: count, sum, max, min, avg, any.
Sintaxis: Operación (t.A WHERE P)
Ej: "Obtener la media de los saldos de las cuentas de la sucursal principal."
RANGE OF t IS deposito
RETRIEVE avg (t.saldo WHERE t.nombre_sucursal = "Principal")
Existe una variante: Operación (t.Ai by t.Aj) ,donde t.Aj es la condición de agrupamiento.
Ej: "Media de los saldos agrupadas por nombre de sucursal."
RANGE OF t IS deposito
RETRIEVE avg (t.saldo by t.nombre_sucursal)
Ej: "Números de cuenta con saldo mayor que el saldo medio de la sucursal a la que pertenecen."
RANGE OF t IS deposito
RETRIEVE (t.num_cuenta)
WHERE t.saldo > avg (t.saldo by t.nombre_sucursal).
B) Inserción.
Para la inserción de tuplas individuales:
APPEND TO deposito (lista de atributos con valores nuevos).
Ej: APPEND TO deposito (num_cuenta = 287, nombre_sucursal = "Murcia"....)
A continuación podemos ver un ejemplo de inserción de tuplas de una relación en otra relación.
RANGE OF t IS prestamo
APPEND TO temp (t.nombre_cliente)
WHERE t.nombre_sucursal = "Principal"
Donde temp quedará formada como una relación cuyo único atributo es nombre_cliente. Si temp ya existiera cuando se realizó la inserción, entonces los atributos que tenga temp deben coincidir con los atributos que insertamos en la cláusula APPEND.
C) Modificación.
Por su sencillez, veremos la modificación mediante un ejemplo por el cual aumentaremos en un 5% los saldos de la relación deposito.
RANGE OF t IS deposito
REPLACE t (saldo = t.saldo x 1.05)
D) Eliminación.
Para la eliminación usamos el comando DELETE que borra tuplas completas.
Ej: Eliminar todas las tuplas de prestamo para todos los clientes cuyo nombre sea López.
RANGE OF t IS prestamo
DELETE (t)
WHERE nombre_cliente = "López".