4. Las expresiones del lenguaje SQL
4.1. Introduction
En la mayoría de los comandos SQL, es posible utilizar una expresión. Tomemos, por ejemplo, el comando SELECT:
SELECT expr1, expr2, ... de table WHERE expression |
SELECT selecciona las filas para las que expression es verdadera y muestra para cada una de ellas los valores de expri.
Ejemplos
En este párrafo nos proponemos explicar el concepto de expresión. Una expresión elemental es del tipo:
operando1 opérateur operando2
o
función(parámetros)
Ejemplo
En la expresión , GENRE = 'ROMAN'
- GENRE es el operando 1
- 'ROMAN' es el operando 2
- = es el operador
En la expresión upper(genre)
- «upper» es una función
- «tipo» es un parámetro de esta función.
Primero trataremos las expresiones con operadores y, luego, presentaremos las funciones disponibles en Firebird.
4.2. Expresiones con operadores
Clasificaremos las expresiones con operadores según el tipo de sus operandos:
- numérico
- cadena de caracteres
- fecha
- booleano o lógico
4.2.1. Las expresiones con operandos de tipo numérico
4.2.1.1. Lista de operadores
Supongamos que nombre1, nombre2 y nombre3 son números. Los operadores que se pueden utilizar son los siguientes:
Operadores relacionales
: número1 es mayor que número2 | |
: número1 es mayor o igual que número2 | |
: número1 es menor que número2 | |
: número1 es menor o igual que número2 | |
: número1 es igual a número2 | |
: número1 es diferente de número2 | |
: lo mismo | |
: número1 está dentro del intervalo [nombre2,nombre3] | |
: número1 pertenece a la lista de números | |
: número1 no tiene valor | |
: número1 tiene un valor |
Operadores aritméticos
: suma | |
: resta | |
: multiplicación | |
: división |
4.2.1.2. Operadores relacionales
Una expresión relacional expresa una relación que es verdadera o falsa. Por lo tanto, el resultado de dicha expresión es un valor booleano o lógico.
Ejemplos:
![]()

![]()
4.2.1.3. Operadores aritméticos
La expresión aritmética nos resulta familiar. Expresa un cálculo que se debe realizar entre datos numéricos. Ya nos hemos encontrado con expresiones de este tipo: supongamos que el precio almacenado en los registros del archivo BIBLIO es un precio sin impuestos. Queremos visualizar cada título con su precio TTC para una tasa de TVA del 18,6 %:
Si los precios deben aumentar un 3 %, el comando será
En una expresión pueden aparecer varios operadores aritméticos, además de funciones y paréntesis. Estos elementos se procesan según diferentes prioridades:
1 | <---- mayor prioridad | |
2 | ||
3 | ||
4 | <---- menor prioridad |
Cuando hay dos operadores con la misma prioridad en la expresión, se evalúa primero el que se encuentra más a la izquierda en la expresión.
Ejemplos
La expresión PRIX*TAUX+TAXES se evaluará como (PRIX*TAUX)+TAXES. De hecho, se utilizará primero el operador de multiplicación. La expresión PRIX*TAUX/100 se evaluará como (PRIX*TAUX)/100.
4.2.2. Expresiones con operandos de tipo carácter
4.2.2.1. Lista de operadores
Los operadores que se pueden utilizar son los siguientes:
Sean cadena1, cadena2, cadena3, modelo de cadenas de caracteres
: cadena1 es mayor que cadena2 | |
: cadena1 es mayor o igual que cadena2 | |
: cadena1 es menor que cadena2 | |
: cadena1 menor o igual que cadena2 | |
: cadena1 es igual a cadena2 | |
: cadena1 es diferente de cadena2 | |
: lo mismo | |
: cadena1 dentro del intervalo [chaine2,chaine3] | |
: cadena1 pertenece a la lista de cadenas | |
: cadena1 no tiene valor | |
: cadena1 tiene un valor | |
: cadena1 coincide con el patrón |
Operador de concatenación
cadena1 || cadena2 : chaine2 concatenado con chaine1
4.2.2.2. Operadores relacionales
¿Qué significa comparar cadenas con operadores como <, <=, etc.?
Cada carácter está codificado por un número entero. Cuando se comparan dos caracteres, lo que se compara son sus códigos enteros. La codificación utilizada respeta el orden natural del diccionario:
Los números van antes que las letras, y las mayúsculas antes que las minúsculas.
4.2.2.3. Comparación de dos cadenas
Consideremos la relación 'CHAT' < 'CHIEN'. ¿Es verdadera o falsa? Para realizar esta comparación, el SGBD compara las dos cadenas carácter por carácter basándose en sus códigos enteros. Tan pronto como se detectan dos caracteres diferentes, la cadena a la que pertenece el más pequeño de los dos se considera más pequeña que la otra cadena. En nuestro ejemplo, «CHAT» se compara con «CHIEN». Se obtienen los siguientes resultados sucesivos:
Tras esta última comparación, se determina que la cadena «CHAT» es más corta que la cadena «CHIEN». Por lo tanto, la relación «CHAT» < «CHIEN» es verdadera.
Ahora comparemos «CHAT» y «chat».
Tras esta comparación, la relación «CHAT» < «chat» se declara verdadera.
Ejemplos


4.2.2.4. El operador LIKE
El operador LIKE se utiliza de la siguiente manera: chaîne LIKE modèle
La relación es verdadera si chaîne coincide con modèle. Este último es una cadena de caracteres que puede contener dos caracteres comodín:
que designa cualquier secuencia de caracteres | |
que designa 1 carácter cualquiera |
Ejemplos

