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;