数据库

100 阅读4分钟

数据库

一、数据库设计三范式

第一范式:一个列只能存储一个值,是不可分割的。

第二范式:一张表中必须要有一个唯一主键。

第三范式:当A表关联到B表时,只能关联B表的主键列,不能关联到其他非主键列。

二、SQL语句

DDL: 数据库定义语言,主要用于对数据库、表进行增删改操作

CREATE DATABASE/TABLE
DROP DATABASE/TABLE
SHOW DATABASE/TABLES
USE <db name>

DML: 数据库操作语言,对表中的数据进行增删改操作

INSERT INTO
DELETE FROM <table>
UPDATE <table> SET 

DQL: 数据查询语言,主要对数据进行查询操作

单表查询
基础查询
SELECT
FROM
DISTINCT
过滤查询:WHERE
分页查询:LIMIT
分组查询:GROUP BY
排序: ORDER BY ASC/DESC
聚合/分组/单行函数:COUNT、SUM、AVG、MAX、MIN
多行函数:IF、IFNULL、DATE_FORMAT
连表查询
JOIN
LEFT/RIGHT JOIN
子查询:多条查询语句组合起来的查询语句

DTL: 事务操作语言

BEGIN
COMMIT
ROLLBACK

三、JDBC

JDBC访问数据库的基本步骤是什么?
  1. 加载驱动
  2. 通过DriverManager对象获取连接对象Connection
  3. 通过连接对象获取会话
  4. 通过会话进行数据的增删改查,封装对象
  5. 关闭资源
注册驱动(Driver):Class.forName("com.mysql.jdbc.Driver");
获取连接对象:Connectinon conn = DriverManager.getConnection();
创建语句对象:PrepareStatement pstmt = conn.parepareStatement("sql");
            // 设置参数 pstmt.setString(1, "参数");
执行语句:int row = pstmt.executeUpdate();
        ResultSet rs = pstmt.executeQuery();
关闭资源

四、事务(ACID)

什么是事务?

将多个业务操作看做一个事务单元,要么都成功,要么都失败。

事务四个特性
A: 原子性:把一个事务看做最小单位,不可分割,事务中的多个操作要么都成功,要么都失败。
C: 一致性:事务前后结构一致性;事务前后数据与业务预期一致性。
I: 隔离性:当产生多个事务同时执行时,事务与事务之间数据是互不影响的。
D: 持久性:事务操作结束后,数据会持久化保存到磁盘中。
事务并发的问题
脏读:在一个事务中读取到另一个事务未提交的数据。
​
幻读:在一个事务中,前后读取数据的数量不一致,通常时增、删除操作导致的。
    MVCC: 多事务版本并发控制技术解决幻读问题。
    
不可重复读:同一个事务中,前后读取同一份数据不一致,通常是因为数据被修改了导致的。
事务隔离级别
READ_UNCOMMITED(读未提交):啥也没解决
READ_COMMITED(读已提交):解决脏读问题
REPEATABLE(可重复读):解决脏读、不可重复度问题
SERIALIZE(串行化):都解决

五、索引

索引:

索引是为了帮助MySql可以快速检索到对应数据的一种数据结构。

数据结构:

Hash、B+TREE

索引是否越多越好?
增加索引可以提升基于索引列的查询效率,但是会的整张表的增删改都增加性能负担,因此并不是索引越多越好,尽量要选择何事的列作为缩影。    推荐单表索引数量在3个左右。
索引的分类
主键索引
​
非主键索引:叶子节点最终存储的数据是这行数据锁对应的主键索引的值,因此基于非主键索引查询时,如果要查询完整一行数据,需要重新再基于主键索引树得到完整数据,这个操作称之为回表查询。
​
专业名词:
    聚集/聚簇索引:数据与索引存储再一起
    非聚集/聚簇索引:索引与数据时分开存储的
存储引擎
MyISAM
索引:索引文件与数据文件是分开存储的,因此无论是主键索引还是非主键索引,都需要额外的IO去查询数据。
不支持事务
表级锁
表的总数量会专门存储
相对查询效率高
InnoDB
索引:索引与数据都存在一个文件中,那么对于主键索引来说,直接单个文件的IO就可以查询到需要的数据,对于非主键索引来说需要回表查询。
支持事务
行级锁
总数需要全表扫描统计