mysql新建关联表_MySQL多表创建关联及操作

本文详细介绍了在MySQL中如何创建和操作关联表,包括外键的概念、外键约束的声明、数据插入以及不同类型的表间关系。通过示例展示了如何在商品表和分类表之间建立一对多关系,确保数据完整性,并讲解了内连接、外连接和子查询等多表查询方法。
摘要由CSDN通过智能技术生成

外键

d47f3e700f6a381f737d96c10c59ab7c.png

现在有两张表“分类表”和“商品表”,为了表明商品属于哪个 类别,通常情况下,我们将在商品上添加一列,用来存放分类的cid信息,此列成为外键。

fa083c4e39249697e9f632f211618a2f.png

此时,分类表 category 称作主表,cid 成为主键。商品表 products 成为从表,category_id 成为外键。

通过主表和从表的外键描述主外键的关系,呈现的就是一对多的关系。

外键特点

1. 从表外键的值是对主键的引用。

2. 从表外键类型必须与主表主键类型一致。

声明外键约束

语法:

alter table 从表 add[constraint] [外键名称] foreign key (从表外键在字段名)references 主表(主表的主键);

[外键名称] 用于删除外键约束的,一般建议 “ _fk ”结尾。

alter table 从表 drop foreign key 外键名称

实际操作

创建数据库

89f59512cc7ed56575846aa877905d59.png

创建分类表

1.分类表

create table category(

cid varchar(32) primary key,

cname varchar(100)

);

087c0e7c0fbd9f0d81d95167ae05888f.png

创建商品表

2.商品表

create table product(

pid varchar(32) primary key,

pname varchar(40),

pricedouble,

category_id varchar(32)

);

979ea326148ad70fe554d17c389a8043.png

设置编码格式

set name gbk;

eeb94f089cdb27bd9c4de283f7f1bd54.png

添加点数据

insert into category(cid,cname) values('c001','家电');

insert into category(cid,cname) values('c002','服饰');

insert into category(cid,cname) values('c003','化妆品');

insert into product(pid,pname,price,category_id) values('p001','联想','5000','c001');

insert into product(pid,pname,price,category_id) values('p002','海尔','5000','c001');

insert into product(pid,pname,price,category_id) values('p003','雷神','5000','c001');

insert into product(pid,pname,price,category_id) values('p004','JACK JONES','800','c002');

insert into product(pid,pname,price,category_id) values('p005','真维斯','200','c002');

insert into product(pid,pname,price,category_id) values('p006','花花公子','440','c002');

insert into product(pid,pname,price,category_id) values('p007','劲霸','2000','c002');

insert into product(pid,pname,price,category_id) values('p008','香奈儿','800','c003');

insert into product(pid,pname,price,category_id) values('p009','相宜本草','200','c003');

8fb401379b01dd41a28fcb926083482e.png

最后一列 category_id 列在创建表的时候自己定义的,如果没有,则可以使用一下命令添加一列。

alter table product add category_id

链接两张表

alter table product add foreign key(category_id) references category(cid);

583d95c81b4833279a10a86f435cb63f.png

两张表已经关联,主表有外键约束。不能轻易删除主表数据,因为从表有他的记录。

要想解除关系,先删除从表对他有关系的数据删除,再删除主表数据。

使用外键的目的

保证数据的完整性。

注意事项

从表外键不能添加主表中不存在的记录。

主表不能删除从表中已经引用的记录。

表与表之间的关系

表语表之间的关系,说的就是表与表数据之间的关系。

一对多的关系

常见的实例:客户和订单,分类和商品,部门和员工。

一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表的主键。

alter table 从表 add [constraint][外键名称] foreign key(从表外键在字段名) references 主表(主表的主键);

26ba3549f9d34208732488fc4f4b55e8.png

多对多的关系

常见的实例:学生和课程,商品和订单,演员和角色。

多对多关系建立表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

5873303e2e7208ba3e59de79ceafc507.png

8353a7291752785319951d5065371c08.png

建立关系

alter table stu_course add foreign key(sno) references stu(sid);

alter table stu_course add foreign key(sno) references course(cid);

一对一关系(了解)

在实际开发中应用不多,因为一对一可以创建成一张表。

两种建表原则:

外键唯一:主表的主键和从简的外键唯一,形成主外键关系,外键唯一 unique。

外键是主键:主表的主键和从表的主键,形成主外键关系。

3f530c807619761538aafa17ccd7b533.png

多对多连接

实现如下表结构:

44fd38ca4646b7ad5a7e72662a37a794.png

创建订单表

create table orders(

oid varchar(32) primary key,

totalpricedouble);

4a90b7b293c74c3f361c1f78d63ecea5.png

创建经单项的表(中间表)

create table orderitem(

oid varchar(50),

pid varchar(50)

);

4ab91eb2fc3b079603275b2991e6e692.png

关联两张表

alter table orderitem add constraint orderitem_fk foreign key(oid) references orders(oid);

1957f402eee136ba5424bb2dcd51c8d8.png

alter table orderitem add constraint orderitem1_fk foreign key(pid) references product(pid);

321cf88b228ded5acac14bdec60d2a91.png

多表查询操作

1. 交叉连接查询(基本不会用到 - 得到的是两个表的乘积)

select * from A,B

select * from category,product;

6440e255b9334c099d0242e9c5a595a2.png

内容是乱的!第一张表3条数据,第二张表9条数据,一共 3*9 = 27 条数据。

2. 内连接查询(使用关键字 inner join   -- inner可以省略)

隐式内连接

select * from A,B where 条件

select * from category c,product p where c.cid = p.category_id;

624b81a5d15de6536b2bb9e32d0a7968.png

显式内连接

select * from A inner join B on 条件

select * from category inner join product on cid=category_id;

59a3b09fbd32ac08552777df3d832185.png

select * from category join product on cid=category_id;

c95cdffaae75af5f973f6bcc1d6f5d0e.png

3. 外连接查询(使用关键字 outer join   --outer可以省略)

左外连接:left outer join

select * from A left outer join B on 条件

select * from category left join product on cid=category_id;

175ac4924eb82b679118ba8d50574183.png

右外连接 right outer join

select * from A right outer join B on 条件;

select * from category right join product on cid=category_id;

ec35974ad8fd22d50402a6090a3d9d71.png

左右连接的区别:

左连接:左边的数据全部查出来。category数据全部出来。

右连接:右边的数据全部查出来。product数据全部出来。

9320b61ff04abfb049dff856b171e55c.png

子查询

将一条 select 语句查询的结果作为另一条 select 语法的一部分(查询条件,查询结果,表等)。

例如:查询化妆品分类中上架商品详情。

2c2dcc3752636a8d62a2892d45d60437.png

查询化妆品分类

select cid from category where cname='化妆品';

f7a84b3e951465db8ebd120f2e65235e.png

利用子查询实现需求

select * from product where category_id=(select cid from category where cname="化妆品");

a2a943dc4208210091afdaf2a739c1b2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值