4. Expressões SQL
4.1. Introdução
Na maioria dos comandos SQL, é possível utilizar uma expressão. Veja, por exemplo, o comando SELECT:
SELECT expr1, expr2, ... from table WHERE expressão |
SELECT seleciona as linhas para as quais a expressão é verdadeira e apresenta os valores de expr1, expr2, ... para cada uma delas.
Exemplos
Nesta secção, iremos explicar o conceito de expressão. Uma expressão básica tem a seguinte forma:
operando1 operador operando2
ou
função(parâmetros)
Exemplo
Na expressão GENRE = 'ROMAN'
- GENRE é o operando1
- 'ROMAN' é o operando2
- = é o operador
Na expressão upper(género)
- upper é uma função
- «genre» é um parâmetro desta função.
Vamos primeiro abordar as expressões com operadores e, 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 dos seus operandos:
- numéricas
- cadeia de caracteres
- data
- booleano ou lógico
4.2.1. Expressões com operandos numéricos
4.2.1.1. Lista de operadores
Sejam número1, número2 e número3 números. Podem ser utilizados os seguintes operadores:
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 não é igual a número2 | |
: o mesmo que | |
: o número1 está no intervalo [número2, número3] | |
: número1 pertence à lista de números | |
: número1 não tem valor | |
: o número 1 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 dessa expressão é, portanto, um valor booleano ou lógico.
Exemplos:
![]()

![]()
4.2.1.3. Operadores aritméticos
Estamos familiarizados com expressões aritméticas. Estas expressões representam um cálculo a ser realizado sobre dados numéricos. Já nos deparámos com tais expressões: suponhamos que o preço armazenado nos registos do ficheiro BIBLIO é um preço sem impostos. Pretendemos apresentar cada título com o seu preço incluindo impostos, para uma taxa de IVA de 18,6%:
Se os preços aumentarem 3%, o comando será
Uma expressão pode conter vários operadores aritméticos, bem como funções e parênteses. Estes elementos são processados de acordo com diferentes prioridades:
1 | <---- prioridade mais elevada | |
2 | ||
3 | ||
4 | <---- prioridade inferior |
Quando dois operadores com a mesma prioridade estão presentes numa expressão, o que se encontra mais à esquerda é avaliado primeiro.
Exemplos
A expressão PRICE*RATE+TAXES será avaliada como (PRICE*RATE)+TAXES. Isto porque o operador de multiplicação é utilizado primeiro. A expressão PRICE*RATE/100 será avaliada como (PRICE*RATE)/100.
4.2.2. Expressões com operandos de caracteres
4.2.2.1. Lista de operadores
Podem ser utilizados os seguintes operadores:
Seja string1, string2, string3 e padrão de string
: 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 não é igual a string2 | |
: igual | |
: string1 está no intervalo [string2, string3] | |
: string1 pertence à lista de strings | |
: string1 não tem valor | |
: channel1 tem um valor | |
: string1 corresponde ao padrão |
Operador de concatenação
string1 || string2 : string2 concatenada a string1
4.2.2.2. Operadores relacionais
O que significa comparar cadeias de caracteres utilizando operadores como <, <=, etc.?
Cada caractere é codificado como um número inteiro. Ao comparar dois caracteres, são comparados os seus códigos inteiros. A codificação utilizada segue a ordem natural do dicionário:
Os números vêm antes das letras e as letras maiúsculas antes das minúsculas.
4.2.2.3. Comparar duas cadeias de caracteres
Considere a relação «CAT» < «DOG». É verdadeira ou falsa? Para realizar esta comparação, o SGBD compara as duas cadeias de caracteres, caractere a caractere, com base nos seus códigos inteiros. Assim que se verifica que dois caracteres são diferentes, a cadeia que contém o menor dos dois é considerada menor do que a outra cadeia. No nosso exemplo, «CAT» é comparado com «DOG». Obtemos os seguintes resultados sucessivos:
Após esta última comparação, a cadeia «CAT» é declarada como sendo mais curta do que a cadeia «DOG». A relação «CAT» < «DOG» é, portanto, verdadeira.
Agora vamos comparar «CHAT» e «chat».
Após esta comparação, a relação «CHAT» < «chat» é declarada verdadeira.
Exemplos


