• 数据库面试题+解析


    以下是四张表,1.学生表-t_student,2.教师表-t_teacher,3.课程表-t_course, 4.成绩表-t_score

    下面是表设计:

    1. -- 1.学生表-t_student
    2. -- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
    3. create table t_student(
    4. sid varchar(10) primary key comment '学生编号',
    5. sname varchar(20) not null comment '学生姓名',
    6. sage varchar(10) not null comment '学生年龄',
    7. sex varchar(20) not null comment '学生性别'
    8. )comment '学生信息表';
    9. -- 2.教师表-t_teacher
    10. -- tid 教师编号,tname 教师名称
    11. create table t_teacher(
    12. tid varchar(10) primary key comment '教师编号',
    13. tname varchar(20) not null comment '教师名称'
    14. )comment '教师信息表';
    15. -- 3.课程表-t_course
    16. -- cid 课程编号,cname 课程名称,tid 教师名称
    17. create table t_course(
    18. cid varchar(10) primary key comment '课程编号',
    19. cname varchar(20) not null comment '课程名称',
    20. tid varchar(10) not null comment '教师名称',
    21. foreign key(tid) references t_teacher(tid)
    22. )comment '课程信息表';
    23. -- 4.成绩表-t_score
    24. -- sid 学生编号,cid 课程编号,score 成绩
    25. create table t_score(
    26. sid varchar(10) not null comment '学生编号',
    27. cid varchar(10) not null comment '课程编号',
    28. score float default 0 comment '成绩',
    29. foreign key(sid) references t_student(sid),
    30. foreign key(cid) references t_course(cid)
    31. )comment '成绩信息表';
    32. select * from t_student;
    33. select * from t_teacher;
    34. select * from t_course;
    35. select * from t_score;

    下面是面试题+解题结果(解题的方式不是只有这一种,我写的而只是其中之一)

    #01)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

    1. select s.*,temp.s1,temp.s2 from(
    2. select t1.sid,t1.s1,t2.s2 from
    3. (select sid,score as s1 from t_score where cid='01')t1,
    4. (select sid,score as s2 from t_score where cid='02')t2
    5. where t1.sid=t2.sid and t1.s1>t2.s2)temp,t_student s
    6. where temp.sid=s.sid

    #02)查询同时存在" 01 "课程和" 02 "课程的情况

    1. select* from
    2. (select sid,score as s1 from t_score where cid='01') t1,
    3. (select sid,score as s2 from t_score where cid='02') t2
    4. where t1.sid=t2.sid;

    #03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

    1. select * from
    2. (select sid,score from t_score where cid='01')t1 left join
    3. (select sid,score from t_score where cid='02')t2 on t1.sid=t2.sid

    #04)查询不存在" 01 "课程但存在" 02 "课程的情况

    1. select * from t_score where sid not in (
    2. select sid from t_score where cid='01') and cid='02';
    3. select * from t_score where sid='07';

    #05)查询平均成绩(分组 group by,筛选:having avg)大于等于 60 分的同学的学生编号和学生姓名和平均成绩

    1. select s.sid,s.sname,
    2. round(avg(sc.score),2) score
    3. from
    4. t_student s,t_score sc
    5. where s.sid=sc.sid
    6. group by s.sid,s.sname
    7. having avg(sc.score)>=60;

    #06)查询在t_score表存在成绩的学生信息

    1. select distinct s.*
    2. from
    3. t_score sc,t_student s where sc.sid=s.sid

    #07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

    1. select s.sid,s.sname, count(sc.cid) cn,
    2. sum(sc.cid) sm
    3. from
    4. t_student s left join t_score sc on sc.sid=s.sid
    5. group by s.sid,s.sname

    #08)查询「李」姓老师的数量

    select count(tid) from t_teacher where tname like '李%';
    

    #09)查询学过「张三」老师授课的同学的信息

    1. select
    2. s.*
    3. from t_teacher t,
    4. t_course c,
    5. t_score sc,
    6. t_student s
    7. where
    8. t.tid=c.tid and
    9. c.cid=sc.cid and
    10. sc.sid=s.sid and t.tname='张三'

    #10)查询没有学全所有课程的同学的信息

    1. select * from t_student where sid not in (
    2. select sid from t_score
    3. group by sid having count(cid)=(select count(cid) from t_course))

    #11)查询没学过"张三"老师讲授的任一门课程的学生姓名

    1. select * from t_student where sid not in(
    2. select sc.sid from t_teacher t,t_course c,t_score sc where
    3. t.tid=c.tid and t.tname='张三' and
    4. c.cid=sc.cid)

    #12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    1. select
    2. s.sid,
    3. s.sname,
    4. round(avg(sc.score),2) sc
    5. from t_score sc,t_student s
    6. where sc.sid=s.sid and sc.score<60
    7. group by s.sid,s.sname
    8. having count(sc.cid)>1

    #13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息

    1. select *
    2. from t_student a,
    3. t_score b
    4. where a.sid = b.sid
    5. and b.cid = '01'
    6. and score < 60
    7. order by score desc;

    #14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    1. select sc.sid,
    2. round(avg(sc.score),2) as '平均成绩',
    3. sum(if(sc.cid='01',sc.score,0)) as '语文',
    4. sum(if(sc.cid='02',sc.score,0)) as '数学',
    5. sum(if(sc.cid='03',sc.score,0)) as '英语'
    6. from
    7. t_score sc
    8. group by sc.sid,sc.cid
    9. order by avg(sc.score) desc

    #15)查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

    1. select
    2. c.cid,
    3. c.cname,
    4. count(c.cid) as '选修人数',
    5. max(sc.score) as '最高分',
    6. min(sc.score) as '最低分',
    7. round(avg(sc.score),2) as '平均分',
    8. concat(round(sum(if(sc.score>=60,1,0))/count(s.sid)*100,2),'%') as '及格率',
    9. concat(round(sum(if(sc.score>=70 and sc.score<80,1,0))/count(s.sid)*100,2),'%') as '中等率',
    10. concat(round(sum(if(sc.score>=80 and sc.score<90,1,0))/count(s.sid)*100,2),'%') as '优良率',
    11. concat(round(sum(if(sc.score>=90,1,0))/count(s.sid)*100,2),'%') as '优秀率'
    12. from
    13. t_score sc,t_course c,t_student s
    14. where
    15. sc.cid=c.cid and sc.sid=s.sid
    16. group by c.cid,c.cname

    以上就是今天的分享,在面试官给你题目的时候,你面前是没与电脑的,你需要在脑海中构思你的表设计。这是面试的一大难题,需要足够的空间想象能力。good luck!☪☪☪

  • 相关阅读:
    Centos7系统重装报错“ /dev/root does not exist“解决办法
    线性代数 化简矩阵和零空间矩阵
    总结 HTTP 协议的基本格式和 fiddler 的用法
    Ubuntu下 NVIDIA Container Runtime 安装与使用
    关于页面渲染的一些优化方案分享(懒加载、虚拟列表)
    狂神redis笔记10
    如何使用 Docker Buildx Bake 创建复杂的镜像构建管道
    Linux常用命令——grep命令
    能够解决传统FTP传输弊端的替代工具是什么样的?
    用turtle库绘制图形(bytedesign)
  • 原文地址:https://blog.csdn.net/m0_62246061/article/details/125612329