MySQL ORDER BY 语句失效

问题描述:

表和字段:
-- 1.学生表
-- Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
-- 2.课程表
-- Course(C,Cname,T) --C --课程编号,Cname 课程名称,T 教师编号
-- 3.教师表
-- Teacher(T,Tname) --T 教师编号,Tname 教师姓名
-- 4.成绩表
-- SC(S,C,score) --S 学生编号,C 课程编号,score 分数

按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

代码:
SELECT  a.`S`,a.`Sname`,
IFNULL(MAX(CASE c.Cname WHEN '语文' THEN b.score ELSE 0 END),0) '语文',
IFNULL(MAX(CASE c.Cname WHEN '数学' THEN b.score ELSE 0 END),0)'数学',
IFNULL(MAX(CASE c.Cname WHEN '英语' THEN b.score ELSE 0 END),0) '英语',
IFNULL(CAST(AVG(b.score) AS DECIMAL(18,2)),0) '平均分'
FROM student a 
LEFT JOIN sc b
ON a.`S` = b.`S`
LEFT JOIN course c
ON b.`C` = c.`C`
GROUP BY a.`S`,a.`Sname`
ORDER BY '平均分'  ;

运行结果

img

怎么使结果排序


SELECT  a.`S`,a.`Sname`,
IFNULL(MAX(CASE c.Cname WHEN '语文' THEN b.score ELSE 0 END),0) '语文',
IFNULL(MAX(CASE c.Cname WHEN '数学' THEN b.score ELSE 0 END),0)'数学',
IFNULL(MAX(CASE c.Cname WHEN '英语' THEN b.score ELSE 0 END),0) '英语',
IFNULL(CAST(AVG(b.score) AS DECIMAL(18,2)),0) '平均分'
FROM student a 
LEFT JOIN sc b
ON a.`S` = b.`S`
LEFT JOIN course c
ON b.`C` = c.`C`
GROUP BY a.`S`,a.`Sname`
ORDER BY IFNULL(CAST(AVG(b.score) AS DECIMAL(18,2)),0) DESC ;

你确定能order by ‘平均分’?

符号用错了,你标成了单引号,单引号表示字符串

SELECT  a.`S`,a.`Sname`,
IFNULL(MAX(CASE c.Cname WHEN `语文` THEN b.score ELSE 0 END),0) `语文`,
IFNULL(MAX(CASE c.Cname WHEN `数学` THEN b.score ELSE 0 END),0) `数学`,
IFNULL(MAX(CASE c.Cname WHEN `英语` THEN b.score ELSE 0 END),0) `英语`,
IFNULL(CAST(AVG(b.score) AS DECIMAL(18,2)),0) `平均分`
FROM student a 
LEFT JOIN sc b
ON a.`S` = b.`S`
LEFT JOIN course c
ON b.`C` = c.`C`
GROUP BY a.`S`,a.`Sname`
ORDER BY `平均分`  ;

不能用别名
你可以order by 后面跟一个表达式
这个表达式可以是你所要的平均分