Usando uma sessão definida pelo usuário variável em
where
cláusula só é possível quando é pré inicializada . A menos que de outra forma, devido ao SQL- Consulta-Ordem de Operações
, a variável terá um padrão NULL
e a condição pode não satisfazer os resultados esperados. 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 |
+-------+--------------------+---------------+------------------+
Aqui você pode ver claramente que a variável não recebe nenhum valor por linha e a partir do valor calculado na expressão de coluna anterior.
Você pode ver seus efeitos colaterais executando a seguinte consulta:
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 |
+-------+--------------------+---------------+------------------+
Exemplo @ SQL Fiddle :