数据库面试问题汇总_第1页
数据库面试问题汇总_第2页
数据库面试问题汇总_第3页
数据库面试问题汇总_第4页
数据库面试问题汇总_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库面试问题汇总1. 数据库管理命令1.1查询所有数据库- show databases;1.2创建数据库,并将数据库字符集默认为utf-8-create database day814-default character set utf8-;1.3查看数据库的默认字符集-show create database day814;1.4 删除数据库- drop database day15;1.5 修改数据库(即修改数据库的默认字符集)-alert database day814 default character set gbk;2. 表管理命令2.1选择数据库命令- use day814;

2、2.2查看所有表- show tables;2.3 创建表- create table student(-sid int,-sage int,-sname varchar(20)-);2.4 查看表结构-desc student;2.5 删除表- drop table student;2.6 修改表添加字段-alter table student add column sgender varchar(2);删除字段-alter table studnet drop column sgender;修改字段类型-alter table student modify column sgender v

3、archar(100);修改字段名称-alter table student change column sgender gender varchar(100);修改表名称-alter table student rename to teacher;3. 数据管理3.1增删改数据-增加数据INSERT INTO student VALUES(1,tom,20,2);/要严格按照表的字段顺序插入数据增加部分数据INSERT INTO student (id,name) VALUES(2,tina);-删除数据条件删除DELETE FROM student WHERE id=2;注意:DELETE

4、 FROM和TRUNCATE FROM的区别DELETE FROM:可以全表删除,也可以条件删除,只能删除数据,不能删除约束,最后删除之后,可以回滚事务;TRUNCATE FROM: 只能全表删除,不能条件删除,即可以删除表的数据,也可以删除表的约束,不能回滚事务;-修改数据带条件修改UPDATE student SET age=1,name=tom WHERE id=2;3.2查询数据(重点)查询所有列(*通配符)-SELECT * FROM student;查询指定列-SELECT sid,sname, gender FROM student;查询时添加常量列-SELECT sid,sna

5、me,gender,sage,java_Class AS sgrade FROM student;/在查询student表时,添加一个sgrade列,内容为java_Class;查询时合并列-SELECT sid,sname,(servlet+jsp) AS 总成绩 FROM student;查询时去除重复记录-SELECT DISTINCT gender FROM student;-SELECT DISTINCT address FROM student;条件查询(模糊条件查询)- 逻辑条件 AND(与) OR(或) SELECT * FROM student WHERE sid=2 AND

6、 sname=c+; /交集SELECT * FROM student WHERE sid=2 OR sname=张三; /并集- 比较条件 <, >,<= 最重要的<>不等于,另外 BETWEEN ANDSELECT * FROM student WHERE jsp<=90 AND jsp>=75;- 判空条件需求:查询地址为null的学生(包括null和空字符串)注意:NULL 表示没有值空字符串 表示有值的;-模糊条件LIKE 表示模糊条件 ; %表示任意字符SELECT * FROM student WHERE sname LIKE j%;聚合

7、查询常用的聚合函数 : sum() avg() max() min() count() SELECT MAX(jsp) AS max_score FROM student;SELECT AVG(jsp) AS average score FROM student;这里注意:count统计数据不包含null的数据3.2.8 分页查询查询第1,2 条记录SELECT * FROM student LIMIT 0,2;/注意:LIMIT 0:起始行行数,2:总行数;3.2.9 查询排序ASC: 升序;DESC 降序SELECT * FROM student ORDER BY sid ASC;SELE

