MySQL【四】---案例实战{拆分多表、外键创建等}
1.準備數(shù)據(jù)
數(shù)據(jù)準備
create database jing_dong charset = utf8mb4;創(chuàng)建一個商品goods數(shù)據(jù)表:
create table goods( id int unsigned primary key auto_increment not null, name varchar(150) not null, cate_name varchar(40) not null, brand_name varchar(50) not null, price decimal(10,3) not null default 0,is_show bit not null default 1, is_saleoff bit not null default 0);分別表示id,名字,類別名,品牌名,價格,是否顯示,是否售罄。
插入數(shù)據(jù):
insert into goods values (0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default), (0,'y400n 14.0英寸筆記本電腦','筆記本','聯(lián)想','4999',default,default), (0,'g150th 15.6英寸筆記本','游戲本','雷神','8499',default,default), (0,'x550cc 15.6英寸筆記本','筆記本','華碩','2799',default,default), (0,'x240 超級本','超級本','聯(lián)想','4880',default,default), (0,'u330p 13.3英寸超級本','超級本','聯(lián)想','4299',default,default), (0,'svp13226scb 觸控超級本','超級本','索尼','7999',default,default), (0,'ipad mini 7.9英寸平板電腦','平板電腦','蘋果','1998',default,default), (0,'ipad air 9.7英寸平板電腦','平板電腦','蘋果','3388',default,default), (0,'ipad mini 配備retina顯示屏','平板電腦','蘋果','2788',default,default), (0,'ideacentre c340 20英寸一體電腦','臺式機','聯(lián)想','3499',default,default), (0,'vostro 3800-r1206 臺式電腦','臺式機','戴爾','2899',default,default), (0,'imac me086ch/a 21.5英寸一體電腦','臺式機','蘋果','9188',default,default), (0,'at7-7414lp 臺式電腦 linux','臺式機','蘋果','3699',default,default), (0,'z220sff f4f06pa工作站','服務器/工作站','惠普','4288',default,default), (0,'powereedge ii服務器','服務器/工作站','戴爾','5388',default,default), (0,'mac pro專業(yè)級臺式電腦','服務器/工作站','蘋果','28888',default,default), (0,'hmz-t3w 頭戴顯示設備','筆記本配件','索尼','6999',default,default), (0,'商務雙肩背包','筆記本配件','索尼','99',default,default), (0,'x3250 m4機架式服務器','服務器/工作站','ibm','6888',default,default), (0,'商務雙肩背包','筆記本配件','索尼','99',default,default);查看數(shù)據(jù)表:
2. SQL語句實戰(zhàn):
1查找超級本:select * from goods where cate_name='筆記本'; select name,price from goods where cate_name='筆記本'; select name as 商品名稱,price as 商品價格 from goods where cate_name='筆記本'; 2查看品牌的分類:select distinct brand_name from goods;select brand_name from goods group by brand_name;?
select brand_name,group_concat(name) from goods group by brand_name;?group by功能對于后續(xù)更加強大。
求所有電腦的平均價格: select avg(price) from goods;求所有電腦的平均價格并保留2位小數(shù):select round(avg(price),2) from goods; 顯示每種商品的平均價格:select cate_name,avg(price) from goods group by cate_name; 顯示每種類型的商品中,最貴、最便宜、平均價、數(shù)量: select cate_name,max(price) as 最貴,min(price) as 最便宜,avg(price) as 平均,count(*) as 數(shù)量 from goods group by cate_name;- ?查詢所有價格大于平均價格的商品,并且按價格降序排序:
- ?查詢每種最貴的商品的信息:
首先得到每種最貴價格電腦:
select cate_name,max(price) from goods group by cate_name;?然后將最大值表和原表關(guān)聯(lián)【可以inner join 或者 left join? ?on】
left join on方法:
select * from (select cate_name,max(price) as max_price from goods group by cate_name) as g_new left join goods as g on g_new.cate_name=g.cate_name and g_new.max_price=g.price;?來寫一個綜合的:
select * from goods inner join( select cate_name,max(price) as max_price,min(price) as min_price,avg(price) as avg_price,count(*) as num from goods group by cate_name) as goods_new on goods_new.cate_name=goods.cate_name and goods_new.max_price=goods.price;?如果出現(xiàn)相同的價格則需要,對品牌進行排序();
select g_new.cate_name,g.name,g.price from (select cate_name,max(price) as max_price from goods group by cate_name) as g_new left join goods as g on g_new.cate_name=g.cate_name and g_new.max_price=g.price order by g_new.cate_name;顯示信息篩選一下:
3. 拆分為多個表(商品分類表)
所有數(shù)據(jù)都在一個表中會導致修改麻煩,
create table if not exists goods_cates(id int unsigned primary key auto_increment,name varchar(40) not null);if not exists 如果表存在則不建立,不存在則建立。
3.1 去重復存儲---分組:
查詢goods表中商品的種類
select cate_name from goods group by cate_name;把name插入即可;
- ?將分組結(jié)果寫入到goods_cates數(shù)據(jù)表中
**注意這里不用values
select * from goods_cates;?之后把主表中的cate_name 改成新建的goods_cates的Id
SET是SQL Server 中對已經(jīng)定義的變量賦值的方式,經(jīng)常與update語句一起使用。
3.2同步表數(shù)據(jù)
通過goods_cates數(shù)據(jù)表來更新goods表
update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;關(guān)聯(lián)修改成功:
?3.3 修改表結(jié)構(gòu)
?同時發(fā)現(xiàn)對應表類型不同
- ?更改表結(jié)構(gòu):
寫:int unsigned? 保證表結(jié)構(gòu)相同都是 int類型且數(shù)值范圍相同,
- ?設置外鍵
關(guān)聯(lián)cate_id和表goods_cate的id
外鍵約束也可以在修改表時添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)。
在修改數(shù)據(jù)表時添加外鍵約束的語法格式如下:
ALTER TABLE <數(shù)據(jù)表名> ADD CONSTRAINT <外鍵名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);- 刪除外鍵約束
當一個表中不需要外鍵約束時,就需要從表中將其刪除。外鍵一旦刪除,就會解除主表和從表間的關(guān)聯(lián)關(guān)系。
刪除外鍵約束的語法格式如下所示:
約束如下:
alter table goods add foreign key (cate_id) references goods_cates(id);通過cate_id關(guān)聯(lián)到goods_cates中的id。
這樣保證數(shù)據(jù)唯一性,插入數(shù)據(jù)不會越界。
3.4 修改brands_name品牌如上述
- 創(chuàng)建表和插入數(shù)據(jù)一起操作
需要注意:brand_name as name? ?需要與創(chuàng)建一致
- ?同步數(shù)據(jù)(關(guān)聯(lián))
- ?修改表結(jié)構(gòu)【修改名字+類型】
- ?添加外鍵
可以看到約束(外鍵)
如何取消外鍵約束呢?
show create table goods;alter table goods drop foreign key 外鍵名稱;外鍵名稱
alter table goods drop foreign key goods_ibfk_1;在實際開發(fā)中,很少使用外鍵約束,會極大的降低表更新效率;
mysql存儲在硬盤上,性能比較差,cpu>內(nèi)存>固態(tài)>機械硬盤:
總結(jié)
以上是生活随笔為你收集整理的MySQL【四】---案例实战{拆分多表、外键创建等}的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第八周 谈谈后期——数码暗房为照片增色
- 下一篇: pymysql模块和SQL注入