基本问题
连接查询
分类:内连接、外连接、自然连接(略)、交叉连接(略)。
- 内连接
基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。
- 外连接
基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;
left join: 左外连接(左连接), 以左表为主表
right join: 右外连接(右连接), 以右表为主表
- 自然连接
- 交叉连接
一些常用的关键字
- union(联合查询)
索引
如果说数据库表中的数据是一本书,那么索引就是书的目录。索引能够让我们快速的定位想要查询的数据。
索引的结构:BTree 索引和 Hash 索引。
MyISAM 和 InnoDB 存储引擎:只支持 BTREE 索引, 也就是说默认使用 BTREE,不能够更换。
MEMORY/HEAP 存储引擎:支持 HASH 和 BTREE 索引。
索引的分类:单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引。
数据库引擎
- InnoDB:
支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择 InnoDB 有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择 InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
- MyISAM:
插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择 MyISAM 能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择 MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
存储过程
- 简介
SQL 语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程是可编程的函数,在数据库中创建并保存,可以由 SQL 语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。
- 存储过程的优点:
增强 SQL 语言的功能和灵活性;
标准组件式编程;
较快的执行速度;
减少网络流量;
作为一种安全机制来充分利用。
热门面试问题:
1、JDBC 编程的步骤?
(1) 注册驱动;
(2) 获取连接对象 Connection;
(3) 创建 Statement 对象;
(4) 运行 SQL 语句;
(5) 处理结果;
(6) 关闭连接释放资源。
2、事务的 ACID 是什么?事务并发会产生哪些问题?
ACID 表示事务的特性:原子性、一致性、隔离性和持久性。
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
3、事务并发产生的问题:脏读、幻读、不可重复读。
脏读(针对未提交的数据):一个事务在更新一条记录,未提交前,第二个事务读到了第一个事务更新后的记录,那么第二个事务就读到了脏数据,会产生对第一个未提交 数据的依赖。一旦第一个事务回滚,那么第二个事务读到的数据,将是错误的脏数据。
不可重复读(读取数据本身的对比):一个事务在读取某些数据后的一段时间后,再次读取这个数据,发现其读取出来的数据内容已经发生了改变,就是不可重复读。
幻读(读取结果集条数的对比):一个事务按相同的查询条件查询之前检索过的数据,确发现检索出来的结果集条数变多或者减少(由其他事务插入、删除的),类似产生幻觉。
事务的隔离级别
IOS SQL92规定了4个隔离级别。(隔离==串行)
大多数数据库默认的事务隔离级别是 Read Committed,比如 SQL Server , Oracle。但 MySQL 的默认隔离级别是 Repeatable Read。
4、数据库性能优化有哪些方式?
-
SQL 优化:
尽量避免使用 SELECT *; 只查询一条记录时使用 limit 1; 使用连接查询代替子查询; 尽量使用一些能通过索引查询的关键字。
-
表结构优化:
尽量使用数字类型字段,提高比对效率; 长度不变且对查询速度要求高的数据可以考虑使用 char,否则使用 varchar; 表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一张表; 表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张表。
-
其它优化:
对查询频率高的字段适当的建立索引,提高效率; 根据表的用途使用合适的数据库引擎;读写分离。