Aufrufausdrücke in Operatorausdrücken in SQL (MySQL )
Operanden dürfen auch Aufrufe sein.
Ein Aufruf einer Funktion, der den Typ »double« hat darf überall dort verwendet werden, wo wir bisher auch ein double-Literal oder einen double-Operatorausdruck mit dem Typ »double« verwendet haben. Der Aufrufausdruck steht dabei für seinen Wert, also den Rückgabewert der aufgerufenen Funktion.
Wir haben bisher schon Literale als Ausdrücke kennengelernt.
Konsole
SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
Wir haben schon Ausdruckklammern als Operatoren kennengelernt.
Konsole
SELECT ( 1 );
+---+
| 1 |
+---+
| 1 |
+---+
Zuletzt hatten wir Funktionsaufrufe als Ausdrücke kennengelernt.
Konsole
SELECT RAND();
+---------------------+
| RAND() |
+---------------------+
| 0.47321682094895917 |
+---------------------+
Das folgende Beispiel zeigt nun, daß Aufrufe auch als Operanden von Operatoren verwendet werden können. Im folgenden Beispiel ist der Aufruf »RAND()« Operand des Klammeroperators.
Konsole
SELECT ( RAND() );
+--------------------+
| ( RAND() ) |
+--------------------+
| 0.5588298240293095 |
+--------------------+
Wir hatten zuvor schon gesehen, daß Literale und andere Operatorausdrücke Operanden sein können. Überall, wo ein Literal stehen kann, kann stattdessen auch ein Aufruf mit demselben Datentyp, wie ihn das Literal hat, stehen. Daher können auch Aufrufe als Operanden verwendet werden. Allgemein sind als Operanden alle Ausdrücke mit einem passenden Datentyp zulässig.
Das folgende Beispiel zeigt eine doppelte Anwendung des Klammeroperators auf einen Aufruf (die hier keine tieferen Sinn hat, sondern nur als ein weiteres Beispiel dienen soll).
Konsole
SELECT ( ( RAND() ));
+--------------------+
| ( ( RAND() )) |
+--------------------+
| 0.7939846280906206 |
+--------------------+
Das folgende Beispiel zeigt eine Division mit zwei Operanden: der erste Operand ist ein Funktionsaufruf, der zweite ein Numerale.
Konsole
SELECT RAND() / 10.0;
+----------------------+
| RAND() / 10.0 |
+----------------------+
| 0.029343369909881963 |
+----------------------+
Das folgende Beispiel zeigt eine Summe mit zwei Operanden: der erste Operand ist ein Funktionsaufruf, der zweite ein Numerale.
Konsole
SELECT RAND() + 10.0;
+--------------------+
| RAND() + 10.0 |
+--------------------+
| 10.085214641955881 |
+--------------------+
Das folgende Beispiel zeigt eine Produkt mit zwei Operanden: der erste Operand ist ein Numerale, der zweite ein Funktionsaufruf.
Konsole
SELECT 100 * RAND();
+-------------------+
| 100 * RAND() |
+-------------------+
| 54.57721432165915 |
+-------------------+
Prioritäten
In der folgenden Liste führen wir den Aufrufoperator zur Übersicht mit auf, obwohl es sich bei den einem Funktionsnamen nachgestellen Klammmern nicht um einen Operator handelt, da ein Funktionsname selber kein Ausdruck (und daher kein Operand) ist.
- Priorität und Assoziativität der bisher behandelten Operatoren
() Eingeklammerter Ausdruck
() Aufrufoperator
+ - Unaere vorangestellte Operatoren
* / Multiplikation, Division
+ - Addition, Subtraktion
Übungsfragen
? Typen und Wertebereiche
In welchem Bereich liegt der Wert des Ausdrucks »( ( RAND() ))«?
In welchem Bereich liegt der Wert des Ausdrucks »RAND() + 10«?
In welchem Bereich liegt der Wert des Ausdrucks »10 * RAND()«?
In welchem Bereich liegt der Wert des Ausdrucks »10 * RAND() + 10«?
Welchen Typ hat der Ausdruck »( ( RAND() ))«? *
Welchen Typ hat der Ausdruck »RAND() + 10«? (Dies wurde im Kurs bisher eventuell nicht richtig erklärt, dann muß man hier raten!) *
Übungsaufgaben
Würfeln
Schreiben Sie eine SELECT-Abfrage, welche bei jeder Ausführung eine der Zahlen 1, 2, 3, 4, 5 oder 6 liefert, die dabei alle mit gleicher Wahrscheinlichkeit möglich sein sollen. (Es ist ausreichend, wenn dabei Zahlen mit Nachkommastellen ausgegeben werden, deren Vorkommastelle mit gleicher Wahrscheinlichkeit eine der Zahlen 1, 2, 3, 4, 5 oder 6 ist. Es wird nicht verlangt, die Nachkommastellen abzuschneiden.)