mysql之外键以及小练习
外鍵
是對插入更新的數據進行驗證 配合主鍵使用
舉例:
一對多 學生和班級表 多個學生 可能是一個班級里 此時學生表的cid和班級表的id是對應關系的,方便使用連接特性查詢,此時若學生表插入一條數據cid不存在與班級表,無外鍵約束的話是可以插入的,這樣就不能一一對應起來!
后期添加外鍵
alter table students add foreign key(cls_id) references classes(id);定義表添加外鍵
-- 創建學校表 create table school(id int not null primary key auto_increment, name varchar(10) );-- 創建老師表 create table teacher(id int not null primary key auto_increment, name varchar(10), s_id int not null, foreign key(s_id) references school(id) );學生表 添加cid 方便與班級表對應,此時可以再學生表定義或者后期進行添加外鍵。
對于學生來說外鍵就是cid 引用班級表的id
注意 當添加外鍵后表中都無數據,一定要先給引用表添加數據,不然給學生表先添加數據時候 在沒有對應的cid會報錯!
刪除外鍵
-- 需要先獲取外鍵約束名稱,該名稱系統會自動生成,可以通過查看表創建語句來獲取名稱 show create table teacher;-- 獲取名稱之后就可以根據名稱來刪除外鍵約束 alter table teacher drop foreign key 外鍵名;?訓練
-- 創建 "京東" 數據庫 create database jing_dong charset=utf8;-- 使用 "京東" 數據庫 use jing_dong;-- 創建一個商品goods數據表 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(40) not null,price decimal(10,3) not null default 0,is_show bit not null default 1,is_saleoff bit not null default 0 ); -- 向goods表中插入數據insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default); insert into goods values(0,'y400n 14.0英寸筆記本電腦','筆記本','聯想','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 超極本','超級本','聯想','4880',default,default); insert into goods values(0,'u330p 13.3英寸超極本','超級本','聯想','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英寸一體電腦 ','臺式機','聯想','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工作站','服務器/工作站','惠普','4288',default,default); insert into goods values(0,'poweredge ii服務器','服務器/工作站','戴爾','5388',default,default); insert into goods values(0,'mac pro專業級臺式電腦','服務器/工作站','蘋果','28888',default,default); insert into goods values(0,'hmz-t3w 頭戴顯示設備','筆記本配件','索尼','6999',default,default); insert into goods values(0,'商務雙肩背包','筆記本配件','索尼','99',default,default); insert into goods values(0,'x3250 m4機架式服務器','服務器/工作站','ibm','6888',default,default); insert into goods values(0,'商務雙肩背包','筆記本配件','索尼','99',default,default);- id 表示主鍵 自增
- name 表示商品名稱
- cate_name 表示分類名稱
- brand_name 表示品牌名稱
- price 表示價格
- is_show 表示是否顯示
- is_saleoff 表示是否售完
查詢類型cate_name為 '超極本' 的商品名稱、價格
select name,price from goods where cate_name = '超級本';顯示商品的分類
select cate_name from goods group by cate_name;求所有電腦產品的平均價格,并且保留兩位小數
select round(avg(price),2) as avg_price from goods;顯示每種商品的平均價格
select cate_name,avg(price) from goods group by cate_name;查詢每種類型的商品中 最貴、最便宜、平均價、數量
select cate_name,max(price),min(price),avg(price),count(*) from goods group by cate_name;查詢所有價格大于平均價格的商品,并且按價格降序排序
select id,name,price from goods where price > (select round(avg(price),2) as avg_price from goods) order by price desc;?此時前端再上傳商品時候需要選擇依據商品去選擇商品分類和商品品牌,就需要把這2個分類單獨抽取出去,成為獨立表更加合適!
商品分類:
-- 創建商品分類表 create table good_cates(id int not null primary key auto_increment, name varchar(50) not null );查詢goods表中cate_name字段分組,并將數據寫入到此表中的name中
insert into good_cates(name) select cate_name from goods group by cate_name;格式 insert into table(字段名稱) select xxx
需求:
數據是插入進去了? 但是此時goods表中的cate_name字段需要將內容修改成對應此表的id
update goods g inner join good_cates gc on g.cate_name=gc.name set g.cate_name=gc.id;通過內連接修改主表的對應字段為從表的其他字段內容,
goods cate_name 和good_cate的name 是對應關系,此時將goods cate_name的內容改為good_cate的id
創建品牌表
創建分類表的時候 是先創建表結構 然后通過insert into select 進行插入對應的數據
也可以再創建表的同時插入其他表的數據
-- 查詢品牌信息 select brand_name from goods group by brand_name;-- 通過create table ...select來創建數據表并且同時插入數據 -- 創建商品分類表,注意: 需要對brand_name 用as起別名,否則name字段就沒有值 create table good_brands ( id int unsigned primary key auto_increment, name varchar(40) not null) select brand_name as name from goods group by brand_name;?切記 創建表后緊跟插入數據的時候 字段名稱一定要和創建的字段一致,不一致使用as
再將goods表的brand_name 的值設置為對應此表id
-- 將goods表中的品牌名稱更改成品牌表中對應的品牌id update goods as g inner join good_brands gb on g.brand_name = gb.name set g.brand_name = gb.id;?此時查看goods表
?此時還需修改goods表中的字段名稱和類型
-- 查看表結構 desc goods; -- 通過alter table語句修改表結構 alter table goods change cate_name cate_id int not null,change brand_name brand_id int not null;注意:連續修改多個字段時候change 關鍵字也要重復寫?
總結
以上是生活随笔為你收集整理的mysql之外键以及小练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USBCNC数控系统使用教程
- 下一篇: Juniper