我有2张桌子,学生和成绩 学生表包含id,name和date_of_birth 成绩表包含id,student_id,成绩和课程 实际表包含更多数据。
我有一个像
这样的查询SELECT s.*, AVG(g.grade) as average_grade
FROM student s LEFT JOIN grade g ON s,id = g.student_id
WHERE g.course = 'mathematics' and s.id = 1
有了这个,我可以得到我需要的数据,即学生详细信息和平均成绩,然后出现问题,当在成绩表中找不到course = "mathematics"
时,查询将返回NULL。我的问题是,有没有办法让我将s.id = 1
详细信息与NULL平均值一起取代所有NULL值?
我更喜欢它能够用1个查询来完成它,因为在我当前我使用子查询并且获取数据需要很长时间。我的主要目标是,如果您有更好的方式,而不是使用1个查询,请随意评论您的想法,以获得更快的速度。另外我尝试了多个查询和子查询来获取所有数据,但这一切都需要很长时间。
答案 0 :(得分:0)
在加入部分
中移动g.course = 'mathematics'
的过滤条件
SELECT s.*, AVG(g.grade) as average_grade
FROM student s
LEFT JOIN grade g ON s.id = g.student_id AND g.course = 'mathematics'
WHERE s.id = 1
您的查询生成结果为内部联接未离开,因为将g.course = 'mathematics
放在where子句中将左连接转换为内连接,在on
子句中移动此部分仍将从student
返回数据如果grade
表中没有找到course = 'mathematics'
答案 1 :(得分:0)
如果课程不是“数学”,如果你这样说,你仍然可以得到学生数据。
SELECT s.*, AVG(g.grade) as average_grade
FROM student s LEFT JOIN grade g ON s,id = g.student_id
WHERE (g.course = 'mathematics' AND s.id = 1) OR s.id = 1