基于之前设计的多表案例的表结构,我们来完成今天的多表查询案例需求。
准备环境
将资料中准备好的多表查询的数据准备的SQL脚本导入数据库中。
分类表:category
菜品表:dish
套餐表:setmeal
套餐菜品关系表:setmeal_dish
需求实现
查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称
/*查询技巧:
? ? 明确1:查询需要用到哪些字段
? ? ? ?菜品名称、菜品价格 、 菜品分类名
? ? 明确2:查询的字段分别归属于哪张表
? ? ? ?菜品表:[菜品名称、菜品价格]
? ? ? ?分类表:[分类名]
? ? 明确3:如查多表,建立表与表之间的关联
? ? ? ?菜品表.caategory_id = 分类表.id
? ? 其他:(其他条件、其他要求)
? ? ? ?价格 < 10
*/
select d.name , d.price , c.name
from dish AS d , category AS c
where d.category_id = c.id
? ? ?and d.price < 10;
查询所有价格在 10元(含)到50元(含)之间 且 状态为"起售"的菜品名称、价格及其分类名称 (即使菜品没有分类 , 也要将菜品查询出来)
select d.name , d.price, c.name
from dish AS d left join category AS c on d.category_id = c.id
where d.price between 10 and 50
? ? ?and d.status = 1;
查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格
select c.name , max(d.price)
from dish AS d , category AS c
where d.category_id = c.id
group by c.name;
查询各个分类下 菜品状态为 "起售" , 并且 该分类下菜品总数量大于等于3 的 分类名称
/*查询技巧:
? ? 明确1:查询需要用到哪些字段
? ? ? ?分类名称、菜品总数量
? ? 明确2:查询用到的字段分别归属于哪张表
? ? ? ?分类表:[分类名]
? ? ? ?菜品表:[菜品状态]
? ? 明确3:如查多表,建立表与表之间的关联
? ? ? ?菜品表.caategory_id = 分类表.id
? ? 其他:(其他条件、其他要求)
? ? ? ?条件:菜品状态 = 1 (1表示起售)
? ? ? ?分组:分类名
? ? ? ?分组后条件: 总数量 >= 3
*/
select c.name , count(*)
from dish AS d , category AS c
where d.category_id = c.id
? ? ?and d.status = 1 -- 起售状态
group by c.name ?-- 按照分类名分组
having count(*)>=3; -- 各组后筛选菜品总数据>=3
查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数)
select s.name, s.price, d.name, d.price, sd.copies
from setmeal AS s , setmeal_dish AS sd , dish AS d
where s.id = sd.setmeal_id and sd.dish_id = d.id
? ? ?and s.name='商务套餐A';
查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格)
-- 1.计算菜品平均价格
select avg(price) from dish; ? ?-- 查询结果:37.736842
-- 2.查询出低于菜品平均价格的菜品信息
select * from dish where price < 37.736842;
?
-- 合并以上两条SQL语句
select * from dish where price < (select avg(price) from dish);