mysql数据库面试题(学生表_课程表_成绩表_教师表)

mysql数据库面试题(学生表_课程表_成绩表_教师表),第1张

Student(Sid,Sname,Sage,Ssex)学生表

Sid:学号

Sname:学生姓名

Sage:学生年龄

Ssex:学生性别

Course(Cid,Cname,Tid)课程

Cid:课程编号

Cname:课程名称

Tid:教师编号

SC(Sid,Cid,score)成绩

Sid:学号

Cid:课程编号

score:成绩

Teacher(Tid,Tname)教师表

Tid:教师编号:

Tname:教师名字

1、插入数据

2、删除课程表所有数据

3、将学生表中的姓名 张三修改为张大山

或者

4、查询姓’李’的老师的个数:

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

6、查询没有学全所有课的同学的学号、姓名

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

8、查询学过“100”并且也学过编号“101”课程的同学的学号、姓名

9、查询“100”课程比“101”课程成绩高的所有学生的学号

10、查询课程编号“100”的成绩比课程编号“101”课程高的所有同学的学号、姓名

11、查询学过“鲁迅”老师所教的所有课的同学的学号、姓名

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

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

14、把“SC”表中“鲁迅”老师教的课的成绩都更改为此课程的平均成绩,

错误

15、查询和“2”学号的同学学习的课程完全相同的其他同学学号和姓名

16、删除学习“鲁迅”老师课的SC表记录

17、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、002号课的平均成绩

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

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

20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 数学(100),语文(101),英语(102)

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

23、查询如下课程成绩第3名到第6名的学生成绩单:数学(100),语文(101),英语(102)

23、统计下列各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ 小于60]

24、查询学生平均成绩及其名次

25、查询各科成绩前三名的记录(不考虑成绩并列情况)

26、查询每门课程被选修的学生数

27、查询出只选修一门课程的全部学生的学号和姓名

28、查询男生、女生人数

29、查询姓“张”的学生名单

30、查询同名同姓的学生名单,并统计同名人数

31、1981年出生的学生名单(注:student表中sage列的类型是datetime)

32、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列

34、查询课程名称为“英语”,且分数低于60的学生名字和分数

35、查询所有学生的选课情况

36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数

37、查询不及格的课程,并按课程号从大到小的排列

38、查询课程编号为“101”且课程成绩在80分以上的学生的学号和姓名

39、求选了课程的学生人数:

40、查询选修“鲁迅”老师所授课程的学生中,成绩最高的学生姓名及其成绩

41、检索至少选修两门课程的学生学号

42、查询全部学生都选修的课程的课程号和课程名(1一个课程被全部的学生选修,2所有的学生选择的所有课程)

43、查询没学过“鲁迅”老师讲授的任一门课程的学生姓名

44、查询两门以上不及格课程的同学的学号及其平均成绩

45、检索“101”课程分数小于60,按分数降序排列的同学学号

46、删除“2”同学的“101”课程的成绩

方法1:

Select from p a where not exists(select 1 from p where phone=aphone and calltime>acalltime)

方法2:

select a from p a join (select max(calltime)calltime,phone from p group by phone) b on aphone=bphone and aID=bID order by calltime

方法3:

select from p a where ID=(select max(ID) from p where phone=aphone) order by calltime

方法4:

select a from p a join p b on aphone=bphone and acalltime<=bcalltime group by acalltime,aphone,aMemo having count(1)=1

方法5:

select from p a group by calltime,phone,Memo having ID=(select max(calltime)from p where phone=aphone)

方法6:

select from p a where (select count(1) from p where phone=aphone and calltime>acalltime)=0

方法7:

select from p a where calltime=(select top 1 calltime from p where phone=aphone order by calltime desc)

方法8:

select from p a where calltime!<all(select calltime from p where phone=aphone)

方法9(注:ID为唯一时可用):

select from p a where calltime in(select max(calltime) from p group by phone)

一、简述一下MongoDB的应用场景

mongodb 支持副本集、索引、自动分片,可以保证较高的性能和可用性。

更高的写入负载

默认情况下,MongoDB 更侧重高数据写入性能,而非事务安全,MongoDB 很适合业务系统中有大量 “低价值” 数据的场景。但是应当避免在高事务安全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全。

高可用性

MongoDB 的复副集 (Master-Slave) 配置非常简洁方便,此外,MongoDB 可以快速响应的处理单节点故障,自动、安全地完成故障转移。这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中,保持高可用性。

