出处:https://blog.csdn.net/xiaoyuxianshenging/article/details/76280614
外键
通常在实际工作中,数据库中表格都不是独立存在的,且表与表之间是有种联系的,比如两张表格,一张为分类表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)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
DESC category;
-
CREATE TABLE product(
-
pid VARCHAR(32) PRIMARY KEY,
-
pname VARCHAR(40),
-
price DOUBLE,
-
category_id VARCHAR(32)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
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 条件;