面经 - 数据库基础面试题

简介: 面经 - 数据库基础面试题

作为一枚Java后端开发者,数据库知识必不可少,对数据库的掌握熟悉度的考察也是对这个人是否有扎 实基本功的考察。特别对于初级开发者,面试可能不会去问框架相关知识,但是绝对不会不去考察数据 库知识,这里收集一些常见类型的SQL语句,无论对于平常开发还是准备面试,都会有助益。

基础表结构

student(sno,sname,sage,ssex) 学生表course(cno,cname,tno) 课程表sc(sno,cno,score) 成绩表teacher(tno,tname) 教师表

1、查询课程1的成绩比课程2的成绩高的所有学生的学号

selecta.snofrom(selectsno,scorefromscwherecno=1) a, 
(selectsno,scorefromscwherecno=2) bwherea.score>b.scoreanda.sno=b.sno

2、查询平均成绩大于60分的同学的学号和平均成绩

selecta.snoas"学号", avg(a.score) as"平均成绩"from (selectsno,scorefromsc) agroupbysnohavingavg(a.score)>60

3、查询所有同学的学号、姓名、选课数、总成绩

selecta.snoas学号, b.snameas姓名, count(a.cno) as选课数, sum(a.score) as总成绩fromsca, studentbwherea.sno=b.snogroupbya.sno, b.sname或者selectstudent.snoas学号, student.snameas姓名, count(sc.cno) as选课数, sum(score) as总成绩fromstudentleftouterjoinsconstudent.sno=sc.snogroupbystudent.sno, sname

4、查询姓的老师的个数

selectcount(tno)
fromteacherwheretnamelike'张%'

5、查询没学过张三老师课的同学的学号、姓名

selectstudent.sno,student.snamefromstudentwheresnonotin (selectdistinct(sc.sno) fromsc,course,teacherwheresc.cno=course.cnoandteacher.tno=course.tnoandteacher.tname='张三')

6、查询同时学过课程1和课程2的同学的学号、姓名

selectsno, snamefromstudentwheresnoin (selectsnofromscwheresc.cno=1) andsnoin (selectsnofromscwheresc.cno=2) 
或者selectc.sno, c.snamefrom(selectsnofromscwheresc.cno=1) a, 
(selectsnofromscwheresc.cno=2) b, 
studentcwherea.sno=b.snoanda.sno=c.sno或者selectstudent.sno,student.snamefromstudent,scwherestudent.sno=sc.snoandsc.cno=1andexists(select*fromscassc_2wheresc_2.sno=sc.snoandsc_2.cno=2)

7、查询学过李四老师所教所有课程的所有同学的学号、姓名

selectsno--子查询结果如果要当临时表来使用的话需要起个别名(比如这里面的t)
from (
--学过该老师课程的同学学号(包含只学一门)
selectsno,count(cno) numfromscwherecnoin (
--该老师教了哪些课程selectcnofromcoursewheretnoin (
selecttnofromteacherwheretname='李四'        )
    ) groupbysno) twheret.num= (
--统计该老师总课程数selectcount(cno)
fromcoursewheretno= (
selecttnofromteacherwheretname='李四'    )
)

8、查询课程编号1的成绩比课程编号2的成绩高的所有同学的学号、姓名

selecta.sno, a.snamefromstudenta, 
(selectsno, scorefromscwherecno=1) b, 
(selectsno, scorefromscwherecno=2) cwhereb.score>c.scoreandb.sno=c.snoanda.sno=b.sno

9、查询所有课程成绩小于60分的同学的学号、姓名

selectsno,snamefromstudentwheresnonotin (selectdistinctsnofromscwherescore>60)

10、查询至少有一门课程与学号为1的同学所学课程相同的同学的学号和姓名

selectdistincta.sno, a.snamefromstudenta, scbwherea.sno<>1anda.sno=b.snoandb.cnoin (selectcnofromscwheresno=1)
或者selects.sno,s.snamefromstudents, 
(selectsc.snofromscwheresc.cnoin    (selectsc1.cnofromscsc1wheresc1.sno=1) andsc.sno<>1groupbysc.sno) r1wherer1.sno=s.sno

11、 “sc”表中王五所教课的成绩都更改为此课程的平均成绩

updatescsetscore=(selectavg(sc_2.score) fromscsc_2wheresc_2.cno=sc.cno)
wherecnoin(selectc.cnofromcoursecleftjointeachertont.tno=c.tnowheret.tname='王五');

12、查询和编号为1002的同学学习的课程完全相同的其他同学学号和姓名

selectsc_1.snofrom (selectcnofromscwheresno='1002')aleftjoinscsc_1ona.cno=sc_1.cnowheresc_1.sno<>'1002'groupbysc_1.snohavingcount(sc_1.cno) =(selectcount(cno) fromscwheresno='1002');
selecta.sno,s.snamefrom(selectsno,GROUP_CONCAT(cnoorderbycnoseparator',') ascid_strfromscwheresno='1002')b,
(selectsno,GROUP_CONCAT(cnoorderbycnoseparator',') ascid_strfromscgroupbysno)aleftjoinstudentsona.sno=s.snowherea.cid_str=b.cid_stranda.sno<>'1002';