4.2.2.4. O operador LIKE
O operador LIKE é utilizado da seguinte forma: string LIKE padrão
A condição é verdadeira se a string corresponder ao padrão. O padrão é uma string que pode conter dois caracteres curinga:
que denota qualquer sequência de caracteres | |
que representa qualquer caractere único |
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 datas. Podem ser utilizados os seguintes operadores:
Operadores relacionais
é verdadeiro se data1 for anterior a data2 | |
é verdadeiro se data1 for anterior ou igual a data2 | |
é verdadeiro se data1 for posterior a data2 | |
é verdadeiro se data1 for igual ou posterior a data2 | |
é verdadeiro se data1 e data2 forem idênticas | |
é verdadeiro se data1 e data2 forem diferentes. | |
o mesmo que | |
é verdadeiro se data1 estiver entre data2 e data3 | |
é verdadeiro se data1 estiver na lista de datas | |
é verdadeiro se data1 não tiver valor | |
é verdadeiro se data1 tiver um valor | |
é verdadeiro se date1 corresponder ao padrão | |
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
Recorde-se 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 boolean1 e boolean2 dois valores booleanos. Existem três operadores possíveis, que são, por ordem de precedência:
| é verdadeiro se tanto boolean1 como boolean2 forem verdadeiros. |
| é verdadeiro se boolean1 ou boolean2 for verdadeiro. |
| tem um valor que é o inverso do valor de boolean1. |
Exemplos

Estamos à procura de livros dentro de um intervalo de preços:
![]()
Pesquisa inversa:

Tenha cuidado com a precedência dos operadores!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

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

4.3. Funções predefinidas do Firebird
O Firebird possui funções predefinidas. Estas não podem ser utilizadas imediatamente em instruções SQL. Deve primeiro executar o script SQL <firebird>\UDF\ib_udf.sql, onde <firebird> se refere ao diretório de instalação do SGBD Firebird:

Com o IBExpert, procedemos da seguinte forma:
- utilizamos a ferramenta [Script Executive], acessível através da opção [Tools/Script Executive]:

- Assim que a ferramenta estiver aberta, carregamos o script <firebird>\UDF\ib_udf.sql:

- depois executamos o script:

Depois de fazer isso, as funções predefinidas do Firebird ficam disponíveis para a base de dados à qual estava ligado quando o script foi executado. Para verificar isso, basta ir ao explorador de bases de dados e clicar no nó [UDF] da base de dados para a qual as funções foram importadas:

Acima estão as funções disponíveis para a base de dados. Para as testar, é útil ter uma tabela com uma linha. Vamos chamá-la de TEST:

e defini-la da seguinte forma (clique com o botão direito do rato em Tabelas / Nova Tabela):
Vamos adicionar uma única linha a esta tabela:


Agora vamos ao Editor SQL (F12) e executemos a seguinte instrução SQL:
que utiliza a função cos (cosseno) predefinida. O comando acima avalia cos(0) para cada linha da tabela TEST, ou seja, na verdade, para uma única linha. Por isso, simplesmente apresenta o valor de cos(0):
![]()
As UDFs (Funções Definidas pelo Utilizador) são funções que os utilizadores podem criar, e é possível encontrar bibliotecas de UDFs na Internet. Aqui, descrevemos apenas algumas das disponíveis na versão para download do Firebird (2005). Classificamo-las de acordo com o tipo predominante dos seus parâmetros ou de acordo com a sua função:
- funções com parâmetros numéricos
- funções com parâmetros do tipo string
4.3.1. Funções com parâmetros numéricos
| valor absoluto de número abs(-15) = 15 |
| o menor número inteiro maior ou igual a número ceil(15,7) = 16 |
| o maior número inteiro menor ou igual a número floor(14,3) = 14 |
| quociente da divisão inteira (o quociente é um número inteiro) de número1 por número2 div(7,3)=2 |
| resto da divisão inteira (o quociente é um número inteiro) de número1 por número2 mod(7,3)=1 |
| -1 se número < 0 0 se número=0 +1 se número > 0 sinal(-6) = -1 |
| raiz quadrada de número se número >= 0 -1 se número < 0 sqrt(16) = 4 |
4.3.2. Funções com parâmetros de cadeia de caracteres
ascii_char(número) | Número do caractere no código ASCII ascii_char(65) = 'A' |
lower(string) | converte a string para minúsculas lower('INFO')='info' |
ltrim(string) | Corte à esquerda - Os espaços que precedem o texto na string são removidos: ltrim(' kitten')='kitten' |
replace(string1, string2, string3) | Substitui string2 por string3 em string1. replace('gato e cão','gato','**')='**ato e **ão' |
rtrim(string1, string2) | Right Trim - igual a ltrim, mas à direita rtrim('gato ')='gato' |
substr(string, p, q) | subsequência de uma cadeia de caracteres que começa na posição p e termina na posição q. substr('kitten',3,5)='to' |
ascii_val(caractere) | Código ASCII do caractere ascii_val('A')=65 |
strlen(string) | número de caracteres na string strlen('kitten')=6 |