0302-表的映射关系及简单SQL语句

文章讨论了数据库中表与表之间的四种关系映射基数,包括一对一、一对多、多对一和多对多,并提供了相应的表设计示例。对于多对多关系,需要创建关系表来处理。此外,文章还介绍了SQL的基本操作,如INSERT、UPDATE和DELETE语句,以及如何使用序列对象和默认值插入数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 表与表之间关系的映射基数

在数据库中映射基数就四种情况:
一对一,一对多,多对一,多对多。


一对一映射:

当我们发现有二张表之间的关系是一对一映射时,可以合成一张表。

例:
---- 一个用户只能办理一张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,'甜点');

使用序列对象:

  1. 创建序列对象:
    在这里插入图片描述
  2. 序列的使用:
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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值