1. 程式人生 > >多表查詢、外來鍵、表與表之間的關係

多表查詢、外來鍵、表與表之間的關係

外來鍵

通常在實際工作中,資料庫中表格都不是獨立存在的,且表與表之間是有種聯絡的,比如兩張表格,一張為分類表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";

例項:

  1. CREATE TABLE category(

  2. cid VARCHAR(32) PRIMARY KEY,

  3. cname VARCHAR(100)

  4. );

  5. DESC category;

  6. CREATE TABLE product(

  7. pid VARCHAR(32) PRIMARY KEY,

  8. pname VARCHAR(40),

  9. price DOUBLE,

  10. category_id VARCHAR(32)

  11. );

  12. INSERT INTO category(cid,cname) VALUES('c001','家電');

  13. INSERT INTO category(cid,cname) VALUES('c002','服飾');

  14. INSERT INTO category(cid,cname) VALUES('c003','化妝品');

  15. INSERT INTO product(pid,pname,price,category_id) VALUES('p001','聯想','5000','c001');

  16. INSERT INTO product(pid,pname,price,category_id) VALUES('p002','海爾','5000','c001');

  17. INSERT INTO product(pid,pname,price,category_id) VALUES('p003','雷神','5000','c001');

  18. INSERT INTO product(pid,pname,price,category_id) VALUES('p004','JACK JONES','800','c002');

  19. INSERT INTO product(pid,pname,price,category_id) VALUES('p005','真維斯','200','c002');

  20. INSERT INTO product(pid,pname,price,category_id) VALUES('p006','花花公子','440','c002');

  21. INSERT INTO product(pid,pname,price,category_id) VALUES('p007','勁霸','2000','c002');

  22. INSERT INTO product(pid,pname,price,category_id) VALUES('p008','香奈兒','800','c003');

  23. INSERT INTO product(pid,pname,price,category_id) VALUES('p009','相宜本草','200','c003');

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

表與表之間的關係:

1.一對多關係

一對多建表原則:在從表建立一個欄位,欄位作為外來鍵指向主表的主鍵

例項同上

2.多對多關係

多對多關係建表原則:需要建立第三張表,中間表中至少有兩個欄位,這兩個欄位分別作為外來鍵指向各自一方的主鍵。

例項:

  1. CREATE TABLE orders(

  2. oid VARCHAR(32) PRIMARY KEY,

  3. totalprice DOUBLE

  4. );

  5. CREATE TABLE orderitem(

  6. oid VARCHAR(50),

  7. pid VARCHAR(50)

  8. );

  9. CREATE TABLE product(

  10. pid VARCHAR(32) PRIMARY KEY,

  11. pname VARCHAR(40),

  12. price DOUBLE,

  13. category_id VARCHAR(32)

  14. );

  15. 訂單表和訂單項表的主外來鍵關係

  16. ALTER TABLE orderitem ADD CONSTRAINT orderitem_orders_fk FOREIGN KEY(oid) REFERENCES orders(oid);

  17. 商品表和訂單項表的主外來鍵關係

  18. ALTER TABLE orderitem ADD CONSTRAINT orderitem_product_fk FOREIGN KEY(pid) REFERENCES product(pid);

多表查詢

  1. 1.交叉連線查詢(一般不用)

  2. select * from A,B

  3. 2.內連線查詢(使用關鍵字inner join --inner可以省略)

  4. 隱式內連線:select * from A,B where 條件;

  5. 顯示內連線:selcet * from A inner join B on 條件;

  6. 3.外連線查詢:(使用關鍵字outer join --outer 可以省略)

  7. 左外連線:left outer join

  8. select * from A left outer join B on 條件;

  9. 右外連線: right outer join

  10. select * from A right outer join B on 條件;