-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列 -- 方法一:使用联结查询 SELECT `studentno`,r.`subjectno`,`studentresult`,`subjectname` FROM `subject` AS sub INNER JOIN `result` AS r ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1' ORDER BY `studentresult` DESC;
-- 方法二:使用子查询(执行顺序:由里及外) SELECT `studentno`,r.`subjectno`,`studentresult` FROM `result` AS r WHERE r.`subjectno` = ( -- 这里的=最好换成IN SELECT `subjectno` FROM `subject` AS sub WHERE sub.`subjectname` = '数据库结构-1' ) ORDER BY `studentresult` DESC;
-- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名 -- 方法一:使用连接查询 SELECT s.studentno,studentname FROM student s INNER JOIN result r ON s.`StudentNo` = r.`StudentNo` INNER JOIN `subject` sub ON sub.`SubjectNo` = r.`SubjectNo` WHERE subjectname = '高等数学-2' AND StudentResult>=80
-- 方法二:使用连接查询+子查询 -- 分数不小于80分的学生的学号和姓名 SELECT r.studentno,studentname FROM student s INNER JOIN result r ON s.`StudentNo`=r.`StudentNo` WHERE StudentResult>=80
-- 在上面SQL基础上,添加需求:课程为 高等数学-2 SELECT r.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' )
-- 方法三:使用子查询 -- 分步写简单sql语句,然后将其嵌套起来 SELECT studentno,studentname FROM student WHERE studentno IN( SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=( SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2' ) ) -- 子查询效率较低
SELECT COUNT(`studentname`) FROM `student`; -- count(column)会忽略所有的null值 SELECT COUNT(*) FROM `student`; -- count(*)不会忽略null SELECT COUNT(1) FROM `student`; -- count(1)不会忽略null
SELECT SUM(`studentresult`) AS 总分 FROM `result`; SELECT AVG(`studentresult`) AS 平均分 FROM `result`; SELECT MAX(`studentresult`) AS 最高分 FROM `result`; SELECT MIN(`studentresult`) AS 最低分 FROM `result`;
分组与过滤:
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 分组之前,只能查出一条数据,所有分数不分具体科目 SELECT any_value(`subjectname`) 科目,AVG(`studentresult`) 平均分, MAX(`studentresult`) 最高分,MIN(`studentresult`) 最低分 FROM result r INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno`; -- 分组之后,能够按科目查询对应分数 SELECT `subjectname` 科目,AVG(`studentresult`) 平均分, MAX(`studentresult`) 最高分,MIN(`studentresult`) 最低分 FROM result r INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` GROUP BY r.`subjectno`;