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 líneas para las que expression es verdadera y muestra para cada una de ellas los valores de expri.
Ejemplos
En este apartado 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
- «genre» es un parámetro de esta función.
En primer lugar trataremos las expresiones con operadores y, a continuación, 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. 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 mayor o igual que número2 | |
: número1 menor que número2 | |
: número1 menor o igual que número2 | |
: número1 es igual a número2 | |
: número1 diferente de número2 | |
: lo mismo | |
: número1 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 hay que 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 un tipo 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 de 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, un patrón de cadenas de caracteres
: cadena1 es mayor que cadena2 | |
: cadena1 mayor o igual que cadena2 | |
: cadena1 menor que cadena2 | |
: cadena1 menor o igual que cadena2 | |
: cadena1 igual a cadena2 | |
: cadena1 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 concatenada con chaine1
4.2.2.2. Operadores relacionales
¿Qué significa comparar cadenas con operadores como <, <=, etc.?
Cada carácter se codifica mediante un número entero. Cuando se comparan dos caracteres, lo que se compara son sus códigos enteros. La codificación adoptada 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. En cuanto se encuentran 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, la cadena «CHAT» se declara más pequeña que la cadena «CHIEN». Por lo tanto, la relación «CHAT» < «CHIEN» es verdadera.
Comparemos ahora «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 comodines:
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 fecha1 de fecha2 | |
: fecha2 tal que fecha1-fecha2=número | |
: fecha2 tal que fecha2-fecha1=número |
Ejemplos

![]()
![]()
¿Antigüedad de 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, por orden de prioridad:
| es verdadera si booléen1 y booléen2 son ambos 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 un precio comprendido 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 utilizan 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 dispone de funciones predefinidas. Estas no se pueden utilizar inmediatamente en los comandos SQL. Primero hay que ejecutar el script SQL <firebird>\UDF\ib_udf.sql donde <firebird> designa el directorio de instalación de SGBD Firebird:

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

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

- A continuación, ejecutamos el script:

Una vez hecho esto, las funciones predefinidas de Firebird estarán disponibles para la base de datos a la que se estaba conectado cuando se ejecutó el script. Para comprobarlo, 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 han importado las funciones:

Arriba vemos las funciones disponibles en la base de datos. Para probarlas, resulta práctico tener una tabla de una sola fila. Llamémosla TEST:

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


Pasemos ahora al editor SQL (F12) y emitamos el siguiente comando SQL:
que utiliza la función predefinida cos (coseno). El comando anterior evalúa cos(0) para cada línea de la tabla TEST, es decir, en realidad para una sola línea. 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 se pueden encontrar bibliotecas de funciones UDF en la web. Aquí solo describimos algunas de las disponibles con la version 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 de 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) | sustituye chaine2 por chaine3 en chaine1. replace('gato y perro','g','**')='**ato y **ero' |
rtrim(cadena1,cadena2) | Right Trim: igual que ltrim, pero a 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 |