4. De uitdrukkingen in de taal SQL
4.1. Introduction
In de meeste commando's SQL is het mogelijk om een uitdrukking te gebruiken. Laten we bijvoorbeeld het commando SELECT nemen:
SELECT expr1, expr2, ... uit table WHERE expression |
SELECT selecteert de rijen waarvoor expression waar is en geeft voor elk daarvan de waarden van expri weer.
Voorbeelden
In deze paragraaf willen we het begrip ‘uitdrukking’ toelichten. Een elementaire uitdrukking is van het type:
operand1 opérateur operand2
of
functie(parameters)
Voorbeeld
In de uitdrukking is GENRE gelijk aan 'ROMAN'
- GENRE is operand 1
- 'ROMAN' is operand 2
- = is de operator
In de uitdrukking upper(genre)
- is 'upper' een functie
- 'type' is een parameter van deze functie.
We behandelen eerst uitdrukkingen met operatoren, daarna zullen we de functies presenteren die beschikbaar zijn in Firebird.
4.2. Uitdrukkingen met een operator
We zullen uitdrukkingen met operatoren indelen op basis van het type van hun operanden:
- numeriek
- tekenreeks
- datum
- booleaanse of logische
4.2.1. Uitdrukkingen met numerieke operanden
4.2.1.1. Lijst met operatoren
Stel dat nombre1, nombre2 en nombre3 getallen zijn. De volgende operatoren kunnen worden gebruikt:
Relationele operatoren
: getal1 is groter dan getal2 | |
: getal1 is groter dan of gelijk aan getal2 | |
: getal1 is kleiner dan getal2 | |
: getal1 is kleiner dan of gelijk aan getal2 | |
: getal1 is gelijk aan getal2 | |
: getal1 is niet gelijk aan getal2 | |
: idem | |
: getal1 ligt binnen het interval [nombre2,nombre3] | |
: getal1 behoort tot de lijst met getallen | |
: getal1 heeft geen waarde | |
: getal1 heeft een waarde |
Rekenkundige operatoren
: optelling | |
: aftrekken | |
: vermenigvuldiging | |
: deling |
4.2.1.2. Relationele operatoren
Een relationele uitdrukking drukt een relatie uit die waar of onwaar is. Het resultaat van zo'n uitdrukking is dus een booleaanse waarde of logische waarde.
Voorbeelden:
![]()

