4. Die Ausdrücke der Sprache SQL
4.1. Introduction
In den meisten Befehlen SQL ist es möglich, einen Ausdruck zu verwenden. Nehmen wir zum Beispiel den Befehl SELECT:
SELECT expr1, expr2, ... aus table WHERE expression |
SELECT wählt die Zeilen aus, für die expression wahr ist, und zeigt für jede dieser Zeilen die Werte von expri an.
Beispiele
In diesem Abschnitt möchten wir den Begriff des Ausdrucks näher erläutern. Ein elementarer Ausdruck hat folgende Form:
Operand1 opérateur Operand2
oder
Funktion(Parameter)
Beispiel
Im Ausdruck „ “ ist GENRE gleich „ROMAN“
- GENRE ist Operand 1
- „ROMAN“ ist der Operand 2
- = ist der Operator
Im Ausdruck „upper(genre)“
- ist „upper“ eine Funktion
- „Typ“ ist ein Parameter dieser Funktion.
Zunächst behandeln wir Ausdrücke mit Operatoren, anschließend stellen wir die in Firebird verfügbaren Funktionen vor.
4.2. Ausdrücke mit Operatoren
Wir klassifizieren Ausdrücke mit Operatoren nach dem Typ ihrer Operanden:
- numerisch
- Zeichenkette
- Datum
- boolesch oder logisch
4.2.1. Ausdrücke mit numerischen Operanden
4.2.1.1. Liste der Operatoren
Seien nombre1, nombre2, nombre3 Zahlen. Folgende Operatoren können verwendet werden:
Relationale Operatoren
: Zahl1 ist größer als Zahl2 | |
: Zahl1 ist größer oder gleich Zahl2 | |
: Zahl1 ist kleiner als Zahl2 | |
: Zahl1 ist kleiner oder gleich Zahl2 | |
: Zahl1 ist gleich Zahl2 | |
: Zahl1 ist ungleich Zahl2 | |
: wie oben | |
: Zahl1 liegt im Intervall [nombre2,nombre3] | |
: Zahl1 gehört zur Zahlenliste | |
: Zahl1 hat keinen Wert | |
: Zahl1 hat einen Wert |
Arithmetische Operatoren
: Addition | |
: Subtraktion | |
: Multiplikation | |
: Division |
4.2.1.2. Relationale Operatoren
Ein relationaler Ausdruck drückt eine Beziehung aus, die entweder wahr oder falsch ist. Das Ergebnis eines solchen Ausdrucks ist daher ein boolescher oder logischer Wert.
Beispiele:
![]()

![]()
4.2.1.3. Arithmetische Operatoren
Der Begriff „arithmetischer Ausdruck“ ist uns vertraut. Er bezeichnet eine Berechnung, die mit numerischen Daten durchgeführt werden soll. Wir sind solchen Ausdrücken bereits begegnet: Es wird angenommen, dass der in den Datensätzen der Datei BIBLIO gespeicherte Preis ein Preis ohne Steuern ist. Wir möchten jeden Titel mit seinem Preis TTC bei einem Steuersatz von TVA von 18,6 % anzeigen:
Sollten die Preise um 3 % steigen, lautet der Befehl
In einem Ausdruck können mehrere arithmetische Operatoren sowie Funktionen und Klammern vorkommen. Diese Elemente werden nach unterschiedlichen Prioritäten verarbeitet:
1 | <---- höhere Priorität | |
2 | ||
3 | ||
4 | <---- geringere Priorität |
Wenn zwei Operatoren gleicher Priorität im Ausdruck vorkommen, wird derjenige, der im Ausdruck am weitesten links steht, zuerst ausgewertet.
Beispiele
Der Ausdruck PRIX*TAUX+TAXES wird wie folgt ausgewertet: (PRIX*TAUX)+TAXES ausgewertet. Tatsächlich wird der Multiplikationsoperator zuerst angewendet. Der Ausdruck PRIX*TAUX/100 wird wie folgt ausgewertet: (PRIX*TAUX)/100.
4.2.2. Ausdrücke mit Operanden vom Typ „Zeichen“
4.2.2.1. Liste der Operatoren
Folgende Operatoren können verwendet werden:
Seien „Kette1“, „Kette2“, „Kette3“ und „Muster“ Zeichenketten
: Zeichenfolge1 ist länger als Zeichenfolge2 | |
: Zeichenfolge1 ist größer oder gleich Zeichenfolge2 | |
: Zeichenfolge1 ist kleiner als Zeichenfolge2 | |
: Zeichenfolge1 ist kleiner oder gleich Zeichenfolge2 | |
: Zeichenfolge1 ist gleich Zeichenfolge2 | |
: Zeichenfolge1 ist ungleich Zeichenfolge2 | |
: wie oben | |
: Zeichenfolge1 liegt im Intervall [chaine2,chaine3] | |
: Zeichenfolge1 gehört zur Liste der Zeichenfolgen | |
: Zeichenfolge1 hat keinen Wert | |
: Zeichenfolge1 hat einen Wert | |
: „Zeichenfolge1“ entspricht der Vorlage |
Verknüpfungsoperator
Zeichenkette1 || Zeichenkette2 : chaine2 wird mit chaine1 verkettet
4.2.2.2. Relationale Operatoren
Was bedeutet es, Zeichenfolgen mit Operatoren wie <, <= usw. zu vergleichen?
Jedes Zeichen wird durch eine Ganzzahl kodiert. Beim Vergleich zweier Zeichen werden deren Ganzzahlcodes miteinander verglichen. Die verwendete Kodierung entspricht der natürlichen Reihenfolge im Wörterbuch:
Zahlen kommen vor Buchstaben, und Großbuchstaben vor Kleinbuchstaben.
4.2.2.3. Vergleich zweier Zeichenfolgen
Nehmen wir die Beziehung „CHAT“ < „CHIEN“. Ist sie wahr oder falsch? Um diesen Vergleich durchzuführen, vergleicht das Programm „SGBD“ die beiden Zeichenfolgen Zeichen für Zeichen auf der Grundlage ihrer Ganzzahlcodes. Sobald zwei Zeichen als unterschiedlich erkannt werden, gilt die Zeichenkette, die das kleinere der beiden Zeichen enthält, als kleiner als die andere Zeichenkette. In unserem Beispiel wird „CHAT“ mit „CHIEN“ verglichen. Dabei ergeben sich folgende aufeinanderfolgende Ergebnisse:
Nach diesem letzten Vergleich wird die Zeichenfolge „CHAT“ als kleiner als die Zeichenfolge „CHIEN“ erkannt. Die Beziehung „CHAT“ < „CHIEN“ ist daher wahr.
Vergleichen wir nun „CHAT“ und „chat“.
Nach diesem Vergleich wird die Beziehung „CHAT“ < „chat“ als wahr ausgewiesen.
Beispiele