8、CT * FROM student ORDER BY servlet ASC;SELECT * FROM student ORDER BY servlet ASC,jsp DESC;分组查询- 2.11 分组查询(group by)- 需求: 查询男女的人数- 预期结果: - 男 3 - 女 2 -算法步骤: 1) 把学生按照性别分组(GROUP BY gender) - 2) 统计每组的人数(COUNT(*)SELECT gender,COUNT(*) FROM student GROUP BY gender;分组查询后筛选- 2.12 分组查询后筛选- 需求: 查询总人数大于2的性别- 算

9、法:1) 查询男女的人数- 2)筛选出人数大于2的记录(having)- 注意: 分组之前条件使用where关键字,分组之后条件使用having关键字SELECT gender,COUNT(*) FROM student WHERE GROUP BY gender HAVING COUNT(*)>2;综上,所有的SQL语句指令,主要包含3个部分:数据库管理、表管理、数据管理。SQL语句分类:数据定义语言、数据查询语言、数据操作语言。4. 数据约束4.1 默认值 4.2非空 4.3唯一4.4 主键(=非空+唯一)5. 数据库设计:三大范式第一范式:要求表的每个字段必须是不可分割的独立单元;

10、比如 student : nameJava狗娃应该改为name oldname Java 狗娃第二范式:在第一张范式基础上,要求每张表只表达一个意思,表的每个字段都和主键有依赖;employee(员工): 员工编号 员工姓名 部门名称 订单名称 -违反第二范式员工表:员工编号 员工姓名 部门名称 订单表: 订单编号 订单名称 - 符合第二范式第三范式:在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系;员工表: 员工编号(主键) 员工姓名 部门编号 部门名 -符合第二范式,违反第三范式(数据冗余高)员工表:员工编号(主键) 员工姓名 部门编号 -符合第三范式(降低

11、数据冗余)部门表:部门编号 部门名解析:个人对数据库三大范式的理解:首先数据表中的每个字段都必须是不可分割的独立单元;其次,在第一范式的基础上 ,要求每张表只表达一个意思,表的每个字段都和主键有依赖;最后,在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。6. 存储过程带有逻辑的SQL语句,存储过程带上流过程控制语句(if else for while);(1) 存储过程执行效率非常快,因为是在服务端执行;(2) 存储过程移植性比较差,不同数据的存储过程是不能移植的;7. 数据库索引实现原理1. 关于数据库索引采用的数据结构题目1: Mysql数据库用过吧?l里

12、面的索引是基于什么数据结构。答:主要是基于Hash表和B+树题目2: 很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如何存储?答: 首先,数据库使用树型结构来增加查询效率,并保持有序。那么,为什么不使用二叉树来实现数据结构呢,二叉树算法时间复杂度是lg(N),查询速度和比较次数都是较小的。实际上,查询索引操作最耗资源的不在内存中,而是磁盘IO。索引是存在磁盘上的,当数据量比较大的时候,索引的大小可能达到几个G。那么,我们利用索引进行查询的时候,不可能把索引直接加载到内存中,只能一次读取一个磁盘页,一个磁盘页对应着一个节点,一次读取操作时一个磁盘io。在二

13、叉树查询时,最坏的情况下查找的次数是树的高度,即io次数为树的高度。B-树就是比二叉树“矮胖”的树。二叉树的特征如下:1. 根节点至少有两个子女2. 每个中间节点包含k-1个元素和k个孩子,其中 m/2 <= k <= m3. 每个叶子节点包含k-1个元素,其中 m/2 <= k <= m4. 所有叶子节点位于同一层5. 节点中的元素从小到大排列,正好是孩子节点的值域。(就是孩子节点的元素都比父节点中元素的最小值大,比父节点元素的最大值小)B-树查询的次数并不比二叉树的次数小,但是相比起磁盘io速度,内存中比较的耗时就不足为提了。所以只要树的高度足够低,io次数少,就可

14、以提升查找性能。而每个节点中有多个元素,都只在内存中操作。而B+树是基于B-树的,增加了如下规则:1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。所以,B+树对比B-树有如下好处:io次数少:b+树中间节点只存索引,不存在实际的数据,所以可以存储更多的数据。索引树更加的矮胖,io次数更少。性能稳定:b+树数据只存在于叶子节点

15、,查询性能稳定范围查询简单:b+树不需要中序遍历,遍历链表即可。B树:有序数组+平衡多叉树; B+树:有序数组链表+平衡多叉树;数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。8. 数据库三大引擎之间差异(1) MyISAM特性:不支持事务、MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能适应;表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小

