数据库之表结构优化
準備數(shù)據(jù)
create table goods(
? ? id int unsigned primary key auto_increment,
? ? name varchar(150),
? ? cate varchar(40),
? ? brand_name varchar(40),
? ? price decimal(10,3) default 0,
? ? is_show bit default 1,
? ? is_saleoff bit default 0
);
insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default);?
insert into goods values(0,'y400n 14.0英寸筆記本電腦','筆記本','聯(lián)想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戲本','游戲本','雷神','8499',default,default);?
insert into goods values(0,'x550cc 15.6英寸筆記本','筆記本','華碩','2799',default,default);?
insert into goods values(0,'x240 超極本','超級本','聯(lián)想','4999',default,default);?
insert into goods values(0,'u330p 13.3英寸超極本','超級本','聯(lián)想','4299',default,default);?
insert into goods values(0,'svp13226scb 觸控超極本','超級本','索尼','7999',default,default);?
insert into goods values(0,'ipad mini 7.9英寸平板電腦','平板電腦','蘋果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板電腦','平板電腦','蘋果','3388',default,default);?
insert into goods values(0,'ipad mini 配備 retina 顯示屏','平板電腦','蘋果','2788',default,default);?
insert into goods values(0,'ideacentre c340 20英寸一體電腦 ','臺式機','聯(lián)想','3499',default,default);?
insert into goods values(0,'vostro 3800-r1206 臺式電腦','臺式機','戴爾','2899',default,default);?
insert into goods values(0,'imac me086ch/a 21.5英寸一體電腦','臺式機','蘋果','9188',default,default);?
insert into goods values(0,'at7-7414lp 臺式電腦 linux )','臺式機','宏碁','3699',default,default);?
insert into goods values(0,'z220sff f4f06pa工作站','服務(wù)器/工作站','惠普','4288',default,default);?
insert into goods values(0,'poweredge ii服務(wù)器','服務(wù)器/工作站','戴爾','5388',default,default);?
insert into goods values(0,'mac pro專業(yè)級臺式電腦','服務(wù)器/工作站','蘋果','28888',default,default);?
insert into goods values(0,'hmz-t3w 頭戴顯示設(shè)備','筆記本配件','索尼','6999',default,default);?
insert into goods values(0,'商務(wù)雙肩背包','筆記本配件','索尼','99',default,default);?
insert into goods values(0,'x3250 m4機架式服務(wù)器','服務(wù)器/工作站','ibm','6888',default,default);?
insert into goods values(0,'hmz-t3w 頭戴顯示設(shè)備','筆記本配件','索尼','6999',default,default);?
insert into goods values(0,'商務(wù)雙肩背包','筆記本配件','索尼','99',default,default);
查詢演練
求所有電腦產(chǎn)品的平均價格,并且保留兩位小數(shù)
select round(avg(price),2) as avg_price from goods;
查詢所有價格大于平均價格的商品,并且按價格降序排序
select id,name,price from goods?
where price > (select round(avg(price),2) as avg_price from goods)?
order by price desc;
查詢類型為'超極本'的商品價格
select price from goods where cate = '超級本';
查詢價格大于或等于"超級本"價格的商品,并且按價格降序排列
select id,name,price from goods?
where price = any(select price from goods where cate = '超級本')
order by price desc;
= any 或者 =some 等價 in
select id,name,price from goods?
where price in (select price from goods where cate = '超級本')
order by price desc;
!=all 等價于 not in
select id,name,price from goods?
where price not in (select price from goods where cate = '超級本')
order by price desc;
數(shù)據(jù)分表
創(chuàng)建“商品分類”表
create table if not exists goods_cates(
? ? cate_id int unsigned primary key auto_increment,
? ? cate_name varchar(40)
);
查詢goods表的所有記錄,并且按"類別"分組
select cate from goods group by cate;
將分組結(jié)果寫入到goods_cates數(shù)據(jù)表
insert into goods_cates (cate_name) select cate from goods group by cate;
通過goods_cates數(shù)據(jù)表來更新goods表
update goods as g inner join goods_cates as c on g.cate = c.cate_name?
set cate = cate_id;
通過create...select來創(chuàng)建數(shù)據(jù)表并且同時寫入記錄,一步到位
create table goods_brands (
? ? brand_id int unsigned primary key auto_increment,
? ? brand_name varchar(40)) select brand_name from goods group by brand_name;
通過goods_brands數(shù)據(jù)表來更新goods數(shù)據(jù)表
update goods as g inner join goods_brands as b on g.brand_name = b.brand_name
set g.brand_name = b.brand_id;
查看 goods 的數(shù)據(jù)表結(jié)構(gòu),會發(fā)現(xiàn) cate 和 brand_name對應(yīng)的類型為 varchar 但是存儲的都是字符串
修改數(shù)據(jù)表結(jié)構(gòu),把cate字段改為cate_id且類型為int unsigned,把brand_name字段改為brand_id且類型為int unsigned
經(jīng)過優(yōu)化,在goods表中cate和brand沒有冗余數(shù)據(jù)
分別在 good_scates 和 goods_brands表中插入記錄
insert into goods_cates(cate_name) values ('路由器'),('交換機'),('網(wǎng)卡');
insert into goods_brands(brand_name) values ('海爾'),('清華同方'),('神舟');
在 goods 數(shù)據(jù)表中寫入任意記錄
insert into goods (name,cate_id,brand_id,price)
values('LaserJet Pro P1606dn 黑白激光打印機','12','4','1849');
查詢所有商品的詳細信息 (通過內(nèi)連接)
select id,name,cate_name,brand_name,price from goods as g
inner join goods_cates as c on g.cate_id = c.cate_id
inner join goods_brands as b on g.brand_id = b.brand_id;
查詢所有商品的詳細信息 (通過左連接)
select id,name,cate_name,brand_name,price from goods as g
left join goods_cates as c on g.cate_id = c.cate_id
left join goods_brands as b on g.brand_id = b.brand_id;
查詢所有商品的詳細信息 (通過右連接)
select id,name,cate_name,brand_name,price from goods as g
right join goods_cates as c on g.cate_id = c.cate_id
right join goods_brands as b on g.brand_id = b.brand_id;
總結(jié)
- 上一篇: macOS万能音视频转换器-Permut
- 下一篇: 破解精益生产管理DNA