4.2.2.4. Der Operator LIKE
Der Operator LIKE wird wie folgt verwendet: chaîne LIKE modèle
Die Beziehung ist wahr, wenn chaîne mit modèle übereinstimmt. Letzteres ist eine Zeichenkette, die zwei Platzhalterzeichen enthalten kann:
die jede beliebige Zeichenfolge bezeichnet | |
die ein beliebiges Zeichen bezeichnet |
Beispiele

![]()
![]()
4.2.2.5. Der Verkettungsoperator
![]()
4.2.3. Ausdrücke mit Operanden vom Typ „Datum“
Seien date1, date2 und date3 Datumsangaben. Folgende Operatoren können verwendet werden:
Relationale Operatoren
ist wahr, wenn date1 vor date2 liegt | |
ist wahr, wenn date1 vor date2 liegt oder gleich date2 ist | |
ist wahr, wenn date1 später als date2 ist | |
ist wahr, wenn date1 größer oder gleich date2 ist | |
ist wahr, wenn date1 und date2 identisch sind | |
ist wahr, wenn date1 und date2 unterschiedlich sind. | |
ebenso | |
ist wahr, wenn date1 zwischen date2 und date3 liegt | |
ist wahr, wenn date1 in der Liste der Daten enthalten ist | |
ist wahr, wenn „date1“ keinen Wert hat | |
ist wahr, wenn „date1“ einen Wert hat | |
ist wahr, wenn „date1“ dem Muster entspricht | |
Arithmetische Operatoren
: Anzahl der Tage zwischen datum1 und datum2 | |
: Datum2, sodass Datum1 – Datum2 = Anzahl | |
: Datum2, sodass Datum2 – Datum1 = Zahl |
Beispiele

![]()
![]()
Wie alt sind die Bücher in der Bibliothek?

4.2.4. Ausdrücke mit booleschen Operanden
Zur Erinnerung: Ein Boolescher Wert oder logischer Wert kann zwei Werte annehmen: wahr oder falsch. Der logische Operand ist oft das Ergebnis eines relationalen Ausdrucks.
Seien booléen1 und booléen2 zwei Boolesche Werte. Es gibt drei mögliche Operatoren, die in der Reihenfolge ihrer Priorität wie folgt lauten:
| ist wahr, wenn sowohl booléen1 als auch booléen2 wahr sind. |
| ist wahr, wenn entweder booléen1 oder booléen2 wahr ist. |
| hat als Wert den Kehrwert des Wertes von booléen1. |
Beispiele

Es wird nach Büchern gesucht, deren Preis zwischen zwei Werten liegt:
![]()
Umgekehrte Suche:

