-- sql强化演练( goods 表练习)
-- 查询类型 catename 为 '超级本' 的商品名称 name 、价格 price select name,price from goods where catename = "超级本";
-- 显示商品的种类 -- 1 分组的方式( group by ) select catename from goods group by catename;
-- 2 去重的方法( distinct ) 不要去记去用 select distinct cate_name from goods;
-- 求所有电脑产品的平均价格 avg ,并且保留两位小数( round ) select round( avg(price),2) from goods;
-- 显示 每种类型 catename (由此可知需要分组)的 平均价格 select catename,avg(price) from goods group by cate_name;
-- 查询 每种类型 的商品中 最贵 max 、最便宜 min 、平均价 avg 、数量 count select catename,max(price),min(price),avg(price),count(*) from goods group by catename;
-- 查询所有价格大于 平均价格 的商品,并且按 价格降序 排序 order desc --1.平均价格
select avg(price) from goods ;
--2.大于平均价格 select * from goods where price > (select avg(price) from goods );
-- 查询每种类型中最贵的电脑信息(难)
-- 1 查找 每种类型 中 最贵的 maxprice 价格 select catename,max(price) from goods group by cate_name ;
-- 2 关联查询 select * from goods inner join (select catename,max(price) as price from goods group by catename ) as goodsmax on goods.catename = goodsmax.catename and goods.price = goods_max.price;
--第四部 修改表结构(重点是思路)
-- 创建表格的格式 --create table if not exists 表名 ( --id int unsigned primary key auto_increment, 这个是主键 --name varchar(40) not null); 这个名称
--第一步 创建 "商品种类表" -goodscates --id跟名称 create table goodscates( id int unsigned primary key auto_increment , name varchar(50) );
--第二步 创建 "商品品牌表" -goodsbrands --id跟名称 create table goodsbrands( id int unsigned primary key auto_increment , name varchar(50));
--第三步 更新种类信息表 --1. 要把类型查询出来 select catename from goods group by catename;
--2. 批量插入数据 --insert into goods (name) values('123'); insert into goodscates(name) (select catename from goods group by cate_name);
--第四 更新品牌信息表 --1. 要把品牌信息查询出来 select brandname from goods group by brandname;
--2. 批量插入数据 insert into goodsbrands (name) (select brandname from goods group by brand_name);
--第五 更新种类信息成种类信息表中的id --1. 种类信息跟要替换成表进行内联 select * from goods inner join goodscates on goods.catename = goods_cates.name ;
--2. 通过特殊的update 进行更新 update ( goods inner join goodscates on goods.catename = goods_cates.name ) set goods.catename = goodscates.id;
--第六 更新品牌信息成品牌信息表的id --1. 把要更新的表两张表进行内联 select * from goods inner join goodsbrands on goods.brandname = goods_brands.name;
--2.通过特殊的update语句进行更新 update (goods inner join goodsbrands on goods.brandname = goods_brands.name) set goods.brandname = goodsbrands.id;
--第七步 修改字段(注意类型必须跟外键的主键类型一致) -- alter table 表名 change 旧字段 新字段 类型 alter table goods change brandname brandid int unsigned;
alter table goods change catename cateid int unsigned;
-- 外键的使用(了解)
-- 向goods表里插入任意一条品牌数据"老王牌拖拉机" -- 你会发现我们外键不能创建,因为没有对应的品牌
-- 约束 数据的插入 使用 外键 foreign key -- alter table 主表名 add foreign key (主表的外键) references 外键表(外键主键); alter table students add foreign key (cls_id) references classes(id);
-- 创建表的同时设置外键 (注意 goodscates 和 goodsbrands 两个表必须事先存在) -- foreign key (主表的外键) references 外键表(主键) create table if not exists goodskey( id int primary key autoincrement not null, name varchar(40) default '', price decimal(5,2), cateid int unsigned, brandid int unsigned, isshow bit default 1, issaleoff bit default 0, -- 添加外键
);
create table students2( id int unsigned primary key autoincrement, name varchar(30),clsid int unsigned , foreign key (cls_id) references classes (id) );
-- 如何取消外键约束 -- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称 --show create table goods; show create table students2;
-- 获取名称之后就可以根据名称来删除外键约束 --alter table students drop foreign key studentsibfk1; alter table students2 drop foreign key students2ibfk1;
总结:在实际开发中,很少会使用到外键约束,会极大的降低表更新的效率