- 表与表之间关系的映射基数
在数据库中映射基数就四种情况:
一对一,一对多,多对一,多对多。
一对一映射:
当我们发现有二张表之间的关系是一对一映射时,可以合成一张表。
例:
---- 一个用户只能办理一张VIP卡。
---------- 第一种方案: 合成一张表。如何选择主键。一定看业务逻辑。
---------- 第二种方案: 就二张表。共享主键。A表的主键同时也是引用B表的外键(VIP表的主键也是外键,受用户id约束)。
一对多和多对一:
例如:商品与类型。
(商品) N : 1 (类型)
解释:一个商品只能属于一种类型。一种类型下可以有多种商品。
商品与类型之间是多对一。
类型与商品之间是一对多。
一对多 和 多对一 一定是两张表。
一定是(多)的表 中 加外键 ,引用 (一)的表。
多对多映射:
例如:订单与商品
(订单) M : N (商品)
一个订单可以订购多个商品;一个商品可以被多个订单订购。
订单与商品之间就是多对多关系。
多对多的关系不能只依靠两张表处理,需要创建第三张关系表。将多对多。拆分成两个 多对一的关系。
PS:第三张关系表中必须有两张表的外键。
- 一个案例:三范式规范表结构
总表:将这张表进行拆分
拆分之后如下所示:
-员工表:
因为姓名,年龄,地址和入职时间是直接依赖于员工编号的,所以将他们划分到一个表中。(因为一个员工对应一个职务,而一个职务可以有多个员工,所以员工为“多”的一方,所以在员工表中设置外键来引用职务编号约束)
-职务表:
基本工资是依赖于职务的而职务又依赖于员工编号,所以将这两条属性从原表中划分出来到一个表中。
-项目表:
此处的项目和身份为多对多的关系(一个项目可以有多个身份来完成,而一个身份也可以完成多个项目),所以将这两条属性单独摘列出来,用第三张表(关系表)来进行连接。
-身份表:
此表存放的是身份信息。
-关系表:
此表中,有员工编号和项目编号两个外键,分别受项目表中的项目编号约束和身份表中的身份编号约束。此外还有一些属性依赖于员工编号和项目编号,但不依赖于员工表中的员工编号,所以放在此关系表中。
- SQL 命令
SQL 叫什么?
SQL 结构化查询语言。一种解释型语言。语法结构简单。
SQL92 是一种标准。所有数据库厂商使用 SQL 语句标准。
一般数据库厂商也会在SQL92标准之上扩展一些自己的内容。例如函数。
例如:
SQL92标准:count(*)。
Oracle扩展:to_date(),to_char()
insert 语句:
------用来向数据库表中插入记录。
insert into 表名(列名,列名) values (值,值);
--例:
insert into type_no5(type_id,type_name) values (3,'甜点');
使用序列对象:
- 创建序列对象:
- 序列的使用:
select seq01.nextval from dual;
序列对象 .nextval 表示的是获取序列的下一个值。
dual 是系统提供的一张虚拟表。
PS:因为 Oracle 数据库不支持只有 select 语句的格式。
所以这种写法是错误的: select seq01.nextval (错)
序列的具体使用如下所示:
insert into type_no5(type_id,type_name) values(seq01.nextval,'甜点')
主要针对无意义的主键字段。
插入时使用默认值:
方式一:使用 default 关键字
insert into goods(goods_id,goods_name,goods_price,goods_desc,goods_type_id)
values (seq01.nextval,'小米手机',3.0,default,1)
方式二:不为对应字段插入数据
insert into goods(goods_id,goods_name,goods_price,goods_desc,goods_type_id)
values (seq01.nextval,'小米手机',3.0,1)
update 语句:
Update 语句叫更新
update 表名 set 列 = 值 , 列 = 值 where 条件;
满足条件的记录将被更新。
update goods set goods_name='小米6',goods_price=3999 where goods_id=12;
delete 语句:
删除记录的语句。
delete from 表名 where 条件;
具体实例如下:
delete from goods where goods_id=14;