MySQL的DQL数据查询语言--联表查询、子查询、嵌套查询综合详解

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'	
)
)

猜你喜欢

转载自blog.csdn.net/l1341886243/article/details/118582260