+ | Positiv: gibt den Wert des nachfolgenden Ausdrucks als positiven Wert zurück |
- | Negativ: gibt den Wert des nachfolgenden Ausdrucks als negativen Wert zurück |
~ | Bitweises NOT: gibt den Wert der nachfolgenden Ganzzahl so zurück, daß jedes Bit umgedreht wird: 0 wird zu 1 und 1 wird zu 0. |
+ | Addition: A_Preis + 10.0 |
- | Subtraktion: A_Preis - 10.0 |
* | Multiplikation: A.A_Preis * U.A_Stueck |
/ | Division: Monatsumsatz / 20.0 |
% | Modulo: gibt den ganzzahligen Rest einer Division zurück: 23 % 5 = 3, da 23 = 4*5 + 3 ist |
Select P.Nachname + ', ' + P.Vorname From Personen As P
Zu beachten ist, daß bei uneindeutigen Verknüpfungen zwischen einer Zeichenkette und einer Zahl versucht wird, die Zeichenkette in eine Zahl zu konvertieren. Gelingt dies, so wird '+' als arithmetischer Operator interpretiert. Ist die Zeichenkette nicht konvertierbar, wird ein Laufzeitfehler erzeugt.
5 + '9' | erzeugt 14 |
'5' + 9 | erzeugt ebenfalls 14, die Position der Zahl ist irrelevant |
'5' + '9' | erzeugt den String '59' |
'5.3' + 9 | dies scheitert, da '5.3' nicht als Integer interpretierbar ist |
'5.3' + 9.0 | erzeugt 14.3, da nun versucht wird, '5.3' als Dezimalzahl zu interpretieren |
'5,3' + 9 | scheitert mit Hinweis auf eine fehlgeschlagene Konvertierung, da in der englischen Standardeinstellung der Punkt und nicht das Komma das Dezimaltrennzeichen ist |
erster Ausdruck | zweiter Ausdruck | & | | | ^ |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
& und | verhalten sich wie ihre logischen Äquivalente, ^ / XOr liefert genau dann 1, falls die beiden Bits verschieden sind. Eine Integer-Zahl > 0, bei welcher nur das n-te Bit gesetzt ist, ist gleich 2^(n - 1), so daß die Folge der gesetzten Bits den Zahlen 1, 2, 4, 8 ... entspricht. Für die Verwendung von Bitwerten empfielt es sich, sämtliche Zahlen in Zweierpotenzen zu zerlegen. Für Ausdrücke in Ausgabespalten ergeben sich hieraus bsp. die folgenden Werte:
Ausdruck | Wert |
---|---|
1 | 2 | 3 |
1 & 2 | 0 |
1 ^ 2 | 3 |
5 | 9 | 13 |
5 & 9 | 1 |
5 ^ 9 | 12 |
1363 | 8633 | 9723 |
1363 & 8633 | 273 |
1363 ^ 8633 | 9450 |
Innerhalb von server-daten können Bitvergleiche einerseits direkt für alle Integer-Spalten genutzt werden, andererseits steht mit dem bitSet-Datentyp, der intern als Integer implementiert ist, eine codierte Nutzungsmöglichkeit zur Verfügung. Wird dieser Datentyp in der Where-Klausel einer benutzerdefinierten Abfragen verwendet, so müssen die Bitoperatoren genutzt werden, da der Gleichheitsoperator hier fehlerhaft sein kann. Enthält eine Bittabelle die Werte 1, 2, 4 und 8, so sind die Werte 0 - 15 (= 1+2+4+8) interpretierbare Werte in einer Detailspalte 'myBit' mit Relation auf diese Bittabelle. Die folgende Tabelle verdeutlicht, wie in einem Where-Abschnitt eine solche Spalte verwendet werden kann.
Where-Bedingung | Erläuterung |
---|---|
(myBit & 10) = 10 | prüft, ob in myBit sowohl 2 als auch 8 gesetzt ist |
(myBit & 10) <> 0 | prüft, ob in myBit 2 oder 8 (oder beide) gesetzt ist |
(myBit & 10) = 0 | prüft, ob in myBit weder 2 noch 8 gesetzt ist |
Sind einer oder beide Ausdrücke Null, so ist das Ergebnis davon abhängig, ob das DBMS das Standard-SQL-92-Verhalten implementiert. Wird dieser Standard berücksichtigt, dann wird jeder Vergleich mit mindestens einem Null-Ausdruck zu Null ausgewertet, auch die Verneinung von Null oder der Vergleich 'Null = Null' ergibt Null. Das SQL-92-Verhalten wird innerhalb des MS-SqlServers mittels der Set ANSI_NULLS on|off-Option an- bzw. ausgeschaltet. Bei ausgeschalteter Option ((@@options & 32) = 0) wird 'Null = Null' oder 'Null != 1' zu True ausgewertet. Innerhalb von server-daten ist diese Option immer gesetzt, die ausgeschaltete Option wird hier nicht weiter diskutiert.
= | Gleichheit |
< | kleiner als |
> | größer als |
<= | kleiner oder gleich |
>= | größer oder gleich |
<> | verschieden |
!= | nicht gleich * |
!< | nicht kleiner * |
!> | nicht größer * |
Die drei mit '*' markierten Operatoren gehören nicht zum Sql-92-Standard.
Between | <erster Ausdruck> Between <zweiter Ausdruck> And <dritter Ausdruck> prüft, ob der erste Ausdruck zwischen dem zweiten und dem dritten Ausdruck liegt
5 Between 3 And 7 ergibt True
|
In | <erster Ausdruck> In (<kommagetrennte Liste von Ausdrücken> | <Unterabfrage>) prüft, ob der erste Ausdruck gleich einem der Werte in der Aufzählung oder gleich einem der von der Unterabfrage zurückgelieferten Werte ist
5 In (3, 5, 7) ergibt True
|
Like | <erster Zeichenfolgen-Ausdruck> Like <zweiter Zeichenfolgen-Ausdruck> prüft, ob der erste Ausdruck dem Muster des zweiten Ausdrucks entspricht. Dieses kann Platzhalter (%, _) und Gruppenzeichen ([, ]) enthalten.
|
Exists | Exists (<Unterabfrage>) liefert True zurück, falls die Unterabfrage mindestens einen Wert zurückliefert. Die Unterabfrage wird hierbei mit einer impliziten Top 1 - Klausel ausgeführt und beendet, sobald eine Zeile gefunden wurde. Für positive Prüfungen ist dies erheblich schneller als bsp. ein Count(*) > 0 - Vergleich.
|
All | [Any | Some] | <erster Ausdruck> <Standard-Vergleichsoperator> All|[Any|Some] (<Unterabfrage>) Der erste Ausdruck wird bezüglich des Standard-Vergleichsoperators auf jeden Wert geprüft, der von der Unterabfrage zurückgegeben wird. Wird 'All' verwendet, so muß die Prüfung für alle Werte aus der Unterabfrage erfolgreich sein. Wird 'Any' (Synonym: Some) verwendet, so ist die Prüfung dann erfolgreich, falls eine Einzelprüfung positiv ist. |
In allen Fällen, in welchen eine Unterabfrage verwendet werden kann, muß diese eine Spalte zurückliefern.
Select (0 = 0) As WahrTest, (0 = 1) As FalschTest [From Tabelle]
Select 1 Where True
Update Tabelle Set Ergebniszelle = (@Notendurchschnitt < Klausurergebnis)
In VB.NET oder anderen Programmiersprachen sind die analogen Anweisungen problemlos verwendbar:
i_ersterWert = 5
i_zweiterWert = 3
bool_Variable = (i_ersterWert < i_zweiterWert) 'bool_Variable hat nun den Wert <False>
Es können jedoch verschiedene bzw. verschieden viele Werte in Abhängigkeit von einer Where-Bedingung zurückgegeben werden:
Select 1 Where (0 = 1) | gibt keine Zeile zurück |
Select 1 Where (0 = 0) | gibt genau eine Zelle mit dem Wert 1 zurück |
Select * From <Tabelle> Where Exists (Select 1 Where @Var1 = @Var2) | ist die Bedingung erfüllt, so gibt die Unterabfrage eine Zeile zurück, 'Exists' liefert True, also werden alle Zeilen von <Tabelle> zurückgegeben |
Select Case When (@Var1 = @Var2) Then 1 Else 0 End | gibt immer eine Zelle zurück, der Wert ist 1 oder 0 |
Zum anderen werden Ausdrücke mit Null immer zu Null ausgewertet. Dies gilt auch für die Negation mit 'Not'. Zeilen, welche in einer Where-Bedingung zu Null ausgewertet werden, fehlen im Ergebnis. Damit kennt die Logik drei Werte - True, False und Null. Für die Auswertung einer ganzen Tabelle genügt es deshalb nicht, einen Operator und dessen Verneinung zu nutzen, sondern es müssen zusätzlich die Werte behandelt werden, welche mit 'Is Null' True erzeugen. Man betrachte eine einspaltige Tabelle mit drei Zeilen und Werten 3, 5 und Null ({3, 5, Null}). Dann gilt:
Code | Ergebnis |
---|---|
Select Eintrag From Tabelle Where Eintrag = 3 | {3} |
Select Eintrag From Tabelle Where Not (Eintrag = 3) | {5} |
Select Eintrag From Tabelle Where Eintrag != 3 | {5} |
Select Eintrag From Tabelle Where Not (Eintrag != 3) | {3} |
Select Eintrag From Tabelle Where Not (Eintrag <> 3) | {3} |
Select Eintrag From Tabelle Where Eintrag Is Null | {Null} |
Select Eintrag From Tabelle Where Eintrag Is Null | {3, 5, Null} |
erster Boolean-Ausdruck | zweiter Boolean-Ausdruck | And | Or |
---|---|---|---|
True | True | True | True |
True | False | False | True |
False | True | False | True |
False | False | False | False |
'And' liefert immer False, außer falls beide Einzelausdrücke wahr sind. 'Or' gibt immer True zurück, falls nicht beide Ausdrücke falsch sind. Für 'Or' kann damit auch ein boolscher Einzelausdruck zu Null ausgewertet werden. So gibt die folgende Anweisung 1 zurück:
Select 1 Where (Null = 1) Or (2 = 2)
5 % 2 * 3 = (5 % 2) * 3 = 1 * 3 = 3
5 & 1 + 1 = (5 & 1) + 1 = 1 + 1 = 2
8 ^ 4 | 15 = (8 ^ 4) | 15 = 12 | 15 = 15
Eine explizite Rechtsklammerung erzeugt dagegen für jede Zeile andere Ergebnisse:
5 % (2 * 3) = 5 % 6 = 5
5 & (1 + 1) = 5 & 2 = 0
8 ^ (4 | 15) = 8 ^ 15 = 7
Es wird empfohlen, großzügig Klammern zu setzen, um spätere Fehlinterpretationen bei der Überarbeitung von Code zu vermeiden.