![]()
4.2.1.3. Rekenkundige operatoren
We zijn bekend met rekenuitdrukkingen. Deze geven een berekening weer die moet worden uitgevoerd met numerieke gegevens. We zijn dergelijke uitdrukkingen al tegengekomen: we gaan ervan uit dat de prijs die is opgeslagen in de records van het bestand BIBLIO een prijs exclusief btw is. We willen elk effect weergeven met zijn prijs TTC bij een tarief van TVA van 18,6%:
Als de prijzen met 3% moeten stijgen, luidt de opdracht
In een uitdrukking kunnen meerdere rekenoperatoren voorkomen, samen met functies en haakjes. Deze elementen worden volgens verschillende prioriteiten verwerkt:
1 | <---- hogere prioriteit | |
2 | ||
3 | ||
4 | <---- lagere prioriteit |
Wanneer er twee operatoren met dezelfde prioriteit in de uitdrukking voorkomen, wordt degene die het meest links in de uitdrukking staat als eerste geëvalueerd.
Voorbeelden
De uitdrukking PRIX*TAUX+TAXES wordt als volgt berekend: (PRIX*TAUX)+TAXES. De vermenigvuldigingsoperator wordt namelijk als eerste toegepast. De uitdrukking PRIX*TAUX/100 wordt berekend als (PRIX*TAUX)/100.
4.2.2. Uitdrukkingen met operanden van het type teken
4.2.2.1. Lijst met operatoren
De volgende operatoren kunnen worden gebruikt:
Stel dat we keten1, keten2, keten3 en het patroon van de tekenreeksen hebben
: string1 is langer dan string2 | |
: string1 is groter dan of gelijk aan string2 | |
: string1 is kleiner dan string2 | |
: string1 is kleiner dan of gelijk aan string2 | |
: string1 is gelijk aan string2 | |
: string1 is niet gelijk aan string2 | |
: idem | |
: string1 ligt binnen het interval [chaine2,chaine3] | |
: reeks1 behoort tot de reeksenlijst | |
: string1 heeft geen waarde | |
: string1 heeft een waarde | |
: string1 komt overeen met sjabloon |
Aaneenschakelingsoperator
string1 || string2 : chaine2 samengevoegd met chaine1
4.2.2.2. Relationele operatoren
Wat betekent het om tekenreeksen te vergelijken met operatoren zoals <, <=, enz.?
Elk teken wordt gecodeerd als een geheel getal. Bij het vergelijken van twee tekens worden hun geheelgetalcodes met elkaar vergeleken. De gebruikte codering volgt de natuurlijke volgorde van het woordenboek:
Cijfers komen vóór letters, en hoofdletters vóór kleine letters.
4.2.2.3. Vergelijking van twee tekenreeksen
Stel de vergelijking 'CHAT' < 'CHIEN'. Is deze waar of onwaar? Om deze vergelijking uit te voeren, vergelijkt het systeem de twee tekenreeksen teken voor teken op basis van hun gehele getalcodes. Zodra er twee verschillende tekens worden gevonden, wordt de tekenreeks met het kleinste van de twee als kleiner beschouwd dan de andere tekenreeks. In ons voorbeeld wordt 'CHAT' vergeleken met 'CHIEN'. We krijgen de volgende opeenvolgende resultaten:
Na deze laatste vergelijking wordt de tekenreeks 'CHAT' kleiner verklaard dan de tekenreeks 'CHIEN'. De relatie 'CHAT' < 'CHIEN' is dus waar.
Laten we nu ‘CHAT’ en ‘chat’ vergelijken.
Na deze vergelijking wordt de relatie 'CHAT' < 'chat' als waar aangemerkt.
Voorbeelden


4.2.2.4. De operator LIKE
De operator LIKE wordt als volgt gebruikt: chaîne LIKE modèle
De relatie is waar als chaîne overeenkomt met modèle. Dit is een tekenreeks die twee jokertekens kan bevatten:
die elke reeks tekens aanduidt | |
die staat voor 1 willekeurig teken |
Voorbeelden

![]()
![]()
4.2.2.5. De aaneenschakeloperator
![]()
4.2.3. Uitdrukkingen met operanden van het type datum
Stel dat date1, date2 en date3 datums zijn. De volgende operatoren kunnen worden gebruikt:
Relationele operatoren
is waar als datum1 eerder is dan datum2 | |
is waar als datum1 eerder is dan of gelijk is aan datum2 | |
is waar als datum1 later is dan datum2 | |
is waar als datum1 later is dan of gelijk is aan datum2 | |
is waar als datum1 en datum2 gelijk zijn | |
is waar als datum1 en datum2 verschillend zijn. | |
idem | |
is waar als datum1 tussen datum2 en datum3 ligt | |
is waar als datum1 in de lijst met datums voorkomt | |
is waar als datum1 geen waarde heeft | |
is waar als datum1 een waarde heeft | |
is waar als date1 overeenkomt met het sjabloon | |
Rekenkundige operatoren
: aantal dagen tussen datum1 en datum2 | |
: datum2 zodanig dat datum1 - datum2 = getal | |
: datum2 zodanig dat datum2 - datum1 = getal |
Voorbeelden

![]()
![]()
Hoe oud zijn de boeken in de bibliotheek?

4.2.4. Uitdrukkingen met booleaanse operanden
Ter herinnering: een booleaanse of logische waarde kan twee waarden aannemen: waar of onwaar. De logische operand is vaak het resultaat van een relationele uitdrukking.
Stel dat booléen1 en booléen2 twee booleaanse waarden zijn. Er zijn drie mogelijke operatoren, in volgorde van prioriteit:
| is waar als zowel booléen1 als booléen2 waar zijn. |
| is waar als booléen1 of booléen2 waar is. |
| heeft als waarde het omgekeerde van de waarde van booléen1. |
Voorbeelden

