分享

mysql常见的面试题

 shopnc 2018-12-03

一.前言

   本人是搞java系统开发这块的,数据库是面试笔试的重点,所以特定整理了一些自己遇到的自认为有价值和他人遇到的好的面试题进行整理.这篇就当做题集.会不定期更新此篇题集.

题目1

    什么是数据库事务?
  答案:单个逻辑单元执行的一系列操作,这些操作要么全做要么全不做,是不可分割的.事务的开始和结束用户是可以控制的,如果没控制则由数据库默认的划分事务.事务具有以下性质:
(1)原子性
    指一个事务要么全执行,要么全不执行.也就是说一个事务不可能执行到一半就停止了.比如:你去买东西,钱付掉了,东西没拿.这两步必须同时执行 ,要么都不执行.
(2)一致性
   指事务的运行并不改变数据库中的一致性.比如 a+b=10;a改变了,b也应该随之改变.
(3)独立性
   两个以上的事务不会出现交替运行的状态,因为这样可能导致数据的不一致
(4)持久性
   事务运行成功之后数据库的更新是永久的,不会无缘无故的回滚.

题目2

   执行数据库查询时候,如果查询的数据有很多,假设有1000万条,用什么方法可以提高查询效率?在数据库方面或java代码方面有什么优化办法?
1.在数据库设计方面
(1)建立索引
(2)分区(比如说按时间分区)
(3)选取最适用的字段属性(尽量减少字段宽度和使用固定长度的字段)
2.在数据库I/O方面
(1)增加缓冲区
(2)如果涉及到表的级联,最好不同的表放在不同的磁盘,以增加I/O速度
3.Sql语句方法
(1)优化sql语句,减少比较次数,可用连表查询来代替子查询
(2)限制返回的条目数(mysql用limit)
(3)有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就
去掉外键(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
4.在java方面
如果反复使用的查询,可通过preparedstatement,因为他在运行前已经预编译,只要运行就Ok了.

题目3

sql语言的常见问题
1.增删查改之类的问题,连表查询是必出题目,可以参考之前我写的那篇文章
这里讲一些分组查询跟降序升序分页
分组:group by 列名 
统计各个部门薪水大于5000的人数
例子:SELECT department , COUNT(money) from employee where money>=5000group by department;

分页:limit ()
select * from table limit 5; --返回前5行 
select * from table limit 0,5; --同上,返回前5行  
select * from table limit 5,10; --返回6-15行
应用到java里,select * from table limit " +(pageNo-1)*pageSize + "," + pageSize
排序:order by 列名 
asc 和desc 不写默认为升序
前者是升序后者是降序

综合题:
 以下两张表,员工表employee 与部门表 department
             
查询结果如下:

请写出sql语句
分析:
我们可以看到这是一般的连表,但是连表的显示的统计人数,所以我们分两步来走
第一步:查出各个部门的对应人数,把这个看做一个新表e1
select e.dep_id,count(name) num from employee e group by dep_id;
第二部:将查询结果与部门表连表
由于查询结果是显示左边的全部表格信息所以用左联,空的话为0,则采用ifnull()函数来解决
select d.*,ifnull(num,0) num  from  department d left  join (select e.dep_id,count(name) num from employee e group by dep_id) e1 on d.id=e.dep_id;

题目四

什么是数据库的三范式?
第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必
须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两
个独立的字段。
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必
须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储
各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖
主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成
一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,
以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求如下:
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一
个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,
否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就
是数据冗余

题目五

union 与union all的区别

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排 序运算,删除重复的记录再返回结果。 union all 则会显示重复结果,只是简单的两个结果合并并返回.所以效率比union高,在保证没有重复数据的情况下用union all.
select name from table1
union
select name  from table2;

题目六

.用一条 SQL  语句查询出每门课都大于 80 分的学生姓名 
name kecheng fenshu 
张三   语文          81 
张三   数学          75 
李四   语文          76 
李四   数学          90 
王五   语文          81 
王五   数学        100 
王五   英语         90  
分析:都大于80,他的反面就是<=80,我们可以先求出所有<=80的姓名,然后取反就可以了 
所以sql语句 select name from student where name not in (select  name from student where fenshu <=80);

题目七

求各个部门直接的比赛结果?  有个叫team 的表格,里面有id跟部门名name,如果各个部门要举行比赛用语句求出比赛结果  
select a.name,b.name from game a cross join game b where a.name<b.name;


题目八

删除除了 id  号不同, 其他都相同的学生冗余信息

题目九

一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 多万个用户,若要在
每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?

alter table drop column score;
alter table add colunm score int;
可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
这样的操作时无法回滚的,在我的印象中,只有 inert update delete 等 DML 语句才能回滚,
对于 create table,drop table ,alter table 等 DDL 语句是不能回滚

题目十

Class.forName()的作用?
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载
过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该
类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这
个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例
对象了。

题目十一

大量数据的分页?
select * from table order by id limit(pagesize*(pageNumbe-1,pagesize);

题目十二















 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多