4. As expressões da linguagem SQL
4.1. Introduction
Na maioria dos comandos SQL, é possível utilizar uma expressão. Tomemos, por exemplo, o comando SELECT:
SELECT expr1, expr2, ... de table WHERE expression |
SELECT seleciona as linhas para as quais expression é verdadeiro e exibe, para cada uma delas, os valores de expri.
Exemplos
Neste parágrafo, propomos explicar o conceito de expressão. Uma expressão elementar é do tipo:
operando1 opérateur operando2
ou
função(parâmetros)
Exemplo
Na expressão , GENRE = 'ROMAN'
- GENRE é o operando 1
- 'ROMAN' é o operando 2
- = é o operador
Na expressão upper(genre)
- `upper` é uma função
- “tipo” é um parâmetro dessa função.
Primeiramente, abordaremos as expressões com operadores; em seguida, apresentaremos as funções disponíveis no Firebird.
4.2. Expressões com operadores
Classificaremos as expressões com operadores de acordo com o tipo de seus operandos:
- numérico
- cadeia de caracteres
- data
- booleano ou lógico
4.2.1. Expressões com operandos do tipo numérico
4.2.1.1. Lista de operadores
Sejam nombre1, nombre2 e nombre3 alguns números. Os operadores que podem ser utilizados são os seguintes:
Operadores relacionais
: número1 é maior que número2 | |
: número1 é maior ou igual a número2 | |
: número1 menor que número2 | |
: número1 menor ou igual a número2 | |
: número1 é igual a número2 | |
: número1 diferente de número2 | |
: o mesmo | |
: número1 está no intervalo [nombre2,nombre3] | |
: número1 pertence à lista de números | |
: número1 não tem valor | |
: número1 tem um valor |
Operadores aritméticos
: adição | |
: subtração | |
: multiplicação | |
: divisão |
4.2.1.2. Operadores relacionais
Uma expressão relacional expressa uma relação que é verdadeira ou falsa. O resultado de tal expressão é, portanto, um valor booleano ou lógico.
Exemplos:
![]()

![]()
4.2.1.3. Operadores aritméticos
A expressão aritmética nos é familiar. Ela representa um cálculo a ser realizado entre dados numéricos. Já nos deparamos com expressões desse tipo: supõe-se que o preço armazenado nos registros do arquivo BIBLIO seja um preço sem impostos. Queremos visualizar cada título com seu preço TTC para uma alíquota de TVA de 18,6%:
Se os preços precisarem aumentar em 3%, o comando será
É possível encontrar vários operadores aritméticos em uma expressão, além de funções e parênteses. Esses elementos são processados de acordo com diferentes prioridades:
1 | <---- prioridade maior | |
2 | ||
3 | ||
4 | <---- menor prioridade |
Quando dois operadores com a mesma prioridade estão presentes na expressão, aquele que estiver mais à esquerda na expressão é avaliado primeiro.
Exemplos
A expressão PRIX*TAUX+TAXES será avaliada como (PRIX*TAUX)+TAXES. De fato, o operador de multiplicação será utilizado primeiro. A expressão PRIX*TAUX/100 será avaliada como (PRIX*TAUX)/100.
4.2.2. Expressões com operandos do tipo caractere
4.2.2.1. Lista de operadores
Os operadores que podem ser utilizados são os seguintes:
Sejam cadeia1, cadeia2, cadeia3, modelo das cadeias de caracteres
: string1 é maior que string2 | |
: string1 é maior ou igual a string2 | |
: string1 menor que string2 | |
: string1 menor ou igual a string2 | |
: string1 é igual a string2 | |
: string1 diferente de string2 | |
: o mesmo | |
: string1 está no intervalo [chaine2,chaine3] | |
: cadeia1 pertence à lista de cadeias | |
: cadeia1 não tem valor | |
: string1 tem um valor | |
: string1 corresponde ao modelo |
Operador de concatenação
cadeia1 || cadeia2 : chaine2 concatenado com chaine1
4.2.2.2. Operadores relacionais
O que significa comparar cadeias de caracteres com operadores como <, <=, etc.?
Cada caractere é codificado por um número inteiro. Ao comparar dois caracteres, são seus códigos inteiros que são comparados. A codificação adotada respeita a ordem natural do dicionário:
Os números vêm antes das letras, e as maiúsculas antes das minúsculas.
4.2.2.3. Comparação de duas cadeias de caracteres
Considere a relação 'CHAT' < 'CHIEN'. Ela é verdadeira ou falsa? Para realizar essa comparação, o SGBD compara as duas cadeias de caracteres, um por um, com base em seus códigos inteiros. Assim que dois caracteres diferentes são encontrados, a sequência à qual pertence o menor dos dois é considerada menor que a outra sequência. Em nosso exemplo, ‘CHAT’ é comparada a ‘CHIEN’. Obtemos os seguintes resultados sucessivos:
Após essa última comparação, a sequência 'CHAT' é considerada menor que a sequência 'CHIEN'. A relação 'CHAT' < 'CHIEN' é, portanto, verdadeira.
Vamos agora comparar 'CHAT' e 'chat'.
Após essa comparação, a relação 'CHAT' < 'gato' é declarada verdadeira.
Exemplos


4.2.2.4. O operador LIKE
O operador LIKE é utilizado da seguinte forma: chaîne LIKE modèle
A relação é verdadeira se chaîne corresponder a modèle. Este último é uma sequência de caracteres que pode conter dois caracteres curinga:
que designa qualquer sequência de caracteres | |
que designa 1 caractere qualquer |
Exemplos

