多表查询、外键、表与表之间的关系

外键


通常在实际工作中,数据库中表格都不是独立存在的,且表与表之间是有种联系的,比如两张表格,一张为分类表category,一张为商品表product。在分类表中有两个信息,cid、cname,商品表中有三个数据信息pid、name、price。两张表要想有着某种联系,需要设定主键和外键两个属性,其中在分类表(主表)中将cid设置为主键商品表(从表)中pid设置为外键

外键特点:

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

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

声明外键约束:

alter table produnct add constraint key_fk(外键名称) foreign key category_id(从表外键字段名) references category(cid);

外键名称用于删除外键约束时使用,也可不设置,一般建议“_fk”为结尾。

删除外键约束

alter table product drop foreign key key_fk;

在不接触外键约束时,主表不能直接删除与从表有约束关系的数据信息,如:

delete from category where cid="XXX";

实例:

CREATE TABLE category(
	cid VARCHAR(32) PRIMARY KEY,
	cname VARCHAR(100)
);
DESC category;
CREATE TABLE product(
	pid VARCHAR(32) PRIMARY KEY,
	pname VARCHAR(40),
	price DOUBLE,
	category_id VARCHAR(32)
);
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');

ALTER TABLE product ADD CONSTRAINT key_fk FOREIGN KEY(category_id) REFERENCES category(cid); 

表与表之间的关系:

1.一对多关系

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

实例同上

2.多对多关系

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

实例:

CREATE TABLE orders(
	oid VARCHAR(32) PRIMARY KEY,
	totalprice DOUBLE
);

CREATE TABLE orderitem(
	oid VARCHAR(50),
	pid VARCHAR(50)
);

CREATE TABLE product(
	pid VARCHAR(32) PRIMARY KEY,
	pname VARCHAR(40),
	price DOUBLE,
	category_id VARCHAR(32)
);

订单表和订单项表的主外键关系
ALTER TABLE orderitem ADD CONSTRAINT orderitem_orders_fk FOREIGN KEY(oid) REFERENCES orders(oid);

商品表和订单项表的主外键关系
ALTER TABLE orderitem ADD CONSTRAINT orderitem_product_fk FOREIGN KEY(pid) REFERENCES product(pid);

多表查询

1.交叉连接查询(一般不用)
select * from A,B
2.内连接查询(使用关键字inner join --inner可以省略)
隐式内连接:select * from A,B where 条件;
显示内连接:selcet * from A inner join B on 条件;
3.外连接查询:(使用关键字outer join --outer 可以省略)
左外连接:left outer join
select * from A left outer join B on 条件;
右外连接: right outer join
select * from A right outer join B on 条件;

    原文作者:xiaoyuxianshenging
    原文地址: https://blog.csdn.net/xiaoyuxianshenging/article/details/76280614
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