准备工作:
创建数据表
create database jing_dong charset=utf8;
use jing_dong;
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
);
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);
-- 查询每种类型中最贵的电脑信息
-- 1 查找 每种类型 中 最贵的 max_price 价格
select cate_name,max(price) as max_price from goods group by cate_name
-- 2 关联查询 inner join 每种类型 中最贵的物品信息
select * from goods
inner join
(select cate_name,max(price) as max_price from goods group by cate_name) as max_price_goods
on goods.cate_name=max_price_goods.cate_name and goods.price=max_price_goods.max_price;
-- 商品种类换成对应ID
-- 创建"商品分类"表,将商品
第一步 创建表 (商品种类表 goods_cates )
create table if not exists goods_cates(
id int unsigned primary key auto_increment,
name varchar(40) not null
);
第二步 同步 商品分类表 数据 将商品的所有 (种类信息) 写入到 (商品种类表) 中
-- 按照 分组 的方式查询 goods 表中的所有 种类(cate_name)
select cate_name from goods group by cate_name;
(注意) 把查询出来的 结果 写入 goods_cates 表里去 ( insert into ) 只插入name
insert into goods_cates(name) (select cate_name from goods group by cate_name);
第三部 同步 商品表 数据 通过 goods_cates 数据表来更新 goods 表
-- 因为要通过 goods_cates表 更新 goods 表 所以要把两个表连接起来
select * from goods inner join goods_cates on goods.cate_name = goods_cates.name;
-- 把 商品表 goods 中的 cate_name 全部替换成 商品分类表中的 商品id ( update ... set )
update (goods inner join goods_cates on goods.cate_name = goods_cates.name) set goods.cate_name = goods_cates.id;
第四部 修改表结构
-- 查看表结构(注意 两个表中的 外键类型需要一致)
-- 修改表结构 alter table 字段名字不同 change,把 cate_name 改成 cate_id int unsigned not null
alter table goods change cate_name cate_id int unsigned not null;
-- 创建 商品品牌表 goods_brands
第一步 创建 "商品品牌表" 表
-- 第一种方式 先创建表
create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null
);
-- 插入数据 brand_name(分组)
-- 按照 分组 的方式查询 goods 表中的所有 种类(brand_name)
select brand_name from goods group by brand_name;
--(注意) 把查询出来的 结果 写入 goods_brands 表里去 ( insert into ) 只插入name
insert into goods_brands(name) (select brand_name from goods group by brand_name);
-- 第二种方式 创建表的同时插入数据(了解,不建议使用)
create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null) select brand_name as name from goods group by brand_name;
第二步 同步数据
-- 通过goods_brands数据表来更新goods数据表 g.brand_name=b.id
select * from goods inner join goods_brands on goods.brand_name = goods_brands.name;
update (goods inner join goods_brands on goods.brand_name = goods_brands.name) set goods.brand_name = goods_brands.id;
第三部 修改表结构
-- 通过alter table语句修改表结构 brand_id int unsigned not null
alter table goods change brand_name brand_id int unsigned not null;
-- python与mysql的交互使用
-- 基本流程 1 connection对象 |2 cursor对象 |3 关闭cursor |4 关闭connection
from pymysql import * conn=connect(参数列表) # 参数host:连接的mysql主机,如果本机是'localhost' # 参数port:连接的mysql主机的端口,默认是3306 # 参数database:数据库的名称 # 参数user:连接的用户名 # 参数password:连接的密码 # 参数charset:通信采用的编码方式,推荐使用utf8 cs1=conn.cursor() sql = "sql语句" cs1.execute(sql) cs1.close() conn.close()
具体案例:
import pymysql class JD(object): def __init__(self): # 建立连接 self.conn = pymysql.connect(host='localhost', port=3306, database='jing_dong', user='root', password='mysql', charset='utf8') # 建立游标 self.cs1 = self.conn.cursor() def __del__(self): self.cs1.close() self.conn.close() def sql_execute(self, sql): self.cs1.execute(sql) content = self.cs1.fetchall() for i in content: print(i) @staticmethod def show_menu(): print("1. 查看所有的商品信息") print("2. 查看所有的商品种类") print("3. 查看所有的商品品牌") print("4. 添加一个商品种类") print("5. 删除一个商品种类") print("6. 查看一个商品的信息") print("0. 退出") num = input("请选择你想要执行的操作:") return num def show_goods_info(self): # 使用sql语句 sql = "select * from goods;" self.sql_execute(sql) def show_goods_cates(self): sql = "select * from goods_cates;" self.sql_execute(sql) def show_goods_brands(self): sql = "select * from goods_brands;" self.sql_execute(sql) def add_cate(self): name = input("请输入想要添加的商品种类:") sql = "insert into goods_cates(name) value('%s')" % name self.sql_execute(sql) self.conn.commit() def del_cate(self): name = input("请输入想要删除的商品种类:") sql = "delete from goods_cates where name = '%s'" % name self.sql_execute(sql) self.conn.commit() def show_agoods_info(self): name = input("请输入想要查询商品的名字:") sql = "select * from goods where name = %s" # 防注入写法 self.cs1.execute(sql, [name]) content = self.cs1.fetchone() print(content) def run(self): while True: num = self.show_menu() if num == "1": self.show_goods_info() elif num == "2": self.show_goods_cates() elif num == "3": self.show_goods_brands() elif num == "4": self.add_cate() elif num == "5": self.del_cate() elif num == "6": self.show_agoods_info() elif num == "0": break else: print("没有这个选项") def main(): jd = JD() jd.run() if __name__ == '__main__': main()