1.简单谈下你知道的数据库?
- 1.access(小型数据库),2.vf(小型数据库) 3.mysql(中型数据库) 4.sqlserver (中型数据库)5.oracle (大型数据库)6.db2(大型数据库) 7.sybase(大型数据库)sqllite(嵌入式数据库)
2.数据库引擎是什么?
- 就是这个数据库的存储,处理数据的核心服务。他根据用户业务的不同分为不同的数据库引擎。一共有9种引擎。Mysql在V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB他们每个引擎都有自己的特点。就是处理不同的业务。
3.关系型数据库是什么?
- 当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。 非关系型数据库有 NoSql 非结构化数据库。Redis(做缓存数据),mongodb(做变化的数据)
等等。
4.数据库中表和表之间的关系有?
- 表与表之间一般存在三种关系,即一对一,一对多,多对多关系。
5.数据库的视图?
- 视图只是一个或多个表依照某个条件组合而成的结果集,一般来说你可以用update,insert,delete等sql语句修改表中的数据,而对视图只能进行select操作。
表是物理存在的,你可以理解成计算机中的文件! 视图是虚拟的内存表,你可以理解成Windows的快捷方式!
6.表和视图的关系和区别?
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
7.要在一张表中去掉重复数据?
- distinct方法;通过分组的方法;
8.内连接,左外连接,右外连接,自连接?
- 内连接:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
- 左外连接:左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
- 右外连接:与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
- 自连接:自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
Mysql目前不支持全连接;
9.子查询?
- 子查询允许把一个查询嵌套在另一个查询当中。 子查询分为如下几类:
1. 标量子查询:返回单一值的标量,最简单的形式。
2. 列子查询:返回的结果集是 N 行一列。
3. 行子查询:返回的结果集是一行 N 列。
4. 表子查询:返回的结果集是 N 行 N 列。
10.sql语句的执行顺序是?
- SQL的执行顺序:
- –第一步:执行FROM
- –第二步:WHERE条件过滤
- –第三步:GROUP BY分组
- –第四步:执行SELECT投影列 –第五步:HAVING条件过滤 –第六步:执行ORDER BY 排序
11.数据库的事务的四大特性?
- 原子性,要么执行,要么不执行
- 隔离性,所有操作全部执行完以前,其它会话不能看到过程
- 一致性,事务前后,数据总额一致
- 持久性,一旦事务提交,对数据的改变就是永久的
12.数据库隔离级别?
- 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted(未授权读取、读未提交)、 Read committed(授权读取、读提交)、 Repeatable read(可重复读取)、 Serializable(序列化),
- 这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题。 脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
- 不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
- 幻读:和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
13.写出你常见的数据库函数?
AVG() 返回某字段的平均值
COUNT() 返回某字段的行数
MAX() 返回某字段的最大值
MIN() 返回某字段的最小值
SUM() 返回字段的和
还有字符函数,日期函数等等。
14. 数据库索引?
- 常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。
- 索引:(想想小时候查字典,一本书的目录),它是用于提高数据库表数据访问速度的数据库对象。 索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。
- 根据B+Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,使用B+Tree的优点。
15.什么是聚集索引和非聚集索引?
- 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
- 聚集索引:聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。
- 非聚集索引:非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构。
16.索引的类型有哪些?
1.普通索引:最基本的索引,它没有任何限制。
2.唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3.主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束。
4.联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。
5.全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展
MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。
17.索引的优缺点?
- 优点:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。- 缺点:
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 因为索引非常占内存,所以索引也需要谨慎添加,那些字段需要索引。
18.索引的优化?
- 1.前导模糊查询不能使用索引。 select * from doc where title like ‘%XX’;
2.union、in、or 都能够命中索引,建议使用 in。 负向条件查询不能使用索引,可以优化为 in 查询。 负向条件有:!=、<>、not in、not exists、not like 等。
3.联合索引最左前缀原则(又叫最左侧查询) 等等。
19.数据库的触发器?
- 触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL
- 也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。
- 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。 CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
20.存储过程是什么?
- 简单的说,一般我们写的sql就是一句,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法。
- 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
- 函数的普遍特性:模块化,封装,代码复用; 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤。 存储过程的调用使用 call来调用;
21.写出你常见的数据库连接池?
- Dbcp,c3p0,druid(DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点)
22.数据库优化?
1. SQL优化 少用 select *; 使用join代替子查询等等
2. 表结构优化:选择适合的数据类型;尽量使用not null
3. 索引优化:在查询的时候添加适当的索引;
4. 缓存参数优化
5. 分表分库存储数据:
6. 选择适合的数据库引擎;
- 分表:就是数据量非常的大的时候,一个表中数据比较大,就可以把表查分成表来进行。
- 分库:就是按照业务分成不同的小的节点。比如把订单,用户和促销的节点一分为订单节点一,用户节点二,促销节点三。
- 分表分库的算法: 按自然时间来分表/分库; 按数字类型hash分表/分库; 按md5值来分表/分库;
主从复制:实现数据库:读写分离,读从库,写主库 - spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。
23. PreparedStatement的优点?
- PreparedStatement可以写参数化查询,比Statement能获得更好的性能。
- 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
- PreparedStatement可以阻止常见的SQL注入式攻击。
- PreparedStatement可以写动态查询语句
24. 对于海量数据(也就是非常庞当的数据)的存储使用的解决方案?
分库,分表,M-S(主从复制),集群,负载均衡
25. 主键和外键?
主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
外键:在一个表中存在的另一个表的主键称此表的外键。
26.数据库的乐观锁和悲观锁是什么?
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。