一、数据库的常用数据类型
1. 字符串类型
char:char 的长度是固定的(指的是当定义了一个长度之后,如果你存入的字符不足以达到定义的上限,那么会在后面补上空格凑齐长度),因此速度会略快。
varchar:varchar 的长度是可变的(指的是定义了一个长度之后,如果存入的字符不足以达到定义的上限,那么只会存多少就会占用多少空间,如果后面还有加上则会加长空间,而不是加长定义的长度),因此速度会略慢。
在使用过程中一般使用 varchar,除非一些非常固定的需要存储才会用到 char。
- blob:二进制形式的长文本数据
- text:长文本数据
- longtext:极大文本的数据
2. 数字类型
- int或者integer:4 字节
- bigint:8 字节,64 位
- float:4 字节
- double:8 字节
整数使用 int,浮点数使用 float、double。
3. 日期和时间类型
- date:日期
- datetime:日期 + 时间
二、表命名的规范
- 必须以字母开头
- 字符长度在 2-30 之间
- 只能包含 A-Z、a-z、0-9、# 和 $ 等等
- 被同一个用户拥有的对象不能有重复的名字
- 不能是 Oracle 服务器保留字
三、主键
表中经常有一个或者多个列的组合,其值可以唯一准确地标识表中的每一行。
四、约束
约束用来限制加入表的数据的类型。
1. 主键约束
可以定义在表级或者列级。
- 键列必须具有唯一性,且不可以为空
- 一个表里面只能有一个主键
- 主键所在的列必须具有索引,如果没有,则在添加索引的时候自动创建
2. 唯一性约束
可以定义在表级或者列级。
- 索引是必须的,如果不存在则会自动创建一个
- 允许 null 值,UNIQUE 约束可以存在多个 null,因为 UNIQUE 的唯一性通过 B+ 树索引来实现,而 B+ 树索引中不包含 null。但是这也造成了 where 语句中用 null 值进行过滤会造成全表扫描。
3. 非空约束
只能定义在列级。
非空约束作用的列也叫强制列,也就是说强制列中必须有值,如果在建表的时候使用 default 关键字指定了默认值的话,那么就不可以输入了。
4. 外键约束
可以定义在表级或者列级。
外键约束是在具有父子关系的两个表当中,子表中的某一列对应了父表中的主键列,用来维护数据库的完整性。
- 外键约束中子表对应父表的列数据类型必须相同,但是列名可以不同
- 子表对应的父表的列必须存在主键约束或唯一约束
- 列允许 null 值,但是这一行的话就会变成孤行了
5. 检查约束
检查约束是用来实施一些简单的规则,比如说让值必须要在某个范围内,结果必须是一个为 true 或者 false 的表达式。
五、DDL 语法
DDL 是用来创建、修改、删除表和索引,核心的四个关键字为 create、alter、delete 和 truncate。
1. 库 database
-- 1. 创建数据库 CREATE DATABASE testdb; -- 2. 查看数据库 SHOW DATABASES; -- 3. 切换数据库 USE testdb; -- 4. 修改数据库字符集 ALTER DATABASE testdb; -- 5. 删除数据库 DROP DATABASE testdb;2. 表 table
-- 1. 创建表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', name VARCHAR(20) NOT NULL COMMENT '学生姓名', age TINYINT COMMENT '年龄', birthday DATE COMMENT '生日', create_time DATETIME COMMENT '创建时间' ) COMMENT = '学生表'; -- 2. 查看建表语句 SHOW CREATE TABLE student; -- 3. 查看表结构 DESC student; DESCRIBE student; -- 4. 删除表 DROP TABLE student;使用 alter 修改表:
-- 1.新增字段 ALTER TABLE student ADD COLUMN email VARCHAR(50) COMMENT '邮箱'; -- 2.修改字段类型/约束/注释 ALTER TABLE student MODIFY COLUMN age INT COMMENT '学生年龄'; -- 3.修改字段名字 + 类型(CHANGE) ALTER TABLE student CHANGE COLUMN email phone VARCHAR(11) COMMENT '手机号'; -- 4.删除字段 ALTER TABLE student DROP COLUMN phone; -- 5.修改表注释 ALTER TABLE student COMMENT '学生信息表'; -- 6.修改表名 ALTER TABLE student RENAME TO stu;六、设计范式
1. 第一范式(1NF)
数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。
2. 第二范式(2NF)
在满足 1NF 的情况下,要求表中的所有列都必须依赖主键,而不能有任何一列与主键没有关系。
3. 第三范式(3NF)
在满足 2NF 的情况下,要求表中的每一列都要与主键直接相关,不可以间接相关,也就是表中的每一列都只能依赖于主键。
七、DML
1. insert 插入数据
INSERT INTO 表名(字段1,字段2) VALUES(值1,值2),(值3,值4);2. update 修改数据
UPDATE 表名 SET 字段1=值1,字段2=值2 WHERE 条件;3. delete 删除数据
DELETE FROM 表名 WHERE 条件;4. select 查询
固定的语法顺序是:
SELECT 字段列表 FROM 表名 WHERE 行过滤条件 GROUP BY 分组字段 HAVING 分组后的过滤 ORDER BY 排序字段 [ASC/DESC]例子:
SELECT class_id 班级编号, COUNT(*) 人数 FROM student WHERE age > 18 GROUP BY class_id HAVING COUNT(*) > 2 ORDER BY 人数 DESC LIMIT 0,2;八、数据库事务
事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
1. ACID 性质(事务四大特性)
- 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么全部不执行。
- 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,一致状态的含义是数据库中的数据应该满足完整性的约束。
- 隔离性(Isolation):多个事务并发运行时,一个事务的执行不应影响其他事务的执行。
- 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中,不能回滚。
2. 事务的并发问题
- 脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据就是脏数据。
- 不可重复读:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据做了更新并提交,导致事务 A 多次读取同一数据时,结果不一致。
- 幻读:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改完检查发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
3. 事务隔离级别
隔离级别用来定义多个并发事务之间的可见性规则,级别越高,数据一致性越强,但并发性能越低。SQL 标准定义了四种隔离级别,它们分别能解决脏读、不可重复读、幻读中的一部分问题。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | 说明 |
|---|---|---|---|---|---|
| READ UNCOMMITTED读未提交 | 没有 | 没有 | 没有 | 最高 | 能读别人未提交数据,几乎不用 |
| READ COMMITTED读已提交 | 解决 | 没有 | 没有 | 较高 | Oracle 默认 |
| REPEATABLE READ可重复读 | 解决 | 解决 | 理论有 | 中 | MySQL 默认,InnoDB 靠间隙锁解决幻读 |
| SERIALIZABLE串行化 | 解决 | 解决 | 解决 | 最低 | 事务串行,完全不并发 |