Achten Sie auf die Reihenfolge der Operatoren!
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and prix>200 or prix<100
order by prix asc

Man verwendet Klammern, um die Priorität der Operatoren zu steuern:
SQL> select titre,genre,prix from biblio
where genre='ROMAN' and (prix>200 or prix<100)
order by prix asc

4.3. Die vordefinierten Funktionen von Firebird
Firebird verfügt über vordefinierte Funktionen. Diese sind in den Befehlen SQL nicht sofort einsetzbar. Zunächst muss das Skript SQL <firebird>\UDF\ib_udf.sql ausgeführt werden, wobei <firebird> das Installationsverzeichnis von Firebird bezeichnet:

Bei IBExpert gehen wir wie folgt vor:
- Wir verwenden das Tool [Script Excecutive], das über die Option [Tools/ Script Executive] erstellt wurde:

- Sobald das Tool vorhanden ist, laden wir das Skript <firebird>\UDF\ib_udf.sql:

- Anschließend führen wir das Skript aus:

Sobald dies erledigt ist, stehen die vordefinierten Firebird-Funktionen für die Datenbank zur Verfügung, mit der man zum Zeitpunkt der Skriptausführung verbunden war. Um dies zu überprüfen, öffnen Sie einfach den Datenbank-Explorer und klicken Sie auf den Knoten „[UDF]“ der Datenbank, in die die Funktionen importiert wurden:

Oben sind die für die Datenbank verfügbaren Funktionen aufgeführt. Um sie zu testen, ist es praktisch, eine Tabelle mit einer Zeile zu haben. Nennen wir sie TEST:

und definieren wir sie wie folgt (Rechtsklick auf „Tables“ / „New Table“):
Fügen wir eine einzige Zeile in diese Tabelle ein:


Wechseln wir nun in den Editor SQL (F12) und geben wir den folgenden Befehl SQL ein:
der die vordefinierte Funktion cos (Kosinus) verwendet. Der obige Befehl wertet cos(0) für jede Zeile der Tabelle TEST aus, also tatsächlich für eine einzige Zeile. Es wird daher lediglich der Wert von cos(0) angezeigt:
![]()
Die Funktionen UDF (User Defined Function) sind Funktionen, die der Benutzer selbst erstellen kann, und so findet man im Internet Bibliotheken mit UDF-Funktionen. Wir beschreiben hier nur einige der Funktionen, die in der herunterladbaren Version von Firebird (2005) verfügbar sind. Wir klassifizieren sie nach dem vorherrschenden Typ ihrer Parameter oder nach ihrer Rolle:
- Funktionen mit numerischen Parametern
- Funktionen mit Parametern vom Typ Zeichenkette
4.3.1. Funktionen mit numerischen Parametern
| Absolutwert einer Zahl abs(-15) = 15 |
| Kleinste ganze Zahl, die größer oder gleich nombre ist ceil(15,7) = 16 |
| größte ganze Zahl, die kleiner oder gleich nombre ist floor(14,3) = 14 |
| Quotient der ganzzahligen Division (der Quotient ist eine ganze Zahl) von nombre1 durch nombre2 div(7,3) = 2 |
| Rest der ganzzahligen Division (der Quotient ist eine ganze Zahl) von nombre1 durch nombre2 mod(7,3)=1 |
| -1, wenn nombre < 0 0, wenn nombre = 0 +1, wenn nombre > 0 sign(-6) = -1 |
| Quadratwurzel aus nombre, wenn nombre ≥ 0 -1, wenn nombre < 0 sqrt(16) = 4 |
4.3.2. Funktionen mit Parametern vom Typ Zeichenkette
ascii_char(Zahl) | Zeichen mit dem Code ASCII nombre ascii_char(65) = 'A' |
lower(Zeichenkette) | wandelt chaine in Kleinbuchstaben um lower('INFO') = 'info' |
ltrim(Zeichenkette) | Left Trim – Leerzeichen vor dem Text „chaine“ werden entfernt: ltrim(' Kätzchen')='Kätzchen' |
replace(Zeichenkette1,Zeichenkette2,Zeichenkette3) | Ersetzt chaine2 durch chaine3 in chaine1. replace('Katze und Hund','Katze','**')='**ze und **und' |
rtrim(Zeichenkette1,Zeichenkette2) | Right Trim – wie ltrim, jedoch rechts rtrim('Katze ')='Katze' |
substr(Zeichenkette, p, q) | Teilzeichenfolge von chaine, beginnend an Position p und endend an Position q. substr('chaton', 3, 5) = 'ato' |
ascii_val(Zeichen) | Code ASCII von caractère ascii_val('A') = 65 |
strlen(Zeichenkette) | Anzahl der Zeichen in chaine strlen('Kätzchen') = 6 |