如何在mysql中使用聚合函数为变量赋值?

如何在mysql中使用聚合函数为变量赋值?,mysql,sql,variables,where,Mysql,Sql,Variables,Where,这是我的表结构和数据 create table StudentInformation ( sId INT(5), name VARCHAR(50), sClass VARCHAR(10), maths INT(5), physics INT(5), chemistry INT(5) ); INSERT INTO StudentInformation values (1, 'Jai', '11th', 60, 75, 65), (2, 'Leela

这是我的表结构和数据

create table StudentInformation
(
    sId INT(5),
    name VARCHAR(50),
    sClass VARCHAR(10),
    maths INT(5),
    physics INT(5),
    chemistry INT(5)
);

INSERT INTO StudentInformation
values
(1, 'Jai', '11th', 60, 75, 65),
(2, 'Leela', '12th', 91, 87, 94),
(3, 'Suresh', '11th', 75, 68, 70),
(4, 'Ramesh', '11th', 50, 67, 55),
(5, 'Janki', '12th', 78, 89, 78),
(6, 'Lalu', '12th', 30, 38, 45),
(7, 'Amit', '11th', 91, 95, 93),
(8, 'Komal', '11th', 66, 78, 74),
(9, 'Sanjay', '12th', 25, 40, 35);
现在我想计算每个班级的平均分数。
我尝试了以下查询:

SELECT
sClass class,
@var := sum(maths+physics+chemistry)/(count(sid)*3) as avgMarksPerSubject,
@var as variableValue,
count(sid) as numberOfStudents
FROM StudentInformation
#where @var > 65
group by sClass;
这里必须使用变量,因为这只是我实际任务的一个示例。
现在我想要那些超过65分的记录。
是否可以在
WHERE
子句中使用变量?
我没有在
@var
中获得实际数据,如何在
WHERE
子句中使用它?
您可以尝试sql查询。
有什么建议吗?
感谢在
中使用用户定义的会话变量,其中
子句只有在预先初始化时才可能使用。除非另有说明,否则由于,变量将具有默认值
NULL
,并且条件可能不满足预期的结果

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 |
+-------+--------------------+---------------+------------------+

示例@:

有一个名为@var的变量将与所有行共享,因此第一行的值将被后续行的值覆盖。此外,您的WHERE子句将在执行聚合函数之前出现(将其更改为AVGMarkPersubject>65)。这意味着在这种情况下我不能使用变量,对吗?不,您不能。它们可用于将值从一行传递到下一行,并分配给SELECT中的字段,但每次分配给变量时,变量本身都会被重写。在这里使用变量来获得想要的结果是完全没有必要的。在我的实际任务中,我必须连接20多个表,为每一行计算一些参数,并进一步将其用于除法和乘法。所以我想避免重复使用这些参数,不要认为你能用变量来实现。可能需要对子查询执行联接,子查询计算每组行的参数。我很感谢您的建议,但在删除where子句后,我为每个类获得了相同的值-@var或(variableValue)。看看这个-是的。请通读建议的内容。早期的结果是因为
其中存在
而首先执行的。请查看不同的查询行为。你能解释一下吗?不确定会话变量
@var
的优先级。听起来像是最近计算的行的进位,但不是列表达式。请参阅执行的最后一个查询@这就是我想知道的。我无法将每行的值存储在
@var
中。
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 |
+-------+--------------------+---------------+------------------+