where(这个值是计算出来的)
子查询本质:在where语句中嵌套一个子查询语句
-- ==========where========
-- 查询科目为高等数学-2的分数不小于80分的学生的学号和姓名
-- 方式一:使用联表查询
SELECT s.`studentno`,`studentname`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE `SubjectName`='高等数学-2' AND `studentresult`>80
ORDER BY `studentresult` DESC
-- 方式二:子查询
SELECT s.`studentno`,`studentname`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
WHERE `studentresult`>80 AND `subjectno` = (
SELECT `subjectno` FROM `subject`
WHERE `SubjectName`='高等数学-2'
) ORDER BY `studentresult` DESC
-- 方式三 嵌套 查询少部分符合条件的同学 可以用 in (有里及外)
SELECT `studentno`,`studentname` FROM `student` WHERE `studentno` IN (
SELECT `studentno` FROM `result` WHERE `studentresult`>80 AND `subjectno` = (
SELECT `subjectno` FROM `subject` WHERE `SubjectName` = '高等数学-2'
)
)
练习:
-- 查询C语言-1 前5名同学的成绩的信息(学号、姓名、分数)
-- 方法一:联表查询
SELECT s.`studentno`,`studentname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE `SubjectName` = 'C语言-1'
ORDER BY `studentresult` DESC
LIMIT 0,5
-- 方法二:子查询
SELECT s.`studentno`,`studentname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
WHERE `subjectno` = (
SELECT `subjectno` FROM `subject` WHERE `SubjectName` = 'C语言-1'
)
ORDER BY `studentresult` DESC
LIMIT 0,5
-- 方法三:嵌套(此方法显示不出学生的成绩,所以排序不了)
SELECT `studentno`,`studentname` FROM `student` WHERE `studentno` IN (
SELECT `studentno` FROM `result` WHERE `SubjectNo` =(
SELECT `SubjectNo` FROM `subject` WHERE `SubjectName` = 'C语言-1'
)
)