多表查詢、外來鍵、表與表之間的關係
外來鍵
通常在實際工作中,資料庫中表格都不是獨立存在的,且表與表之間是有種聯絡的,比如兩張表格,一張為分類表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 條件;