数据库面试问题汇总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查看所有表---- 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 s gender;修改字段类型-----alter table student modify column sgender varchar(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 FROM和TRUNCATE FROM的区别DELETE FROM:可以全表删除,也可以条件删除,只能删除数据,不能删除约束,最后删除之后,可以回滚事务;TRUNCATE FROM: 只能全表删除,不能条件删除,即可以删除表的数据,也可以删除表的约束,不能回滚事务;-----修改数据带条件修改UPDATE student SET age=1,name=’tom’ WHERE id=2;3.2查询数据(重点)3.2.1查询所有列(*通配符)---SELECT * FROM student;3.2.2查询指定列---SELECT sid,sname, gender FROM student;3.2.3查询时添加常量列---SELECT sid,sname,gender,sage,’java_Class’ AS ‘sgrade’ FROM student;//在查询student表时,添加一个sgrade列,内容为java_Class;3.2.4查询时合并列---SELECT sid,sname,(servlet+jsp) AS ‘总成绩’ FROM student;3.2.5查询时去除重复记录---SELECT DISTINCT gender FROM student;---SELECT DISTINCT address FROM student;3.2.6条件查询(模糊条件查询)---逻辑条件AND(与) OR(或)SELECT * FROM student WHERE sid=2 AND 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%’;3.2.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;SELECT * FROM student ORDER BY servlet ASC;SELECT * FROM student ORDER BY servlet ASC,jsp DESC;3.2.10分组查询-- 2.11 分组查询(group by)--需求:查询男女的人数--预期结果:--男3---女2--算法步骤:1) 把学生按照性别分组(GROUP BY gender)--2) 统计每组的人数(COUNT(*))SELECT gender,COUNT(*) FROM student GROUP BY gender;3.2.11分组查询后筛选-- 2.12 分组查询后筛选--需求:查询总人数大于2的性别--算法:1) 查询男女的人数--2)筛选出人数大于2的记录(having)---注意:分组之前条件使用where关键字,分组之后条件使用having关键字SELECT gender,COUNT(*) FROM student WHERE GROUP BY gender HAVING COUNT(*)>2;综上,所有的SQL语句指令,主要包含3个部分:数据库管理、表管理、数据管理。
SQL语句分类:数据定义语言、数据查询语言、数据操作语言。
4.1 默认值4.2非空4.3唯一4.4 主键(==非空+唯一)5.数据库设计:三大范式第一范式:要求表的每个字段必须是不可分割的独立单元;比如student : nameJava\狗娃应该改为name oldnameJava 狗娃第二范式:在第一张范式基础上,要求每张表只表达一个意思,表的每个字段都和主键有依赖;employee(员工): 员工编号员工姓名部门名称订单名称--违反第二范式员工表:员工编号员工姓名部门名称订单表:订单编号订单名称--符合第二范式第三范式:在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系;员工表:员工编号(主键)员工姓名部门编号部门名--符合第二范式,违反第三范式(数据冗余高)员工表:员工编号(主键)员工姓名部门编号--符合第三范式(降低数据冗余)部门表:部门编号部门名解析:个人对数据库三大范式的理解:首先数据表中的每个字段都必须是不可分割的独立单元;其次,在第一范式的基础上,要求每张表只表达一个意思,表的每个字段都和主键有依赖;最后,在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。
6.存储过程带有逻辑的SQL语句,存储过程带上流过程控制语句(if else for while);(1)存储过程执行效率非常快,因为是在服务端执行;(2)存储过程移植性比较差,不同数据的存储过程是不能移植的;7.数据库索引实现原理1.关于数据库索引采用的数据结构题目1:Mysql数据库用过吧?l里面的索引是基于什么数据结构。
答:主要是基于Hash表和B+树题目2:很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如何存储?答: 首先,数据库使用树型结构来增加查询效率,并保持有序。
那么,为什么不使用二叉树来实现数据结构呢,二叉树算法时间复杂度是lg(N),查询速度和比较次数都是较小的。
实际上,查询索引操作最耗资源的不在内存中,而是磁盘IO。
索引是存在磁盘上的,当数据量比较大的时候,索引的大小可能达到几个G。
那么,我们利用索引进行查询的时候,不可能把索引直接加载到内存中,只能一次读取一个磁盘页,一个磁盘页对应着一个节点,一次读取操作时一个磁盘io。
在二叉树查询时,最坏的情况下查找的次数是树的高度,即io次数为树的高度。
B-树就是比二叉树“矮胖”的树。
二叉树的特征如下:1. 根节点至少有两个子女2. 每个中间节点包含k-1个元素和k个孩子,其中m/2 <= k <= m3. 每个叶子节点包含k-1个元素,其中m/2 <= k <= m4. 所有叶子节点位于同一层5. 节点中的元素从小到大排列,正好是孩子节点的值域。
(就是孩子节点的元素都比父节点中元素的最小值大,比父节点元素的最大值小)B-树查询的次数并不比二叉树的次数小,但是相比起磁盘io速度,内存中比较的耗时就不足为提了。
所以只要树的高度足够低,io次数少,就可以提升查找性能。
而每个节点中有多个元素,都只在内存中操作。
而B+树是基于B-树的,增加了如下规则:1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3. 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
所以,B+树对比B-树有如下好处:io次数少:b+树中间节点只存索引,不存在实际的数据,所以可以存储更多的数据。
索引树更加的矮胖,io次数更少。
性能稳定:b+树数据只存在于叶子节点,查询性能稳定范围查询简单:b+树不需要中序遍历,遍历链表即可。
B树:有序数组+平衡多叉树;B+树:有序数组链表+平衡多叉树;数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。