4. Wyrażenia w języku SQL
4.1. Introduction
W większości poleceń SQL można użyć wyrażenia. Weźmy na przykład polecenie SELECT:
SELECT expr1, expr2, ... z table WHERE expression |
SELECT wybiera wiersze, dla których warunek expression jest spełniony, i wyświetla dla każdego z nich wartości z expri.
Przykłady
W niniejszym akapicie zamierzamy wyjaśnić pojęcie wyrażenia. Wyrażenie elementarne ma postać:
operand1 opérateur operand2
lub
funkcja(parametry)
Przykład
W wyrażeniu GENRE = 'ROMAN'
- GENRE jest operandem 1
- „ROMAN” jest operandem 2
- = jest operatorem
W wyrażeniu upper(genre)
- „upper” jest funkcją
- typ jest parametrem tej funkcji.
Najpierw omówimy wyrażenia z operatorami, a następnie przedstawimy funkcje dostępne w Firebirdzie.
4.2. Wyrażenia z operatorami
Wyrażenia z operatorami podzielimy według typu ich operandów:
- liczbowe
- ciąg znaków
- data
- boolowskie lub logiczne
4.2.1. Wyrażenia z operandami typu liczbowego
4.2.1.1. Lista operatorów
Niech nombre1, nombre2, nombre3 będą liczbami. Dostępne są następujące operatory:
Operatory relacyjne
: liczba1 jest większa od liczby2 | |
: liczba1 jest większa lub równa liczbie2 | |
: liczba1 jest mniejsza od liczby2 | |
: liczba1 jest mniejsza lub równa liczbie2 | |
: liczba1 jest równa liczbie2 | |
: liczba1 różna od liczby2 | |
: to samo | |
: liczba1 mieści się w przedziale [nombre2,nombre3] | |
: liczba1 należy do listy liczb | |
: liczba1 nie ma wartości | |
: liczba1 ma wartość |
Operatory arytmetyczne
: dodawanie | |
: odejmowanie | |
: mnożenie | |
: dzielenie |
4.2.1.2. Operatory relacyjne
Wyrażenie relacyjne określa relację, która jest prawdziwa lub fałszywa. Wynikiem takiego wyrażenia jest zatem wartość boolowska lub logiczna.
Przykłady:
![]()

![]()
4.2.1.3. Operatory arytmetyczne
Wyrażenia arytmetyczne są nam dobrze znane. Wyrażają one obliczenia, które należy wykonać na danych liczbowych. Spotkaliśmy się już z takimi wyrażeniami: zakładamy, że cena zapisana w rekordach pliku BIBLIO jest ceną bez podatku. Chcemy wyświetlić każdy tytuł wraz z jego ceną TTC przy stawce TVA wynoszącej 18,6%:
Jeśli ceny mają wzrosnąć o 3%, polecenie będzie brzmiało
W wyrażeniu może występować kilka operatorów arytmetycznych, a także funkcje i nawiasy. Elementy te są przetwarzane zgodnie z różnymi priorytetami:
1 | <---- wyższy priorytet | |
2 | ||
3 | ||
4 | <---- niższy priorytet |
Gdy w wyrażeniu występują dwa operatory o tej samej priorytecie, w pierwszej kolejności obliczany jest ten, który znajduje się bardziej po lewej stronie wyrażenia.
Przykłady
Wyrażenie PRIX*TAUX+TAXES zostanie obliczone jako (PRIX*TAUX)+TAXES. W rzeczywistości to operator mnożenia zostanie zastosowany jako pierwszy. Wyrażenie PRIX*TAUX/100 zostanie obliczone jako (PRIX*TAUX)/100.
4.2.2. Wyrażenia z operandami typu znakowego
4.2.2.1. Lista operatorów
Dostępne są następujące operatory:
Niech chaine1, chaine2, chaine3 będą przykładami ciągów znaków
: ciąg1 jest dłuższy niż ciąg2 | |
: ciąg1 jest większy lub równy ciągowi2 | |
: ciąg1 jest mniejszy niż ciąg2 | |
: ciąg1 jest mniejszy lub równy ciągowi2 | |
: ciąg1 jest równy ciągowi2 | |
: ciąg1 różni się od ciągu2 | |
: to samo | |
: ciąg1 mieści się w przedziale [chaine2,chaine3] | |
: ciąg1 należy do listy ciągów | |
: ciąg1 nie ma wartości | |
: ciąg1 ma wartość | |
: ciąg1 pasuje do wzorca |
Operator konkatenacji
ciąg1 || ciąg2 : chaine2 połączony z chaine1
4.2.2.2. Operatory relacyjne
Co oznacza porównywanie ciągów znaków za pomocą operatorów takich jak <, <= itp.?
Każdy znak jest zakodowany za pomocą liczby całkowitej. Podczas porównywania dwóch znaków porównywane są ich kody całkowite. Zastosowane kodowanie zachowuje naturalną kolejność słownika:
Cyfry występują przed literami, a wielkie litery przed małymi.
4.2.2.3. Porównanie dwóch ciągów znaków
Rozważmy relację „CHAT” < „CHIEN”. Czy jest ona prawdziwa, czy fałszywa? Aby przeprowadzić to porównanie, algorytm SGBD porównuje oba ciągi znak po znaku na podstawie ich kodów całkowitoliczbowych. Gdy tylko wykryje się różnicę między dwoma znakami, ciąg, w którym występuje mniejszy z tych znaków, uznaje się za mniejszy od drugiego ciągu. W naszym przykładzie ciąg „CHAT” jest porównywany z ciągiem „CHIEN”. Otrzymujemy następujące wyniki:
Po tym ostatnim porównaniu ciąg znaków „CHAT” zostaje uznany za krótszy od ciągu znaków „CHIEN”. Zatem relacja „CHAT” < „CHIEN” jest prawdziwa.
Porównajmy teraz ciągi „CHAT” i „chat”.
Po tym porównaniu relacja „CHAT” < „chat” zostaje uznana za prawdziwą.
Przykłady


