已有一餐饮商家的三份经营数据——MySQL课后习题

已有一餐饮商家的三份经营数据,包含:

①8月份每个订单的汇总情况表(order_info.sql);

②8月份每个订单的明细点餐情况表(order_detail.sql);

③餐厅所有菜品信息表(dishes.sql)

请根据这三个数据完成以下任务,所有任务均在practice数据库下进行,具体字段说明如下表:

order_info订单汇总表

字段

说明

字段类型

info_id

订单编号

int,主键

emp_id

服务员编号

int

consumers

顾客数

int

table_id

桌号

int

dishes_count

点菜数

int

payble

付款金额

float(5,1)

start_time

订单开始时间

datetime

lock_time

订单结束时间

datetime

order_status

订单状态(0取消,1正常,2未付款)

int

order_detail订单明细表

字段

说明

字段类型

detail_id

明细编号

int,非空

order_id

订单编号

int,非空

dishes_id

菜品编号

int,非空

counts

点某菜品的数量

int

amounts

菜品单价

float(5,1)

order_time

订单时间

datetime

emp_id

服务员编号

int

dishes菜品表

字段

说明

字段类型

dishes_id

菜品编号

int

dishes_name

菜品名

varchar(20)

picture_file

图片文件

varchar(50)

f4

其他说明

varchar(10)

create_time

菜品上架时间

datetime

maker

厨师

varchar(6)

任务

结合【课后练习1、2】已经完成的结果,完成以下任务:

1.查询明细表detail中每个厨师负责菜品的单价,按厨师降序排序。结果参考:

2.通过order_detail表店统计铺每天每道菜品的销售状况:包括日期,菜品名称,总数量,每单平均的菜品数量。结果参考:

3.用CASE WHEN查看8月15日之后每天主打菜品‘麻辣小龙虾’‘剁椒鱼头’‘啤酒鸭’‘干锅田鸡’的销售量,并把结果设置成视图v_topdishe。结果参考:

4.统计姓‘王’的厨师每天被退单(order_status=0)的菜品数量。结果参考:

5.查询店铺每天订单状态正常每道菜品的销售状况:包括日期,菜品编号,数量,每单平均数量。结果参考:

6.查询dishes表中菜品名称有重复的菜品。结果参考:

7.因为菜单更新的缘故,dishes表存在多个重复的菜品名的菜品,现需要只保留最新的菜品信息。方法是创建一个视图v_dishes保存同一个菜名最后一次更新且菜品编号最大的记录来达到去除菜名重复的历史菜品的目的。

8.若存在厨师“张三”的菜品,则查询出张三菜品对应的所有订单明细信息,分别使用exists子查询和in查询。

9.由于查询语句经常用到日期做分组统计,给order_info和order_detail两个表均新增一列order_date(日期格式),再在两个表的order_date列上创建普通索引。

10.在order_detail的dishes_id,detail_id上分别建立普通索引和联合索引;在dishes表的dishes_id上建立普通索引。

1. 查询明细表detail中每个厨师负责菜品的单价,按厨师降序排序
select distinct d.maker,d.disher_name,od.amounts from dishes d,order_detail od
where d.dishes_id=od.dishes_id order by d.maker desc;

2.通过order_detail表店统计铺每天每道菜品的销售状况:包括日期,菜品名称,总数量,每单平均的菜品数量。
select date(order_time) 日期,dishes_name 菜品名称,sum(counts) 总数量,sum(counts)/count(order_id) 每单平均的菜品数量
from dishes d,order_detail od
where d.dishes_id=od.dishes_id 
group by date(order_time),d.dishes_name order by date(order_time); 


3. 用CASE WHEN查看8月15日之后每天主打菜品‘麻辣小龙虾’‘剁椒鱼头’‘啤酒鸭’‘干锅田鸡’的销售量,并把结果设置成视图v_topdishe.
create view v_topdishe as
select date(order_time) 日期,
sum(case when dishes_name = '麻辣小龙虾' then counts else 0 end) 麻辣小龙虾,
sum(case when dishes_name = '剁椒鱼头' then counts else 0 end) 剁椒鱼头,
sum(case when dishes_name = '啤酒鸭' then counts else 0 end) 啤酒鸭,
sum(case when dishes_name = '干锅田鸡' then counts else 0 end) 干锅田鸡
from order_detail od ,dishes d
where od.dishes_id = d.dishes_id and date(order_time)>'2021-8-15'
group by date(order_time) order by date(order_time);

select * from v_topdishe;


4. 统计姓‘王’的厨师每天被退单(order_status=0)的菜品数量
select date(order_time),d.maker,sum(counts) from order_info oi,dishes d ,order_detail od
where d.dishes_id=od.dishes_id and oi.info_id=od.order_id and d.maker like '王%' and oi.order_status=0
group by date(order_time) order by date(order_time);


5. 查询店铺每天订单状态正常(order_status=1)每道菜品的销售状况: 包括日期,菜品编号,数量,每单平均数量
select date(order_time) 日期, od.dishes_id 菜品编号,sum(counts) 数量,sum(counts)/count(order_id) 每单平均数量
from order_detail od, order_info oi
where od.order_id=oi.info_id and oi.order_status=1
group by date(order_time),dishes_id order by date(order_time);


6. 查询dishes表中菜品名称有重复的菜品
select * from dishes_name in 
(select dishes_name from dishes group by dishes_name HAVING count(dishes_name) > 1);


7. 创建一个视图v_dishes,保存同一个菜名(group by dishes_name)最后一次更新(即最大上架时间)并且菜品编号最大(max(dishes_id))的记录
create view v_dishes as 
select * from dishes where (dishes_name,create_time,dishes_id) in 
(select dishes_name,max(create_time),max(dishes_id) from dishes group by dishes_name);



8.若存在厨师“王彥志”的菜品,则查询出王彥志菜品对应的所有订单明细信息,分别使用#exists子查询和in查询。
select * from order_detail where dishes_id in
(select dishes_id from dishes where maker='王彥志');

select * from order_detail where exists
(select dishes_id from dishes where maker='王彥志' and order_detail.dishes_id=dishes.dishes_id);



9.由于查询语句经常用到日期做分组统计,给order_info和order_detail两个表均新增一列order_date(日期格式),再在两个表的order_date列上创建普通索引。
alter table order_info add order_date date;
alter table order_detail add order_date date;
UPDATE order_info set order_date = date(start_time);
update order_detail set order_date = date(order_time);
create index ind_date on order_info(order_date);
create index ind_date on order_detail(order_date);

show index from order_info;



10.在order_detail的dishes_id,detail_id上分别建立普通索引和联合索引;在dishes表的dishes_id上建立普通索引。
create index ind_dish on order_detail(dishes_id); #在order_detail的dishes_id建立普通索引
create index ind_deta on order_detail(detail_id);
create index ind_dish_deta on order_detail(dishes_id,detail_id);
create index ind_dish on dishes(dishes_id);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值