SQL面试50题——学习记录(五)完结篇

第41题: 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩(题目有些歧义,暂定他要求查找出每门课程的成绩都一样的学生)

SELECT DISTINCT s1.s_id,s1.c_id,s1.s_score
FROM score s1
JOIN score s2
ON s1.s_id=s2.s_id AND s1.c_id !=s2.c_id AND s1.s_score=s2.s_score;

distinct 后跟多个字段代表着这多个字段的组合不相同

第42题:题目没了

第43题:统计每门课程的学生选修人数(超过5人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT c_id,COUNT(DISTINCT s_id) 选修人数 FROM score
GROUP BY c_id 
ORDER BY 选修人数 ASC,c_id DESC;

第44题:检索至少选修两门课程的学生学号

SELECT s_id,COUNT(DISTINCT c_id) 选修课程数
FROM score
GROUP BY s_id
HAVING 选修课程数>=2;

第45题:查询选修了全部课程的学生信息

SELECT s_id
FROM score 
GROUP BY s_id 
HAVING COUNT(DISTINCT c_id) =(SELECT COUNT(c_id) FROM course)

第46题:查询各学生的年龄

SELECT s_id 学号,s_birth 出生日期,FLOOR(DATEDIFF(NOW(),s_birth)/365) 年龄 FROM student;

第47题:查询没学过“张三”老师讲授的任一门课程的学生姓名

SELECT * FROM student WHERE s_id  NOT IN(
SELECT s.s_id FROM score s
JOIN course c ON s.`c_id`=c.`c_id`
JOIN teacher t ON c.`t_id`=t.`t_id`
WHERE t.`t_name`="张三"
)

第48题:查询下周过生日的同学

此题比较麻烦,我个人没有办法提供很严谨的做法,同时目前在网上找到的答案也同样不严谨,所以暂空

第49题:查询本月过生日的人

SELECT * FROM student 
WHERE MONTH(s_birth)=MONTH(NOW());

第50题:查询下一个月过生日的人

SELECT * FROM student
WHERE MONTH(s_birth)= MOD(MONTH(NOW())+1,12);

此题需要注意的是月份是循环的,12月过后是1月,而不是13月,所以使用mod 模12即可。

你可能感兴趣的:(SQL面试50题——学习记录(五)完结篇)