本次试题设计两个表:student、exam

           student表

          exam表

 

一、写一条SQL语句,按学号排序输出数学成绩

SELECT s.sno sno,score
FROM exam e,student s
WHERE e.`subject` = '数学' AND e.name = s.name
GROUP BY s.sno

 

二、写一条SQL语句,按学号排序,输出:学号,姓名,总分,平均分

SELECT sno,s.`name`,SUM(score) ss,AVG(score) gg
FROM exam e,student s
WHERE e.`name` = s.`name`
GROUP BY `name`
ORDER BY ss

 

三、写一条SQL语句,查询出数学考试成绩最高的学生学号和姓名

SELECT sno,exam.name name,score
FROM exam,student
WHERE (exam.`subject` = '数学') AND (exam.name = student.name)
ORDER BY exam.score DESC
LIMIT 0,1;

 

四、写一条SQL语句,查询出每门课都大于80分的学生姓名

方法一:ALL()函数

思路:查找出每个人所有科目是否都大于80

SELECT DISTINCT NAME 
FROM exam a
WHERE 80 < ALL(SELECT score 
               FROM exam e
               WHERE e.name = a.name );

 

方法二:not exists 字段

思路:排除掉存在学科分数低于80的学生,剩下的就是所有学科分数都大于80的学生

SELECT DISTINCT NAME
FROM exam a
WHERE NOT EXISTS (SELECT name
                  FROM exam e 
                  WHERE e.name = a.name AND e.score < 80 );

 

方法三:not in 字段

思路:同上

SELECT DISTINCT NAME 
FROM exam 
WHERE NAME NOT IN (SELECT  NAME 
                   FROM exam
                   WHERE score<=80)

 

方法四:having 字段

思路:过滤出学科中最低分数大于80的学生

SELECT name
FROM exam
GROUP BY name
HAVING min(score) > 80

 

五、张三退学后,请写相关的SQL语句,注意严谨

DELETE
FROM exam
WHERE name = '张三';
DELETE
FROM student
WHERE name = '张三';

 

DELETE exam,student
FROM exam
LEFT JOIN student
ON exam.name = student.name
WHERE exam.name = '张三' ;

 

六、你会对该表哪些字段做索引

id - 唯一索引

七、这两个表的设计,有哪些可以改进的地方

student表中sno字段可以改成‘studentID’,更语义化,

exam表中取消name字段及该列数据,改用student中sno学号字段代替,更易于检索

posted on 2018-11-08 19:03  tt-wedos  阅读(255)  评论(0编辑  收藏  举报