Skip to content

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:

sintaxe
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

SQL> select prix*1.186 from biblio
SQL> select titre from biblio where prix between 100 and 150

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 > número2
: número1 é maior que número2
número1 >= número2
: número1 é maior ou igual a número2
número1 < número2
: número1 é menor que número2
número1 <= número2
: número1 é menor ou igual a número2
número1 = número2
: número1 é igual a número2
número1 != número2
: número1 não é igual a número2
número1 ≠ número2
: o mesmo que
número1 ENTRE número2 E número3
: o número1 está no intervalo [número2, número3]
número1 IN (lista de números)
: número1 pertence à lista de números
número1 É NULL
: número1 não tem valor
número1 NÃO É NULO
: o número 1 tem um valor

Operadores aritméticos

número1 + número2
: adição
número1 - número2
: subtração
número1 * número2
: multiplicação
número1 / número2
: 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:

SQL> select titre,prix from biblio where prix between 100 and 150

Image

SQL> select titre,prix from biblio where prix not between 100 and 150

Image

SQL> select titre,prix from biblio where prix in (200,210)

Image

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%:

    SELECT TITRE, PRIX*1.186 FROM BIBLIO

Se os preços aumentarem 3%, o comando será

    UPDATE BIBLIO SET PRIX = PRIX*1.03

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
funções
<---- prioridade mais elevada
2
()
 
3
* e /
 
4
+ e -
<---- 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 > string2
: string1 é maior que string2
string1 >= string2
: string1 é maior ou igual a string2
string1 < string2
: string1 é menor que string2
string1 <= string2
: string1 é menor ou igual a string2
string1 = string2
: string1 é igual a string2
string1 != string2
: string1 não é igual a string2
string1 ≠ string2
: igual
string1 ENTRE string2 E string3
: string1 está no intervalo [string2, string3]
string1 NA lista de strings
: string1 pertence à lista de strings
string1 É NULL
: string1 não tem valor
string1 NÃO É NULL
: channel1 tem um valor
string1 é semelhante ao padrão
: 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:

blanc<..< 0 < 1 < ...< 9 < ...< A < B <... < Z < ... < a < b < ... < z

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:

    'CHAT'    'CHIEN'
----------------------------
    'C'    =    'C'
    'H'    =    'H'
    'A'    <    'I'

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».

    'CHAT'    'chat'
--------------------------
    'C'    <    'c'

Após esta comparação, a relação «CHAT» < «chat» é declarada verdadeira.

Exemplos

SQL> select titre from biblio

Image

SQL> select titre from biblio where upper(titre) between 'L' and 'M'

Image

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

SQL> select titre from biblio

Image

SQL> select titre from biblio where titre like 'M%';

Image

SQL> select titre from biblio where titre like 'L_ %';

Image

4.2.2.5. O operador de concatenação

SQL > select '[' || titre || ']' from biblio where upper(titre) LIKE 'L_ %'

Image

4.2.3. Expressões com operandos do tipo data

Sejam date1, date2 e date3 datas. Podem ser utilizados os seguintes operadores:

Operadores relacionais

date1 < date2
é verdadeiro se data1 for anterior a data2
data1 <= data2
é verdadeiro se data1 for anterior ou igual a data2
data1 > data2
é verdadeiro se data1 for posterior a data2
data1 >= data2
é verdadeiro se data1 for igual ou posterior a data2
data1 = data2
é verdadeiro se data1 e data2 forem idênticas
data1 ≠ data2
é verdadeiro se data1 e data2 forem diferentes.
data1 != data2
o mesmo que
date1 BETWEEN date2 AND date3
é verdadeiro se data1 estiver entre data2 e data3
data1 IN (lista de datas)
é verdadeiro se data1 estiver na lista de datas
data1 É NULO
é verdadeiro se data1 não tiver valor
date1 NÃO É NULL
é verdadeiro se data1 tiver um valor
date1 LIKE padrão
é verdadeiro se date1 corresponder ao padrão
ALL, ANY, EXISTS
 

Operadores aritméticos

data1 - data2
: número de dias entre data1 e data2
data1 - número
: data2 tal que data1 - data2 = número
data1 + número
: data2 tal que data2 - data1 = número

Exemplos

SQL> select achat from biblio

Image

SQL>select achat from biblio
   where achat between '01.01.1988' and '31.12.1988';

Image

SQL> select titre, achat from biblio
where cast(achat as char(10)) like '1988'

Image

Qual é a idade dos livros da biblioteca?

SQL> select titre, cast('now' as date)-achat "age(jours)" from biblio

Image

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:


boolean1 AND boolean2
é verdadeiro se tanto boolean1 como boolean2 forem verdadeiros.

boolean1 OR boolean2
é verdadeiro se boolean1 ou boolean2 for verdadeiro.

NOT boolean1
tem um valor que é o inverso do valor de boolean1.

Exemplos

SQL> select titre,genre,prix from biblio order by prix desc

Image

Estamos à procura de livros dentro de um intervalo de preços:

SQL> select titre,genre,prix from biblio
     where prix>=130 and prix <=170

Image

Pesquisa inversa:

SQL> select titre,genre,prix from biblio
     where prix<130 or prix >170
     order by prix asc

Image

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

Image

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

Image

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:

Image

Com o IBExpert, procedemos da seguinte forma:

  • utilizamos a ferramenta [Script Executive], acessível através da opção [Tools/Script Executive]:

Image

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

Image

  • depois executamos o script:

Image

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:

Image

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:

Image

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:

Image

Image

Agora vamos ao Editor SQL (F12) e executemos a seguinte instrução SQL:

SQL> select cos(0) from test

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):

Image

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


abs(número)
valor absoluto de número
abs(-15) = 15

ceil(número)
o menor número inteiro maior ou igual a número
ceil(15,7) = 16

floor(número)
o maior número inteiro menor ou igual a número
floor(14,3) = 14

div(número1, número2)
quociente da divisão inteira (o quociente é um número inteiro) de número1 por número2
div(7,3)=2

mod(número1, número2)
resto da divisão inteira (o quociente é um número inteiro) de número1 por número2
mod(7,3)=1

sign(número)
-1 se número < 0
0 se número=0
+1 se número > 0
sinal(-6) = -1

sqrt(número)
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