![]()
![]()
4.2.2.5. El operador de concatenación
![]()
4.2.3. Expresiones con operandos de tipo fecha
Sean fecha1, fecha2 y fecha3 unas fechas. Los operadores que se pueden utilizar son los siguientes:
Operadores relacionales
es verdadera si fecha1 es anterior a fecha2 | |
es verdadera si fecha1 es anterior o igual a fecha2 | |
es verdadera si fecha1 es posterior a fecha2 | |
es verdadera si fecha1 es posterior o igual a fecha2 | |
es verdadera si fecha1 y fecha2 son iguales | |
es verdadera si fecha1 y fecha2 son diferentes. | |
lo mismo | |
es verdadera si fecha1 está entre fecha2 y fecha3 | |
es verdadera si fecha1 se encuentra en la lista de fechas | |
es verdadera si fecha1 no tiene valor | |
es verdadera si fecha1 tiene un valor | |
es verdadera si fecha1 coincide con el patrón | |
Operadores aritméticos
: número de días que separan a fecha1 de fecha2 | |
: fecha2 tal que fecha1 - fecha2 = número | |
: fecha2 tal que fecha2 - fecha1 = número |
Ejemplos

![]()
![]()
¿Qué antigüedad tienen los libros de la biblioteca?

4.2.4. Expresiones con operandos booleanos
Recordemos que un valor booleano o lógico tiene dos valores posibles: verdadero o falso. El operando lógico suele ser el resultado de una expresión relacional.
Supongamos que booléen1 y booléen2 son dos valores booleanos. Hay tres operadores posibles, que son, en orden de prioridad:
| es verdadera si tanto booléen1 como booléen2 son verdaderos. |
| es verdadera si booléen1 o booléen2 es verdadera. |
| tiene como valor el inverso del valor de booléen1. |
Ejemplos

Se buscan libros con precios entre:
![]()
Búsqueda inversa:

¡Cuidado con la prioridad de los operadores!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Se usan paréntesis para controlar la prioridad de los operadores:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. Las funciones predefinidas de Firebird
Firebird cuenta con funciones predefinidas. Estas no se pueden utilizar de inmediato en los comandos SQL. Primero hay que ejecutar el script SQL <firebird>\UDF\ib_udf.sql, donde <firebird> se refiere al directorio de instalación de Firebird:

Con IBExpert, procedemos de la siguiente manera:
- utilizamos la herramienta [Script Excecutive] obtenida mediante la opción [Tools/ Script Executive]:

- una vez que la herramienta está disponible, cargamos el script <firebird>\UDF\ib_udf.sql:

- luego ejecutamos el script:

Una vez hecho esto, las funciones predefinidas de Firebird están disponibles para la base de datos a la que estábamos conectados cuando se ejecutó el script. Para verificarlo, basta con ir al explorador de bases de datos y hacer clic en el nodo [UDF] de la base de datos en la que se importaron las funciones:

Arriba se muestran las funciones disponibles en la base de datos. Para probarlas, es conveniente tener una tabla de una sola fila. Llamémosla TEST:

y definámosla de la siguiente manera (clic derecho en Tablas / Nueva tabla):
Incluyamos una sola fila en esta tabla:


Ahora pasemos al editor SQL (F12) y emitamos la orden SQL siguiente:
que utiliza la función predefinida cos (coseno). El comando anterior evalúa cos(0) para cada fila de la tabla TEST, es decir, en realidad para una sola fila. Por lo tanto, simplemente se muestra el valor de cos(0):
![]()
Las funciones UDF (funciones definidas por el usuario) son funciones que el usuario puede crear, por lo que es posible encontrar bibliotecas de funciones UDF en la web. Aquí solo describimos algunas de las que están disponibles con la versión descargable de Firebird (2005). Las clasificamos según el tipo predominante de sus parámetros o según su función:
- funciones con parámetros de tipo numérico
- funciones con parámetros de tipo cadena de caracteres
4.3.1. Funciones con parámetros de tipo numérico
| valor absoluto de un número abs(-15)=15 |
| el entero más pequeño mayor o igual que nombre ceil(15,7) = 16 |
| el entero mayor menor o igual que nombre floor(14,3)=14 |
| cociente de la división entera (el cociente es entero) de nombre1 por nombre2 div(7,3)=2 |
| resto de la división entera (el cociente es entero) de nombre1 por nombre2 mod(7,3)=1 |
| -1 si nombre < 0 0 si nombre = 0 +1 si nombre > 0 sign(-6) = -1 |
| raíz cuadrada de nombre si nombre ≥ 0 -1 si nombre < 0 sqrt(16)=4 |
4.3.2. Funciones con parámetros de tipo cadena de caracteres
ascii_char(número) | carácter con código ASCII nombre ascii_char(65) = 'A' |
lower(cadena) | convierte chaine a minúsculas lower('INFO') = 'info' |
ltrim(cadena) | Left Trim: se eliminan los espacios que preceden al texto de chaine: ltrim(' gatito') = 'gatito' |
replace(cadena1,cadena2,cadena3) | reemplaza chaine2 por chaine3 en chaine1. replace('gato y perro','g','**')='**ato y **ero' |
rtrim(cadena1,cadena2) | Right Trim: igual que ltrim, pero por la derecha rtrim('gato ') = 'gato' |
substr(cadena, p, q) | subcadena de chaine que comienza en la posición p y termina en la posición q. substr('chaton', 3, 5) = 'ato' |
ascii_val(carácter) | código ASCII de caractère ascii_val('A') = 65 |
strlen(cadena) | número de caracteres de chaine strlen('gatito') = 6 |