Skip to content

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:

syntaxe
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

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

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

nombre1 > nombre2
: número1 é maior que número2
nombre1 >= nombre2
: número1 é maior ou igual a número2
nombre1 < nombre2
: número1 menor que número2
nombre1 <= nombre2
: número1 menor ou igual a número2
nombre1 = nombre2 
: número1 é igual a número2
nombre1 != nombre2 
: número1 diferente de número2
nombre1 <> nombre2
: o mesmo
nombre1 BETWEEN nombre2 AND nombre3
: número1 está no intervalo [nombre2,nombre3]
nombre1 IN (liste de nombres)
: número1 pertence à lista de números
nombre1 IS NULL
: número1 não tem valor
nombre1 IS NOT NULL
: número1 tem um valor

Operadores aritméticos

nombre1 + nombre2
: adição
nombre1 - nombre2
: subtração
nombre1 * nombre2
: multiplicação
nombre1 / nombre2
: 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:

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

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

    SELECT TITRE, PRIX*1.186 FROM BIBLIO

Se os preços precisarem aumentar em 3%, o comando será

    UPDATE BIBLIO SET PRIX = PRIX*1.03

É 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
fonctions
<---- prioridade maior
2
()
 
3
* et /
 
4
+ et -
<---- 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

chaine1 > chaine2
: string1 é maior que string2
chaine1 >= chaine2
: string1 é maior ou igual a string2
chaine1 < chaine2
: string1 menor que string2
chaine1 <= chaine2
: string1 menor ou igual a string2
chaine1 = chaine2 
: string1 é igual a string2
chaine1 != chaine2
: string1 diferente de string2
chaine1 <> chaine2
: o mesmo
chaine1 BETWEEN chaine2 AND chaine3
: string1 está no intervalo [chaine2,chaine3]
chaine1 IN liste de chaines
: cadeia1 pertence à lista de cadeias
chaine1 IS NULL
: cadeia1 não tem valor
chaine1 IS NOT NULL
: string1 tem um valor
chaine1 LIKE modèle
: 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:

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

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:

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

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

     'CHAT    ' 'gato'
--------------------------
     'C    '     < 'c'

Após essa comparação, a relação 'CHAT' < 'gato' é 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: 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

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 algumas datas. Os operadores que podem ser utilizados são os seguintes:

Operadores relacionais

date1 < date2
é verdadeira se data1 for anterior a data2
date1 <= date2
é verdadeira se data1 for anterior ou igual a data2
date1 > date2
é verdadeira se data1 for posterior a data2
date1 >= date2
é verdadeira se data1 for posterior ou igual a data2
date1 = date2
é verdadeira se data1 e data2 forem iguais
date1 <> date2
é verdadeira se data1 e data2 forem diferentes.
date1 != date2
idem
date1 BETWEEN date2 AND date3
é verdadeira se data1 estiver entre data2 e data3
date1 IN (liste de dates)
é verdadeira se data1 estiver na lista de datas
date1 IS NULL
é verdadeira se data1 não tiver valor
date1 IS NOT NULL
é verdadeira se data1 tiver um valor
date1 LIKE modèle
é verdadeira se date1 corresponder ao modelo
ALL,ANY,EXISTS
 

Operadores aritméticos

date1 - date2
: número de dias entre data1 e data2
date1 - nombre
: data2 tal que data1 - data2 = número
date1 + nombre
: 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

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:


booléen1 AND booléen2
é verdadeira se booléen1 e booléen2 forem ambos verdadeiros.

booléen1 OR booléen2
é verdadeira se booléen1 ou booléen2 for verdadeira.

NOT booléen1
tem como valor o inverso do valor de booléen1.

Exemplos

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

Image

Procuram-se livros cujo preço esteja entre:

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

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

Image

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

Image

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:

Image

Com o IBExpert, procedemos da seguinte maneira:

  • utilizamos a ferramenta [Script Excecutive] obtida pela opção [Tools/ Script Executive]:

Image

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

Image

  • Em seguida, executamos o script:

Image

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:

Image

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:

Image

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:

Image

Image

Agora vamos para o editor SQL (F12) e emitamos o comando SQL a seguir:

SQL> select cos(0) from test

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

Image

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


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

ceil(nombre)
menor inteiro maior ou igual a nombre
ceil(15,7) = 16

floor(nombre)
maior inteiro menor ou igual a nombre
floor(14,3) = 14

div(nombre1,nombre2)
quociente da divisão inteira (o quociente é inteiro) de nombre1 por nombre2
div(7,3) = 2

mod(nombre1,nombre2)
resto da divisão inteira (o quociente é inteiro) de nombre1 por nombre2
mod(7,3) = 1

sign(nombre)
-1 se nombre < 0
0 se nombre = 0
+1 se nombre > 0
sign(-6) = -1

sqrt(nombre)
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