16、但也同时大大降低了并发性能;读写互相阻塞:不仅会在写入时阻塞读取,还会在读取时,阻塞写入,但读本身并不会阻塞另外的读。只会缓存索引:MyISAM可以通过key_Buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。(2) InnoDB特性:具有较好的事务支持,支持4个事务隔离级别,支持多版本读;行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响;读写阻塞与事务隔离级别相关;具有非常高效的缓存特性,能缓存特性,也能缓存数据;整个表和主键以Cluster方式存储,组成一颗平衡树;所有Secondary Index都会保存主键信息;(3) NDBCl

17、uster分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分;支持事务:和Innodb一样,支持事务;可与MySqld不在同一主机:可以和MysqlId分开存在于独立的主机上,然后通过网络和MysqlId通信交互;内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存放在与内存中;9. 脏读和幻读在说数据库的脏读和幻读时,首先要说数据库的事务,事务的4大特性:(1) 原子性:事务是数据库的逻辑工作单位,它对数据库的修改,要么全部执行,要么全部不执行;(2) 一致性:事务前后,数据库的状态都满足所有的完整性约束;(3)

18、隔离性:并发执行的N个事务是隔离的,一个不影响一个,一个 事务在没有commit之前,被修改的数据不可能被其他事务看到(如何实现的呢,通过设置数据库的隔离级别)(4) 持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失,持久性主要在于DBMS的恢复性能;(系统故障,数据不丢失)脏读:又称无效数据读出,一个事务读取另外一个事务还没有提交的数据叫做脏读;例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后T1因某种原因回滚了,那么事务T2读取的数据就是脏的;解决办法:把数据库的事务隔离级别调整到READ_COMMITTED;不可重复读

19、:不可重复读是指同一个事务内,两个相同的查询返回了不同的结果;例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而在此读取该数据,那么 T1发现两次读取的结果不同;解决办法:把数据库的事务隔离级别调整到REPEATABLE_COMMITTED;幻读:例如:当系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这叫幻读。解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ;综上:重点注意 :不可重复读和幻读的

20、区别,不可重复读强调的是查询修改,幻读强调的是插入和删除。10. Spring事务管理à什么是事务:事务(transaction)是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位à事务的4个基本性质:原子性、一致性、隔离性、持久性à数据库并发操作可能引起的问题:脏读:事务A读取了事务B中尚未提交的数据,如果事务B回滚,则A读取使用了错误的数据(读取了未提交的数据)不可重复读:事务A多次的读取过程中,事务B对数据进行了修改,导致事务A多次读取的数据不一致。丢失更新:在事务A期间,事务B对数据进行了更新,在事务A撤销之后,覆

21、盖了事务B提交的数据。(又叫做回滚丢失)幻读:在事务A多次读取过程中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。(幻读和不可重复读的区别在于:不可重复读是针对数据的更新操作,只要再记录上加上写锁,就可避免, 幻读是对记录的insert操作,要禁止幻读必须加上全局的写锁,比如在表上加写锁。)àSQL92定义的4中隔离级别: 未提交读(Read uncommitted):写操作加写锁,读操作不加锁。禁止丢失更新(回滚丢失),但是会出现所有其他数据并发问题。 提交读(Read committed):写操作加写锁,读操作加读锁。禁止丢失更新(回滚丢失)和脏读,是大多数关系型

22、数据库的默认隔离级别。 可重复读(Read repeatable):对于读操作加读锁到事务结束,其他事务的更新操作只能等到事务结束之后进行。和提交读的区别在于,提交读的读操作时加读锁到本次读操作结束,可重复读的粒度更大。禁止两类丢失更新,禁止脏读和不可重复读,但可能出现幻读。 序列化(Serializable):读操作加表级读锁至事务结束。可禁止幻读。à隔离级别越高,数据一致性的保证越强,但同时数据库的并发能力也越差。2. 存储过程的作用? 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列 SQL 语句。 可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。3. 查询的优化1).根据查询条件建立合适的index2).因为SQL是从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论