2_數據庫(二)

數據庫(二)

多表操作
 
1.多表之間如何操作
select [distinct] [*] [列名,列名2] from 表名 [where 條件]
distinct: 去除重複的數據
 
 
--商品分類: 手機數碼, 皮靴箱包
1.分類ID
2.分類名稱
3.分類描述
Create table category (
    cid int primary key auto_increment,
    cname varchar(10),
    cdesc varchar(30)
);
 
 
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 * form category;
select cname,cdesc from category;
 
 
--所有商品
1.商品ID
2.商品名稱
3.商品價格
4.商品數量
5.生產日期 (時間戳,默認當前時間)
6.商品分類ID
 
 
商品和商品分類: 所屬關係
 
 
create table product(
    pid int primary key auto_increment,
    pname varchar(10) ,
    price double,
    pdate timestamp,       
    cno int
);
 
 
insert into product values(null, '小米mix8',998,null,1);
insert into product values(null, '錘子',2888,null,1);
insert into product values(null, '阿迪王',99,null,2);
insert into product values(null, '老白乾',598,null,3);
insert into product values(null, '敬酒',298,null,3);
insert into product values(null, '小熊餅乾',1,null,4);
insert into product values(null, '衛龍辣條',3,null,5);
技術分析:
 
多表之間如何維護?
--外鍵約束 :foreign key
  •     給product表加外鍵約束
    alter table product add foreign key(cno) references category(cid);
 
  •     自己挖坑
  •      從分類中刪除分類信息爲5
    • delete from category where cid = 5; //刪除失敗
    • 首先刪除product 中所有分類id爲 5 的商品
--添加一個外鍵: alter table product add foreign key(cno) references category(cid);
  • foreign key(cno) references category (cid);
  • 刪除的時候,先刪除關聯的所有數據,才能刪除分類數據
 
--建數據庫原則:
  • 通常情況下一個項目建一個數據庫
 
--多表之間建表原則
 
  • 一對多: 商品和分類
    • 建表原則: 在的一方添加一個外鍵  指向一的一方的主鍵
  • 多對多: 老師和學生, 學生和課程
    • 建表原則: 建立一張中間表, 將多對多拆稱  兩個一對多, 中間表至少有兩個外鍵指向原來兩張表
  • 一對一: 班級和班長, 公民和身份證, 國家和國旗
    • 將一對一的情況當作是一對多情況處理,在任何一張表添加一個外鍵,並且這個外鍵唯一指向另一張表
    • 直接將兩張表合併
    • 將兩張表的主鍵建立起鏈接,讓兩張表裏面主鍵相等
    實際用途: 用的不是很多( 拆表操作 )
        相親網站: 
            個人信息: 姓名,年齡,身高,體重,興趣愛好( 年收入,特長,學歷,職業 )
            拆表操作: 將個人常用信息和不常用信息分開, 減少表的臃腫
 
--主鍵約束和唯一約束的區別?
    主鍵約束: 
                    默認不能爲空, 唯一的
                    外鍵指向另一張表的主鍵
                    一張表只有一個主鍵約束
    唯一約束
                    列裏面的內容,必須是唯一的,不能重現重複情況, 可以爲空
                    唯一約束不能作爲其他表的主鍵
                    一張表能有多個唯一約束
 
2.商城案例分析
  • 用戶表( 用戶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', '13800000000');
 
  • 訂單表(訂單編號, 總價 ,訂單時間, 地址,外鍵用戶的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,'黑馬後臺',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, '小米mix8',998,1);
insert into product values(null, '錘子',2888,1);
insert into product values(null, '阿迪王',99,2);
insert into product values(null, '老白乾',598,3);
insert into product values(null, '敬酒',298,3);
insert into product values(null, '小熊餅乾',1,4);
insert into product values(null, '衛龍辣條',3,5);
 
  • 商品分類表( 分類ID,分類名稱,分類描述 )
create table category(
    cid int primary key auto_increment,
    cname varchar(31),
    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, '饞嘴零食','花生瓜子八寶粥');
  • 訂單項 中間表( 訂單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
);
--給一號訂單添加商品
    insert into orderitem values(1, 6 , 101 ,101);
    insert into orderitem values(1, 3, 1, 99);
 
--給二號訂單添加商品
    insert into orderitem values(2, 7 ,50 ,150);
    insert into orderitem values(2 , 6,100,100);
 
3.多表查詢
  • 交叉連接查詢  笛卡爾積
select * from product;
select * from category;
 
笛卡爾積,兩張表的乘積, 並沒有意義
select * from product , category;
 
--過濾出有意義的數據
select * from product As p,category As c where p.cno = c.cid;
select * from product  p,category  c where p.cno = c.cid;
  • 內連接查詢
--隱式內連接
select * from product  p,category  c where p.cno = c.cid;
--顯示內連接
select * from product inner join category on cno = cid;
--結果沒有區別
區別: 
    --隱式內連接: 在查詢出結果的基礎上去做的where 條件過濾
    --顯式內連接: 帶着條件去查詢結果的( 執行效率要高 )
  • 左外連接
--數據準備
INSERT INTO product VALUES(NULL,'耐克帝',10,NULL);
 
--左外連接會將左表中所有的信息都查詢出來, 如果右表中沒有對應數據, 用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;
4.分頁查詢
  • 每頁數據10條
  • 起始索引從0
  • 第一頁: 0
  • 第二頁: 11
    起始索引: index代表顯示第幾頁
    每頁顯示3條數據
    startindex = (index - 1) * 3;    0,3,6,9.....
第一個參數: 索引
第二個參數: 個數
select * from product limit 0,3;
select * from product limit 3,3;
 
5.子查詢(瞭解)
  • 查詢出(商品名稱,商品分類名稱) 信息
--左連接
select p.pname, c.cname from product p left outer join category c  on p.cno = c.cid;
 
--子查詢
select pname,(select cname from category c where p.cno = c.cid ) from product p;
  • 查詢分類名稱爲手機數碼的所有商品
select * from product where cname = '手機數碼' ;  × 
 
 1.查詢出分類名稱爲手機數碼的ID
    select cid from category where cname = '手機數碼';
2.得出ID爲1的結果
    select * from product where cno = 1;
 
    select * from product where cno =   (select cid from category where cname = '手機數碼');
 
 
 
 
 
 
 
 
 
 
 
發佈了47 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章