一、什么是数据库
1. DB
2. DBMS
- DataBase Management System 数据库管理系统,常见的有:MySQL、Oracle、DB2、Sybase、SqlServer...
3. SQL
4. 关系
- DBMS执行sql语句,通过执行sql语句来操作DB中的数据
二、表的概念
- 行:一个记录
- 列:一个字段,包括字段名、数据类型、相关的约束
三、SQL语句分类
1. DQL(数据查询语言)
- Data Query Language
- 查询语句,select
2. DML(数据操作语言)
- Data Manipulation Language
- 对表中数据进行增删改查,insert、delete、update
3. DDL(数据定义语言)
- Data Definition Language
- 对表结构的增删改,create、drop、alter
4. TCL(事务控制语言)
- Transaction Control Language
- commit:提交事务、rollback:回滚事务
5. DCL(数据控制语言)
- Data Control Language
- grant:授权、revoke:撤销权限等
四、数据库使用
1. 登录数据库
mysql -uroot -p 密码
2. 查看有哪些数据库
show databases;
--(MySQL命令,非SQL语句)

3. 创建自己的数据库
create database 数据库名;
--(MySQL命令,非SQL语句)
4. 使用自己创建的数据库
use 数据库名;
--(MySQL命令,非SQL语句)
5. 查看当前数据库中有哪些表
show tables;
--(MySQL命令,非SQL语句)
6. 初始化数据
source .sql文件拖过来回车自动初始化
7. 删除数据库
drop database 数据库名;
8. 查看表结构
desc 表名;
9. 查看表中的数据
select * from 表名;
五、DQL语句
1. 简单的查询语句(select)
2. 条件查询(where)
3. 排序(order by)
select 字段 from 表名 order by 字段(默认升序排列)
select 字段 from 表名 order by 字段 asc(升序排列)
select 字段 from 表名 order by 字段 desc(降序排列)
select 字段 from 表名 order by 字段1, 字段2, 字段3(越往前的字段越起主导作用,第一个字段相同时,才会按第二个字段的顺序进行排列)
4. 单行处理函数(ifnull,输入一行,输出一行)
5. 分组函数(多行处理函数(count、sum、avg、max、min):输入多行,输出一行)
5. group by和having
- group by:按照某个字段或者某些字段进行分组
- having:分组之后的数据再次进行过滤
- 用法:
- 一般和分组函数一起使用
- 在group by函数执行之后才会执行分组函数
- 当一个语句中有group by时,select后面只能跟分组函数和参与分组的字段
6. 去除重复数据
select distinct 字段1, 字段2... from 表名;
--多个字段联合去重
7. 连接查询
- 概念
- 分类
- 根据年代划分
- 根据连接方式划分
- 内连接
- 外连接
表1为主表
表2为主表
- 全连接(很少使用)
- 内连接和外连接的区别
- 对A,B两张表,使用内连接进行查询时,没有主次之分,查出的是A和B中所有能匹配上的数据
- 对A,B两张表,使用外连接查询时,若指定A为主表,B为副表,主要查询A中的数据,若B中没有与之匹配的数据,则自动在B表中生成NULL
8. 子查询
9. union
10. ⭐limit
11. 执行顺序
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
limit 7
...;
六、DDL
1. 创建表(create)
- 语法格式
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型,
...
);
- 常见的数据类型
int 整数型
bigint 长整型
float 浮点型
char 定长字符串
varchar 可变长字符串
date 日期类型
BLOB Binary Large OBject 二进制大对象,存储图片、视频等流媒体信息
CLOB Character Large OBject 字符大对象,可存储4G的字符串
- char和varchar的选择
- char适用于数据定长且不会发生改变,如日期、性别、生日等
- varchar适用于数据长度不确定,如简介、姓名等
- 约束(Constraint)
- 定义
创建表时给表中的字段添加的附加条件,目的在于保证表中数据的合法性、有效性、完整性
- 分类
- 唯一约束(unique)
约束的字段不能重复,但可以为NULL
create table 表名(
字段1 数据类型 unique,
字段2 数据类型,
字段3 数据类型,
...
);
create table 表名(
字段1 数据类型,
字段2 数据类型,
字段3 数据类型,
unique(字段1,字段2)
);
- ⭐主键约束(primary key)
约束的字段既不能为NULL,也不能重复
一张表只能有一个主键
create table 表名(
字段1 数据类型 primary key,
字段2 数据类型,
字段3 数据类型,
...
);
- 分类
- 主键字段的字段数量划分
- 单一主键(推荐)
- 复合组件(多个字段联合起来添加一个主键约束)
- 主键性质划分
- 主键自增
create table 表名(
字段1 数据类型 primary key auto_increment,
字段2 数据类型,
字段3 数据类型,
...
);
- ⭐外键约束(foreign key)
- 给表2中某个字段添加外键约束后,意味着表2的这个字段只能取引用表1的某个字段的值之一(引用了表1的某个字段),否则会报错,此时表1为父表,表2为子表(子用父的某个字段,这个字段就是外键约束)
- 创建表时先创建父表,再创建子表
- 删除表时先删除子表,再删除父表
- 添加数据时先添加父表,再添加子表
- 删除数据时先删除子表,再删除父表
create table 父表名(
父表字段1 数据类型,
父表字段2 数据类型,
父表字段3 数据类型,
...
);
create table 子表名(
子表字段1 数据类型,
子表字段2 数据类型,
子表字段3 数据类型,
foreign key(子表字段1) references 父表名(父表字段1)
);
- 外键可以为NULL
- 外键字段引用其他表的某个字段的时候,被引用的字段不一定是主键,但至少具有unique约束
- 检查约束(check):MySQL不支持检查约束,Oracle支持
2. 复制表
- 语法格式
create 表名 as select语句;
3. 删除表(drop)
- 语法格式
drop table if exists 表名
七、DML
1. 插入数据(insert)
- 语法格式
insert into 表名(字段1,字段2,字段3,...) values(值1,值2,值3,...)
insert into 表名 values(值1,值2,值3,...)
insert into 表名 values(值),(值),(值)...
要求:字段跟值的数量相等,并且数据类型要一致
注意:当一条insert语句执行完成后,表格就会多一行记录。即使多的这一行记录中某些字段是NULL,后期也无法再执行insert语句插入其他数据了,只能使用update进行更新
2. 修改数据(update)
3. 删除数据(delete)
- 语法格式
delete from 表名 where 条件
注意:没有条件,整张表全部删除
- 删除数据比较多的表
truncate table 表名
八、TCL
1. 事务(Transaction)

- 概念
一个事务是一个完整的业务逻辑单元,不可再分
事务就是多条DML语句捆绑在一起(insert、delete、update)
- 执行过程
- 提交:commit
- 回滚:rollback

- 特性
- 四大特性:ACID
- A:原子性:事务是最小的工作单元,不可再分
- C:一致性:事务必须保证多条DML语句同时成功或同时失败
- I:隔离性:事务A和事务B之间具有隔离
- D:持久性:最终数据必须持久化到硬盘文件中,事务才算成功的结束
九、数据库设计三范式
1. 第一范式
- 任何一张表都应该有主键,并且每一个字段原子性不可再分
2. 第二范式
- 建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖
- 多对多?三张表,关系表加两个外键

3. 第三范式
- 建立在第二范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖
- 一对多?两张表,多的表加外键
4. 一对一设计
