关系型数据库的范式(设计标准)
第一范式 1NF
第二范式 2NF
定义
-
在1NF的基础上,要有键(键可由多个字段组合)
-
所有字段分别完全依赖于键
-
如果键是多个字段组合,则不允许部分依赖于该键
依赖关系
-
给出键,就能唯一确定字段的值
-
如给出学号,就能唯一确定的姓名,反之则不行
-
则称姓名依赖于学号
不满足第二范式的地方
-
上表的键为(学号,课名)
-
但存在部分依赖:姓名依赖于学号
第三范式3FN
定义(不标准)
-
一个表里不能有两层依赖
-
给出学号,就能确定系名:系名依赖于学号
-
给出系名,就能确定系主任:系主任依赖于系名
-
所以,系主任间接依赖于学号
解决办法
- 把系名和系主任单独建表
数据库设计经验
高内聚
-
把相关的字段放在一起,不相关的分开建表
-
如果两个字段能够单独建表,那就单独建表
低耦合
-
如果两个表之间有弱关系
-
一对一可放在一个表,也可两个表加外键
-
一对多一般用外键
-
多对多一般建中间表
JOIN
链接表
-
inner join
-
left join
-
right join
-
full outer join
语法
把报名改为T1{[INNER]|{LEFT|RIGHT}FULL}[OUTER]}JOIN T2 ON boolean_expression
启动 mysql
docker container start mysql1
或者
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.28
进入 mysql
docker exec -it mysql1 bash
mysql -u root -p
输入密码 123456
创建数据库
CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
show databases;
use db1;
创建表
create table users(id serial, name text);
create table staffs(id serial, name text);
create table orders(id serial, user_id bigint unsigned, staff_id bigint unsigned, amount int unsigned);
创建记录
insert into users (name) values ('XiaoMing');
insert into staffs (name) values ('XiaoHong');
insert into orders(user_id,staff_id, amount) values (1,1, 100);
使用 inner join
select users.name as uname, orders.amount as amount from users inner join orders on users.id =orders.user_id;
得到 XiaoMing 100
start transaction;
语句1; 语句2; 语句3;
commit;
其他join
Left join
- 会保留右边的null,以保证左边都显示
Right join
- 会保留左边的null,以保证右边都显示
Full outer join
- 保留两边的null,以保证两边都显示