![]()
![]()
4.2.2.5. O operador de concatenação
![]()
4.2.3. Expressões com operandos do tipo data
Sejam date1, date2 e date3 algumas datas. Os operadores que podem ser utilizados são os seguintes:
Operadores relacionais
é verdadeira se data1 for anterior a data2 | |
é verdadeira se data1 for anterior ou igual a data2 | |
é verdadeira se data1 for posterior a data2 | |
é verdadeira se data1 for posterior ou igual a data2 | |
é verdadeira se data1 e data2 forem iguais | |
é verdadeira se data1 e data2 forem diferentes. | |
idem | |
é verdadeira se data1 estiver entre data2 e data3 | |
é verdadeira se data1 estiver na lista de datas | |
é verdadeira se data1 não tiver valor | |
é verdadeira se data1 tiver um valor | |
é verdadeira se date1 corresponder ao modelo | |
Operadores aritméticos
: número de dias entre data1 e data2 | |
: data2 tal que data1 - data2 = número | |
: data2 tal que data2 - data1 = número |
Exemplos

![]()
![]()
Qual é a idade dos livros da biblioteca?

4.2.4. Expressões com operandos booleanos
Vale lembrar que um valor booleano ou lógico tem dois valores possíveis: verdadeiro ou falso. O operando lógico é frequentemente o resultado de uma expressão relacional.
Sejam booléen1 e booléen2 dois valores booleanos. Existem três operadores possíveis, que, por ordem de prioridade, são:
| é verdadeira se booléen1 e booléen2 forem ambos verdadeiros. |
| é verdadeira se booléen1 ou booléen2 for verdadeira. |
| tem como valor o inverso do valor de booléen1. |
Exemplos

Procuram-se livros cujo preço esteja entre:
![]()
Pesquisa inversa:

Preste atenção à prioridade dos operadores!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Usamos parênteses para controlar a prioridade dos operadores:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. As funções predefinidas do Firebird
O Firebird dispõe de funções predefinidas. Elas não podem ser utilizadas imediatamente nos comandos SQL. Primeiro, é necessário executar o script SQL <firebird>\UDF\ib_udf.sql, onde <firebird> indica o diretório de instalação do Firebird:

Com o IBExpert, procedemos da seguinte maneira:
- utilizamos a ferramenta [Script Excecutive] obtida pela opção [Tools/ Script Executive]:

- uma vez que a ferramenta está disponível, carregamos o script <firebird>\UDF\ib_udf.sql:

- Em seguida, executamos o script:

Feito isso, as funções predefinidas do Firebird ficam disponíveis para o banco de dados ao qual estávamos conectados quando o script foi executado. Para verificar isso, basta acessar o explorador de bancos de dados e clicar no nó [UDF] do banco de dados para o qual as funções foram importadas:

Acima, estão as funções disponíveis no banco de dados. Para testá-las, é prático ter uma tabela com uma linha. Vamos chamá-la de TEST:

e vamos defini-la da seguinte forma (clique com o botão direito do mouse em Tabelas / Nova Tabela):
Vamos inserir uma única linha nessa tabela:


Agora vamos para o editor SQL (F12) e emitamos o comando SQL a seguir:
que utiliza a função predefinida cos (cosseno). O comando acima avalia cos(0) para cada linha da tabela TEST; portanto, na verdade, para uma única linha. Assim, é exibido simplesmente o valor de cos(0):
![]()
As funções UDF (Funções Definidas pelo Usuário) são funções que o usuário pode criar, e é possível encontrar bibliotecas de funções UDF na internet. Descrevemos aqui apenas algumas das funções disponíveis na versão para download do Firebird (2005). Nós as classificamos de acordo com o tipo predominante de seus parâmetros ou de acordo com sua função:
- funções com parâmetros do tipo numérico
- funções com parâmetros do tipo string
4.3.1. Funções com parâmetros do tipo numérico
| valor absoluto de um número abs(-15) = 15 |
| menor inteiro maior ou igual a nombre ceil(15,7) = 16 |
| maior inteiro menor ou igual a nombre floor(14,3) = 14 |
| quociente da divisão inteira (o quociente é inteiro) de nombre1 por nombre2 div(7,3) = 2 |
| resto da divisão inteira (o quociente é inteiro) de nombre1 por nombre2 mod(7,3) = 1 |
| -1 se nombre < 0 0 se nombre = 0 +1 se nombre > 0 sign(-6) = -1 |
| raiz quadrada de nombre se nombre ≥ 0 -1 se nombre < 0 sqrt(16) = 4 |
4.3.2. Funções com parâmetros do tipo cadeia de caracteres
ascii_char(número) | caractere com código ASCII nombre ascii_char(65) = 'A' |
lower(cadeia) | converte chaine em letras minúsculas lower('INFO') = 'info' |
ltrim(cadeia) | Left Trim — Os espaços à esquerda do texto chaine são removidos: ltrim(' gatinho')='gatinho' |
replace(cadeia1, cadeia2, cadeia3) | substitui chaine2 por chaine3 em chaine1. substituir('gato e cachorro','g','**')='**ato e **uccho' |
rtrim(cadeia1, cadeia2) | Right Trim — igual ao ltrim, mas à direita rtrim('gato ')='gato' |
substr(cadeia, p, q) | subcadeia de chaine que começa na posição p e termina na posição q. substr('chaton', 3, 5) = 'ato' |
ascii_val(caractere) | código ASCII de caractère ascii_val('A') = 65 |
strlen(cadeia) | número de caracteres de chaine strlen('gatinho') = 6 |