Verwenden einer benutzerdefinierten Sitzung Variable in where
-Klausel ist nur möglich, wenn sie vorab initialisiert ist . Sofern nicht anders, aufgrund der SQL- Abfrage-Order-of-Operations
, hat die Variable standardmäßig den Wert NULL
und die Bedingung erfüllt möglicherweise nicht die erwarteten Ergebnisse.
set @var:=0;
SELECT
sClass class,
@var := cast(sum(maths+physics+chemistry)
/(count(sid)*3) as decimal(6,2)
) as avgMarksPerSubject,
@var as variableValue,
count(sid) as numberOfStudents
FROM StudentInformation
where @var < 65
group by sClass
;
+-------+--------------------+---------------+------------------+
| CLASS | AVGMARKSPERSUBJECT | VARIABLEVALUE | NUMBEROFSTUDENTS |
+-------+--------------------+---------------+------------------+
| 11th | 72.13 | 0 | 5 |
| 12th | 60.83 | 0 | 4 |
+-------+--------------------+---------------+------------------+
Hier sieht man deutlich, dass der Variable kein Wert pro Zeile und aus dem im vorherigen Spaltenausdruck berechneten Wert zugewiesen wird.
Sie können seine Nebenwirkungen sehen, indem Sie die folgende Abfrage ausführen:
select * from (
SELECT
sClass class,
@var := cast(sum(maths+physics+chemistry)
/(count(sid)*3) as decimal(6,2)
) as avgMarksPerSubject,
@var as variableValue,
count(sid) as numberOfStudents
FROM StudentInformation
group by sClass
) r where avgMarksPerSubject > 65
+-------+--------------------+---------------+------------------+
| CLASS | AVGMARKSPERSUBJECT | VARIABLEVALUE | NUMBEROFSTUDENTS |
+-------+--------------------+---------------+------------------+
| 11th | 72.13 | 60.83 | 5 |
+-------+--------------------+---------------+------------------+
Beispiel @ SQL Fiddle :