13、删除学习王五老师课的sc表记录

deletescfromcourse, teacherwherecourse.cno=sc.cnoandcourse.tno=teacher.tnoandtname='王五'

14、sc表中插入一些记录,这些记录要求符合以下条件:将没有课程3成绩同学的该成绩补齐,    其成绩取所有学生的课程2的平均成绩

insertscselectsno, 3, (selectavg(score) fromscwherecno=2) 
fromstudentwheresnonotin (selectsnofromscwherecno=3)

15、按平平均分从高到低显示所有学生的如下统计报表:学号,企业管理,马克思,UML,数据库,物理,课程数,平均分

selectsnoas学号,max(casewhencno=1thenscoreend) AS企业管理,max(casewhencno=2thenscoreend) AS马克思,max(casewhencno=3thenscoreend) ASUML,max(casewhencno=4thenscoreend) AS数据库,max(casewhencno=5thenscoreend) AS物理,count(cno) AS课程数,avg(score) AS平均分FROMscGROUPbysnoORDERbyavg(score) DESC

16、查询各科成绩最高分和最低分:以如下形式显示:课程号,最高分,最低分

selectcnoas课程号, max(score) as最高分, min(score) 最低分fromscgroupbycnoselectcourse.cnoas'课程号',MAX(score) as'最高分',MIN(score) as'最低分'fromsc,coursewheresc.cno=course.cnogroupbycourse.cno

17、按各科平均成绩从低到高和及格率的百分数从高到低顺序

SELECTt.cnoas课程号,
c.cnameas课程名,
COALESCE(avg(score),0) as平均成绩,
100*sum(casewhenCOALESCE(score,0)>=60then1else0END)/count(*) as及格百分数fromsctleftjoincoursecont.cno=c.cnogroupbyt.cnoorderby100*sum(casewhenCOALESCE(score,0)>=60then1else0END)/count(*);

18、查询如下课程平均成绩和及格率的百分数("1"显示):企业管理(001),马克思(002),UML003),数据库(004

selectavg(casewhencno=1thenscoreend) as平均分1,
avg(casewhencno=2thenscoreend) as平均分2,
avg(casewhencno=3thenscoreend) as平均分3,
avg(casewhencno=4thenscoreend) as平均分4,
100*sum(casewhencno=1andscore>60then1else0end) /sum(casewhencno=1then1else0end) as及格率1,
100*sum(casewhencno=2andscore>60then1else0end) /sum(casewhencno=2then1else0end) as及格率2,
100*sum(casewhencno=3andscore>60then1else0end) /sum(casewhencno=3then1else0end) as及格率3,
100*sum(casewhencno=4andscore>60then1else0end) /sum(casewhencno=4then1else0end) as及格率4fromsc

19、查询不同老师所教不同课程平均分, 从高到低显示

selectr.tnameas'教师',r.rnameas'课程', AVG(score) as'平均分'fromsc,
(selectt.tname,c.cnoasrcso,c.cnameasrnamefromteachert ,coursecwheret.tno=c.tno)rwheresc.cno=r.rcsogroupbysc.cno,r.tname,r.rnameorderbyAVG(score) desc

20、查询如下课程成绩均在第3名到第6名之间的学生的成绩:学生ID,学生姓名企业管理,马克思,UML,数据库,平均成绩

selecttop6max(a.sno) 学号, max(b.sname) 姓名, 
max(casewhencno=1thenscoreend) as企业管理, 
max(casewhencno=2thenscoreend) as马克思, 
max(casewhencno=3thenscoreend) asUML, 
max(casewhencno=4thenscoreend) as数据库, avg(score) as平均分fromsca, studentbwherea.snonotin(selecttop2snofromscwherecno=1orderbyscoredesc)
anda.snonotin (selecttop2snofromscwherecno=2orderbyscoredesc) 
anda.snonotin (selecttop2snofromscwherecno=3orderbyscoredesc) 
anda.snonotin (selecttop2snofromscwherecno=4orderbyscoredesc) 
anda.sno=b.snogroupbya.sno
目录
相关文章
|
1月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
7月前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
51 0
|
5月前
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
91 1
|
4月前
|
缓存 监控 Go
[go 面试] 缓存策略与应对数据库压力的良方
[go 面试] 缓存策略与应对数据库压力的良方
|
5月前
|
SQL 安全 Java
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
55 0
|
5月前
|
druid Java 数据库连接
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
93 0
|
5月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
74 0
|
5月前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
314 0
|
7月前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
496 9
Python与NoSQL数据库(MongoDB、Redis等)面试问答
下一篇
DataWorks