We zoeken naar boeken tussen twee prijzen:
![]()
Omgekeerd zoeken:

Let op de volgorde van de operatoren!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

We gebruiken haakjes om de prioriteit van de operatoren te bepalen:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. De vooraf gedefinieerde functies van Firebird
Firebird beschikt over vooraf gedefinieerde functies. Deze zijn niet direct bruikbaar in de opdrachten SQL. Eerst moet het script SQL <firebird>\UDF\ib_udf.sql worden uitgevoerd, waarbij <firebird> verwijst naar de installatiemap van Firebird:

Met IBExpert gaan we als volgt te werk:
- we gebruiken het hulpprogramma [Script Excecutive] dat is verkregen via de optie [Tools/ Script Executive]:

- zodra de tool beschikbaar is, laden we het script <firebird>\UDF\ib_udf.sql:

- Vervolgens voeren we het script uit:

Zodra dit is gebeurd, zijn de vooraf gedefinieerde functies van Firebird beschikbaar voor de database waarmee men was verbonden toen het script werd uitgevoerd. Om dit te zien, hoeft men alleen maar naar de database-verkenner te gaan en op het knooppunt [UDF] te klikken van de database waarin de functies zijn geïmporteerd:

Hierboven ziet u de functies die beschikbaar zijn in de database. Om ze te testen, is het handig om een tabel met één rij te hebben. Laten we deze TEST noemen:

en definiëren we deze als volgt (rechtsklikken op Tables / New Table):
Laten we één rij in deze tabel plaatsen:


Laten we nu naar de editor SQL (F12) gaan en de volgende opdracht SQL uitvoeren:
die gebruikmaakt van de vooraf gedefinieerde functie cos (cosinus). Het bovenstaande commando berekent cos(0) voor elke rij van de tabel TEST, dus in feite voor slechts één rij. Er wordt dus gewoon de waarde van cos(0) weergegeven:
![]()
De functies UDF (User Defined Function) zijn functies die de gebruiker zelf kan aanmaken; op het internet zijn dan ook bibliotheken met UDF-functies te vinden. We beschrijven hier slechts enkele van de functies die beschikbaar zijn in de downloadbare versie van Firebird (2005). We classificeren ze op basis van het overheersende type van hun parameters of op basis van hun rol:
- functies met numerieke parameters
- functies met parameters van het type tekenreeks
4.3.1. Functies met numerieke parameters
| absolute waarde van een getal abs(-15)=15 |
| kleinste gehele getal groter dan of gelijk aan nombre ceil(15,7) = 16 |
| grootste geheel getal kleiner dan of gelijk aan nombre floor(14,3)=14 |
| quotiënt van de gehele deling (het quotiënt is een geheel getal) van nombre1 door nombre2 div(7,3)=2 |
| rest van de gehele deling (het quotiënt is een geheel getal) van nombre1 door nombre2 mod(7,3)=1 |
| -1 als nombre < 0 0 als nombre = 0 +1 als nombre > 0 sign(-6) = -1 |
| vierkantswortel van nombre als nombre ≥ 0 -1 als nombre<0 sqrt(16)=4 |
4.3.2. Functies met parameters van het type tekenreeks
ascii_char(getal) | teken met code ASCII nombre ascii_char(65) = 'A' |
lower(string) | zet chaine in kleine letters lower('INFO')='info' |
ltrim(string) | Left Trim - De spaties vóór de tekst van chaine worden verwijderd: ltrim(' kitten')='kitten' |
replace(string1,string2,string3) | vervangt chaine2 door chaine3 in chaine1. replace('kat en hond','kat','**')='**at en **ien' |
rtrim(string1, string2) | Right Trim - hetzelfde als ltrim, maar aan de rechterkant rtrim('kat ')='kat' |
substr(string, p, q) | deelreeks van chaine die begint op positie p en eindigt op positie q. substr('chaton',3,5)='ato' |
ascii_val(teken) | code ASCII van caractère ascii_val('A') = 65 |
strlen(string) | aantal tekens van chaine strlen('kitten') = 6 |