数据量很大或者未来会变得很大

依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事,在 MySQL 中,当一个单达表到 5-10GB 时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 通常需要借助驱动层或代理层完成这类需求。而 MongoDB 内建了多种数据分片的特性,可以很好地适应大数据量的需求。

基于位置的数据查询

MongoDB 支持二维空间索引,因此可以快速及精确地从指定位置获取数据。

表结构不明确

在一些传统 RDBMS 中,增加一个字段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于 1G 的时候(当大于 1TB 时更甚)。 因 MongoDB 是文档型数据库,为非结构货的文档增加一个新字段是很快速的 *** 作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不再需要由 DBA 修改表结构。

二、数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?

1、为什么要分表

当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。

分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据 *** 作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

2、分表的方案

做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?

linux mysql proxy 的安装,配置,以及读写分离

mysql replication 互为主从的安装及配置,以及数据同步

优点:扩展性好,没有多个分表后的复杂 *** 作(php 代码)

缺点:单个表的数据量还是没有变,一次 *** 作所花的时间还是那么多,硬件开销大。

三、简述一下数据库主从复制,读写分离

什么是主从复制

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;

主从复制的原理:

1数据库有个bin-log二进制文件,记录了所有的sql语句。

2只需要把主数据库的bin-log文件中的sql语句复制。

3让其从数据的relay-log重做日志文件中再执行一次这些sql语句即可。

主从复制的作用

1做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

2架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问频率,提高单机的I/O性能

3主从复制是读写分离的基础,使数据库能制成更大 的并发。例如子报表中,由于部署报表的sql语句十分慢,导致锁表,影响前台的服务。如果前台服务使用master,报表使用slave,那么报表sql将不会造成前台所,保证了前台的访问速度。

主从复制的几种方式:

1同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。

2异步复制:如同AJAX请求一样。master只需要完成自己的数据库 *** 作即可。至于slaves是否收到二进制日志,是否完成 *** 作,不用关心。MYSQL的默认设置。

3半同步复制:master只保证slaves中的一个 *** 作成功,就返回,其他slave不管。

这个功能,是由google为MYSQL引入的。

关于读写分离

在完成主从复制时,由于slave是需要同步master的。所以对于insert/delete/update这些更新数据库的 *** 作,应该在master中完成。而select的查询 *** 作,则落下到slave中。

1、现有交易数据表user_goods_table,

老板想知道每个用户购买的外卖品类偏好分布,并找出每个用户购买最多的外卖品类是哪个。

2、现有交易数据表user_sales_table,

老板想知道支付金额在前20%的用户。

3、现有用户登录表user_login_table,

老板想知道连续7天都登录平台的重要用户。

4、给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:user_id,日期:date,是否签到:is_sign_in,0否1是。

4-1、计算截至当前(假设当前时间为2020-04-27),每个用户已经连续签到的天数:

要求输出用户IDuser_id和连续签到天数recent_continuous_days

4-2、计算有史以来 用户最大连续签到天数

要求输出用户IDuser_id和最大连续签到天数

select LESSON_NAME as '科目',

max(case when sequence = 1 then NameGrade else null end) as '第一名(姓名+分数)',

max(case when sequence = 2 then NameGrade else null end) as '第二名(姓名+分数)',

max(case when sequence = 3 then NameGrade else null end) as '第三名(姓名+分数)'

(

select LESSON_NAME,STU_NAME+','+convert(varchar,GRADE) as NameGrade,sequence

(select bLESSON_NAME,cSTU_NAME,aGRADE,row_number() over(order by aGRADE Desc, cSTU_NAME asc) as sequence from score a

inner join lession b on (aLESSION_ID = bLESSION_ID)

inner join student c on (aSTU_ID = cSTU_ID) ) d

where sequence < 4

) e

group by LESSON_NAME

order by case(when LESSON_NAME = '语文' then 1,

when LESSON_NAME = '数学' then 2,

when LESSON_NAME = '英语' then 3,

when LESSON_NAME = '物理' then 4,

when LESSON_NAME = '化学' then 5,

else 9999 end)

大概就是这个样子,没执行,你自己再调试下 。

如果两个人相同分数,根据名字顺序排列

以上就是关于mysql数据库面试题(学生表_课程表_成绩表_教师表)全部的内容,包括:mysql数据库面试题(学生表_课程表_成绩表_教师表)、sql面试题求解、PHP中高级面试题 – 第三天等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9304265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存