4.2.2.4. Operator LIKE
Operator LIKE stosuje się w następujący sposób: chaîne LIKE modèle
Równoważność jest spełniona, jeśli chaîne odpowiada modèle. Jest to ciąg znaków, który może zawierać dwa znaki wieloznaczne:
oznaczający dowolny ciąg znaków | |
która oznacza 1 dowolny znak |
Przykłady

![]()
![]()
4.2.2.5. Operator konkatenacji
![]()
4.2.3. Wyrażenia z operandami typu data
Niech date1, date2, date3 będą datami. Dostępne są następujące operatory:
Operatory relacyjne
jest prawdziwe, jeśli date1 jest wcześniejsza niż date2 | |
jest prawdziwe, jeśli data1 jest wcześniejsza lub równa dacie2 | |
jest prawdziwe, jeśli data1 jest późniejsza niż data2 | |
jest prawdziwe, jeśli data1 jest późniejsza lub równa dacie2 | |
jest prawdziwe, jeśli data1 i data2 są identyczne | |
jest prawdziwe, jeśli data1 i data2 są różne. | |
to samo | |
jest prawdziwe, jeśli data1 mieści się między datą2 a datą3 | |
jest prawdziwe, jeśli data1 znajduje się na liście dat | |
jest prawdziwe, jeśli data1 nie ma wartości | |
jest prawdziwe, jeśli data1 ma wartość | |
jest prawdziwe, jeśli date1 odpowiada wzorcowi | |
Operatory arytmetyczne
: liczba dni dzielących datę1 od daty2 | |
: data2 taka, że data1 – data2 = liczba | |
: data2 taka, że data2 – data1 = liczba |
Przykłady

![]()
![]()
Jak stare są książki w bibliotece?

4.2.4. Wyrażenia z operandami boolowskimi
Przypomnijmy, że wartość logiczna może przyjmować dwie wartości: prawdziwe lub fałszywe. Operand logiczny jest często wynikiem wyrażenia relacyjnego.
Niech booléen1 i booléen2 będą dwiema wartościami boolowskimi. Istnieją trzy możliwe operatory, których kolejność pierwszeństwa jest następująca:
| jest prawdziwe, jeśli zarówno booléen1, jak i booléen2 są prawdziwe. |
| jest prawdziwe, jeśli prawdziwe jest albo booléen1, albo booléen2. |
| ma wartość odwrotną do wartości booléen1. |
Przykłady

Szukamy książek w przedziale cenowym:
![]()
Wyszukiwanie odwrotne:

