数据库DataBase
简称为DB,是结构化管理数据的仓库,称为电子化的文件柜
数据库的分类
关系型数据库
- SQLServer
- MySQL
- Oracle
非关系型数据库nosql
-
Redis
SQL语句
在关系型数据库中,用于操作数据库的结构化查询语言
查看信息
- 查看所有数据库:show databases;
- 查看所有表:show tables;
- 查看表结构:desc 表名;
- 查看建表语言:show create table 表名;
数据库操作
- 创建数据库:create database 数据库名;
- 使用数据库:use 数据库名;
- 删除数据库:drop database 数据库名;
数据表操作
数据类型
常用数据类型 | |
int | 整型 |
double | 浮点型 |
char(长度) | 定长字符 |
varchar(长度) | 可变字符串 |
text | 文本 |
date | 日期 |
time | 时间 |
datetime | 日期时间 |
timestamp | 时间毫秒 |
数据完整性
完整性约束 | 关键字 | 作用 |
非空约束 | not null | 保证字段值不为空 |
主键约束 | primary key | 保证字段值不重复,用于唯一区分每条记录 |
唯一约束(索引) | unique | 保证字段值不重复 |
默认值约束 | default | 保证字段在没有填充数据时,自动使用默认值填充 |
外键约束 | foreign key references | 保证从表中的记录只能来自于主表 |
- 创建数据表
create table 表名(
字段名 数据类型 [是否为空|唯一约束|主键约束|默认值约束|自动递增],
字段名 数据类型 [是否为空|唯一约束|默认值约束],
...
字段名 数据类型 [是否为空|唯一约束|默认值约束]
)
-
修改数据表
- 表重命名:alter table 表名 rename to 新表名;
- 添加新字段:alter table 表名 add column 字段名 数据类型 字段特征;
- 修改字段:alter table 表名 change 旧字段 新字段 数据类型 字段特征;
- 删除字段:alter table 表名 drop 字段名;
- 删除数据表:drop table 表名
- 删除时如果有外键约束,先删除从表,再删除主表
- 添加约束
- 添加主键约束:alter table 表名 add primary key(字段名)
- 添加唯一约束:alter table 表名 add unique(字段名)
- 添加默认值约束:alter table 表名 alter 字段名 set default '值'
- 添加外键约束:alter table 从表 add foreign key(字段名) references 主表(主键字段)
- 删除约束:alter table 表名 drop [primary key|index/foreign key 约束名]
嵌套查询
select * from 表 where 字段=(select * from 表 where 条件);
select * from 表,(select * from 表)t where 表.字段=t.字段;
多表查询
- 交叉连接/笛卡尔积
select * from 表1,表2...;
select * from 表1 cross/inner join 表2;
- 内连接
select * from 表1,表2 where 表1.字段=表2.字段;
select * from 表1 cross/inner join 表2 on 表1.字段=表2.字段;;
- 外连接(左外连接)
select * from 表1 left join 表2 on 表1.字段=表2.字段;-- 保证表1中的数据完整
- 外连接(右外连接)
select * from 表1 right join 表2 on 表1.字段=表2.字段;-- 保证表2中的数据完整
ER图
- 矩形:实体
- 椭圆形:实体的属性
- 菱形:实体之间的关系
范式
第一范式1NF
字段不可再分
第二范式2NF
在满足1NF的基础上,消除部分依赖。
对于联合主键而言,所有非主属性字段必须完全依赖于主属性。
第三范式3NF
在满足2NF的基础上,消除传递依赖。
JDBC
Java提供了一套规范用于连接各种数据库。不同的数据库厂商根据该规范设计连接驱动。
java.sql包下一组接口用于操作数据库。
- Connection接口 用于获取连接对象
- PreparedStatement接口 用于发送sql语句,处理sql语句
- ResultSet接口 用于保存查询后的结果集
加载MySQL驱动
Class.forName("com.mysql.cj.jdbc.Driver");
连接MySQL数据库字符串
String url="jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai";
String username="root";
String password="root";
查询的步骤
- 获取连接对象Connection
- 构造sql语句String
- 预处理sql语句pst=conn.prepareStatement(sql)
- 给sql语句中的?赋值pst.setXXX(?顺序,值)
- 调用executeQuery()得到ResultSet结果集
- 遍历结果集rs.next()后rs.getXXX(字段顺序/字段名)
- 释放资源
增删改的步骤
- 获取连接对象Connection
- 构造sql语句String
- 预处理sql语句pst=conn.prepareStatement(sql)
- 给sql语句中的?赋值pst.setXXX(?顺序,值)
- 调用executeUpdate()得到受影响的行数
- 释放资源
事务transaction
一组sql执行单元,要么全部执行,要么全部不执行
事务的特性ACID
原子性Atomicity
事务是最小的执行单元
一致性Consistency
事务执行前后,数据整体保持一致
隔离性Isolation
各个事务之间应当互不干涉
持久性Durability
事务一旦提交,改变是永久的
事务并发出现的问题
脏读
事务A读取到了事务B未提交的数据。
不可重复读
事务A中前后两次读取到的数据不一致。
事务A在读取过程中,事务B对数据进行了修改。
幻读
事务A在读取过程中,事务B向其中添加了数据,导致事务A读到了事务B中添加的"幻影"数据。
以上问题可以通过设置事务隔离级别解决。
事务隔离级别
隔离级别 | 能否出现脏读 | 能否出现不可重复的 | 能否出现幻觉 |
Read Uncommitted未提交读 | 会 | 会 | 会 |
Read Committed已提交读 | 不会 | 会 | 会 |
Repeatable Read可重复读(MySQL默 认) | 不会 | 不会 | 会 |
Serializable序列化 | 不会 | 不会 | 不会 |
事务相关指令
- 查看事务自动提交状态
select @@autocommit
- 修改事务自动提交状态
set @@autocommit=0/1 0表示不开启动,1表示开启
- 手动开启事务
start transaction;
- 提交
commit;
- 回滚
rollback;
- 查询当前事务隔离级别
select @@transaction_isolation
- 设置事务隔离级别
set [session|global] transaction isolation level [Read Uncommitted | Read Committed | Repeatable Read |Serializable]
视图
定义
create view 视图名 as
sql语句;
使用
select * from 视图名;
触发器
定义
create trigger 触发器名
触发时机 触发条件 on 表 for each row
begin
触发器触发时执行的sql语句;
end
存储过程
创建
create procedure 存储过程名(in/out/inout 参数名 数据类型)
begin;
sql语句;
end
调用
call存储过程名(参数);
总结
- 数据的定义:对客观事物的符号表示,如图形符号、数字、字母等,数据是数据库中存储的基本对象。
- 数据的种类:文字、图形、图像、声音
- 数据的特点:数据与其语义是不可分的