Sử dụng phiên do người dùng xác định biến trong where
mệnh đề chỉ có thể thực hiện được khi nó được khởi tạo trước . Trừ khi khác, do SQL- Truy vấn-Thứ tự-Hoạt động
, biến sẽ có NULL
mặc định và điều kiện có thể không đáp ứng kết quả như mong đợi.
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 |
+-------+--------------------+---------------+------------------+
Ở đây, bạn có thể thấy rõ rằng biến không được gán bất kỳ giá trị nào cho mỗi hàng và từ giá trị được tính trong biểu thức cột trước đó.
Bạn có thể thấy tác dụng phụ của nó bằng cách chạy truy vấn sau:
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 |
+-------+--------------------+---------------+------------------+
Ví dụ @ SQL Fiddle :