Należy zwrócić uwagę na kolejność operatorów!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Aby kontrolować priorytet operatorów, stosuje się nawiasy:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. Wbudowane funkcje Firebirda
Firebird posiada wbudowane funkcje. Nie można z nich od razu korzystać w poleceniach SQL. Najpierw należy uruchomić skrypt SQL <firebird>\UDF\ib_udf.sql, gdzie <firebird> oznacza katalog instalacyjny Firebirda:

W przypadku pliku IBExpert postępujemy w następujący sposób:
- używamy narzędzia [Script Excecutive] uzyskanego za pomocą opcji [Tools/ Script Executive]:

- po uruchomieniu narzędzia ładujemy skrypt <firebird>\UDF\ib_udf.sql:

- następnie uruchamiamy skrypt:

Po wykonaniu tej czynności predefiniowane funkcje Firebirda są dostępne dla bazy danych, z którą użytkownik był połączony w momencie uruchomienia skryptu. Aby to sprawdzić, wystarczy przejść do eksploratora baz danych i kliknąć węzeł [UDF] w bazie, do której zaimportowano funkcje:

Powyżej widoczne są funkcje dostępne w bazie. Aby je przetestować, warto utworzyć tabelę zawierającą jeden wiersz. Nazwijmy ją TEST:

i zdefiniujmy ją w następujący sposób (kliknij prawym przyciskiem myszy na Tables / New Table):
Umieśćmy w tej tabeli jeden wiersz:


Przejdźmy teraz do edytora SQL (F12) i wygenerujmy następujące polecenie SQL:
które wykorzystuje predefiniowaną funkcję cos (cosinus). Powyższe polecenie oblicza wartość cos(0) dla każdego wiersza tabeli TEST, a więc w rzeczywistości dla jednego wiersza. Wyświetlana jest zatem po prostu wartość cos(0):
![]()
Funkcje UDF (funkcje zdefiniowane przez użytkownika) to funkcje, które użytkownik może tworzyć, dzięki czemu w Internecie można znaleźć biblioteki funkcji UDF. Opisujemy tutaj tylko niektóre z tych dostępnych w wersji Firebirda do pobrania (2005). Klasyfikujemy je według dominującego typu parametrów lub według pełnionej funkcji:
- funkcje z parametrami typu liczbowego
- funkcje z parametrami typu ciąg znaków
4.3.1. Funkcje z parametrami typu liczbowego
| wartość bezwzględna liczby abs(-15) = 15 |
| najmniejsza liczba całkowita większa lub równa nombre ceil(15,7) = 16 |
| największa liczba całkowita mniejsza lub równa nombre floor(14,3) = 14 |
| iloraz z dzielenia całkowitego (iloraz jest liczbą całkowitą) nombre1 przez nombre2 div(7,3)=2 |
| reszta z dzielenia całkowitego (iloraz jest liczbą całkowitą) liczby nombre1 przez nombre2 mod(7,3)=1 |
| -1, jeśli nombre < 0 0, jeśli nombre = 0 +1, jeśli nombre > 0 sign(-6) = -1 |
| pierwiastek kwadratowy z nombre, jeśli nombre ≥ 0 -1, jeśli nombre < 0 sqrt(16)=4 |
4.3.2. Funkcje z parametrami typu ciąg znaków
ascii_char(liczba) | znak o kodzie ASCII nombre ascii_char(65) = 'A' |
lower(ciąg) | zamienia chaine na małe litery lower('INFO') = 'info' |
ltrim(ciąg) | Left Trim – spacje poprzedzające tekst chaine są usuwane: ltrim(' kotek')='kotek' |
replace(ciąg1,ciąg2,ciąg3) | zastępuje chaine2 przez chaine3 w chaine1. replace('kot i pies','kot','**')='**ot i **ies' |
rtrim(ciąg1,ciąg2) | Right Trim – to samo co ltrim, ale po prawej stronie rtrim('kot ')='kot' |
substr(ciąg, p, q) | podciąg ciągu chaine, zaczynający się w pozycji p i kończący się w pozycji q. substr('chaton', 3, 5) = 'ato' |
ascii_val(znak) | kod ASCII z caractère ascii_val('A') = 65 |
strlen(ciąg) | liczba znaków w chaine strlen('chaton') = 6 |