1. 程式人生 > >MYSQL多表的建表的操作

MYSQL多表的建表的操作

需求:

分類表和商品表之間是不是有關係? 如果有關係,在資料庫中如何表示這種關係 ​

技術分析:多表之間的關係如何來維護

外來鍵約束: foreign key

  • 給product中的這個cno 新增一個外來鍵約束:alter table product add foreign key(cno) references category(cid);
  • 刪除的時候, 先刪除外來鍵關聯的所有資料,再才能刪除分類的資料

建資料庫原則:

通常情況下,一個專案/應用建一個數據庫

多表之間的建表原則

  • 一對多 : 商品和分類

建表原則: 在多的一方新增一個外來鍵,指向一的一方的主鍵

  • 多對多: 老師和學生, 學生和課程

建表原則: 建立一張中間表,將多對多的關係,拆分成一對多的關係,中間表至少要有兩個外來鍵,分別指向原來的那兩張表

  • 一對一: 班級和班長, 公民和身份證, 國家和國旗

建表原則:直接將兩張表合併成一張表

約束

  • 主鍵約束: 預設就是不能為空, 唯一

外來鍵都是指向另外一張表的主鍵

主鍵一張表只能有一個

  • 唯一約束: 列面的內容, 唯一, 不能出現重複情況, 為空

唯一約束不可以作為其它表的外來鍵

可以有多個唯一約束

網上商城表例項的分析: 使用者購物流程​

  • 使用者表 (使用者的ID,使用者名稱,密碼,手機)
create table user(
    uid int primary key auto_increment,
    username varchar(31),
    password varchar(31),
    phone  varchar(11)
);
​
insert into user values(1,'zhangsan','123','13811118888');
  • 訂單表 (訂單編號,總價,訂單時間 ,地址,外來鍵使用者的ID)
  create table orders(
    oid int primary key auto_increment,
        sum int not null,
      otime timestamp,
        address varchar(100),
        uno int,
        foreign key(uno) references user(uid)
  );
  insert into orders values(1,200,null,'黑馬前臺旁邊小黑屋',1);
  insert into orders values(2,250,null,'黑馬後臺旁邊1702',1);

 

  • 商品表 (商品ID, 商品名稱,商品價格,外來鍵cno)
create table product(
    pid int primary key auto_increment,
    pname varchar(10),
    price double,
    cno int,
    foreign key(cno) references category(cid)
);
​
insert into product values(null,'小米mix4',998,1);
insert into product values(null,'錘子',2888,1);
insert into product values(null,'阿迪王',99,2);
insert into product values(null,'老村長',88,3);
insert into product values(null,'勁酒',35,3);
insert into product values(null,'小熊餅乾',1,4);
insert into product values(null,'衛龍辣條',1,5);
insert into product values(null,'旺旺大餅',1,5);
  • 訂單項: 中間表(訂單ID,商品ID,商品數量,訂單項總價)
create table orderitem(
    ono int,
    pno int,
    foreign key(ono) references orders(oid),
    foreign key(pno) references product(pid),
    ocount int,
    subsum double
);
--給1號訂單新增商品 200塊錢的商品
insert into orderitem values(1,7,100,100);
insert into orderitem values(1,8,101,100);
​
--給2號訂單新增商品 250塊錢的商品 ()
insert into orderitem values(2,5,1,35);
insert into orderitem values(2,3,3,99);
  • 商品分類表(分類ID,分類名稱,分類描述)
create table category(
    cid int primary key auto_increment,
    cname varchar(15),
    cdesc varchar(100)
);
​
insert into category values(null,'手機數碼','電子產品,黑馬生產');
insert into category values(null,'鞋靴箱包','江南皮鞋廠傾情打造');
insert into category values(null,'香菸酒水','黃鶴樓,茅臺,二鍋頭');
insert into category values(null,'酸奶餅乾','娃哈哈,蒙牛酸酸乳');
insert into category values(null,'饞嘴零食','瓜子花生,八寶粥,辣條');

 

交叉連線查詢  笛卡爾積

SELECT * FROM product;
SELECT * FROM category;

笛卡爾積 ,查出來是兩張表的乘積 ,查出來的結果沒有意義
SELECT * FROM product,category;

--過濾出有意義的資料
SELECT * FROM product,category WHERE cno=cid;

SELECT * FROM product AS p,category AS c WHERE p.cno=c.cid;
SELECT * FROM product p,category c WHERE p.cno=c.cid;
--資料準備
INSERT INTO product VALUES(NULL,'耐克帝',10,NULL);

內連線查詢

隱式內連結
  SELECT * FROM product p,category c WHERE p.cno=c.cid;
-- 顯示內連結
  SELECT * FROM product p INNER JOIN category c ON p.cno=c.cid;    
-- 區別:
    隱式內連結: 在查詢出結果的基礎上去做的WHERE條件過濾
    顯示內連結: 帶著條件去查詢結果, 執行效率要高

左外連線

左外連線,會將左表中的所有資料都查詢出來, 如果右表中沒有對應的資料,用NULL代替

SELECT * FROM product p LEFT OUTER JOIN category c ON p.cno=c.cid;

- 準備工作
  INSERT INTO category VALUES(100,'電腦辦公','電腦叉叉差');

右外連線

右外連線: 會將右表所有資料都查詢出來, 如果左表沒有對應資料的話, 用NULL代替
  SELECT * FROM product p RIGHT OUTER JOIN category c ON p.cno=c.cid;