写一个查询,显示所有科目成绩超过50分的学生的姓名,按学生姓名升序排列。enter image description here
我已经使用了下面的查询,但没有得到想要的结果,因为它没有通过将student_id分组为整体来比较结果。任何人都可以在查询中提出任何更改。
select distinct student_name from student s join mark m on
s.student_id = m.student_id join subject sb
on m.subject_id = sb.subject_id
where m.value IN
(select value from mark m1 join student s1
on m1.student_id = s1.student_id join subject sb1
on m1.subject_id = sb1.subject_id
where value > 50 group by s1.student_id,m1.value, sb1.subject_id)
order by 1;
9条答案
按热度按时间fsi0uk1n1#
如果可能,应避免使用子查询。因此,如果检查一个学生的最低分数是否大于50,我们可以说他在所有科目中都取得了50分以上。
y53ybaqx2#
我不认为你需要这么复杂的子查询。您所需要做的就是找出学生的最低分数(INNER JOIN确保只考虑学生尝试过的科目)。
在student和student_id上的marks表之间执行简单的JOIN操作。我们在
student_id
上执行GROUP BY,并为每个学生获得minimum_marks
。如果minimum_marks
> 50,则意味着学生在所有科目中得分> 50。试试下面的方法,在MySQL中也可以(根据OP的Original标签):编辑根据Oracle(因为OP是后来编辑的),
HAVING
子句中的aliased fields/expressions are not allowed。修改后的查询如下所示:aiqt4smr3#
因为它是简单的通过制作子查询如上所示。
1.提取大于50的最小值并创建一个表,然后从student表中比较。
2.不使用任何Join操作
huus2vyu4#
jvlzgdj95#
v2g6jxz66#
q5lcpyga7#
yyyllmsg8#
e7arh2l69#
SELECT s.student_name FROM student s WHERE s.student_id NOT IN(SELECT m.student_id FROM mark m where m.student_id = s.student_id and m.value <= 50)ORDER BY s.student_name ASC;