MySQL习题1 一对多实例 产品和分类

/*
需求:建立产品和分类表
	1.查询每种分类的产品数量,没有产品的分类也要统计。(cname,quantity) 
	2.根据分类名称查询分类中的所有产品
*/

-- -------------------
-- 当表存在外键关系时,先删从表,再删主表
-- -------------------
drop table if exists product;
drop table if exists category;

-- -------------------
-- 先建立主表,再建立从表,可以在从表创建时添加外键
-- -------------------
-- -------------------
-- category
-- -------------------
create table category(
	cid int unsigned key auto_increment,
	cname varchar(255)
);
-- show create table category;查看外键

-- -------------------
-- product
-- -------------------
create table product(
	pid int unsigned key auto_increment,
	pname varchar(255),
	price decimal(10, 2),
	cid int unsigned,
	constraint category_fk foreign key (cid) references category(cid)
);
-- show create table product;查看外键


-- -------------------
-- 插入测试数据
-- -------------------
insert into category(cname) values('蔬菜');
insert into category(cname) values('水果');
insert into category(cname) values('饮料');

insert into product (pname, price, cid) 
values('豆角', 2.35, (select cid from category where cname='蔬菜'));
insert into product (pname, price, cid) 
values('萝卜', 1.5, (select cid from category where cname='蔬菜'));
insert into product (pname, price, cid) 
values('香蕉', 3.6, (select cid from category where cname='水果'));
insert into product (pname, price, cid) 
values('苹果', 3.6, null);

-- -------------------
-- 1.查询每种分类的产品数量,没有产品的分类也要统计。(cname,quantity)
-- -------------------
-- 错误的写法,count(*)返回的是结果的行数,跟值是否为空无关
select cname, count(*) quantity
from product p right join category c
on p.cid=c.cid
group by cname;

-- 正确的写法,count(p.pid)返回的是expr非空的值的个数
select cname, count(p.pid) quantity
from product p right join category c
on p.cid=c.cid
group by cname;

-- -------------------
-- 2.根据分类名称查询分类中的所有产品
-- -------------------
-- 方法1 内连接
select p.pname, p.price
from product p join category c
on p.cid=c.cid and c.cname='蔬菜';

-- 方法2 子查询
select p.pname, p.price 
from product p
where p.cid=(select c.cid from category c where cname='蔬菜');

-- -------------------
-- 3.使用union实现全外连接
-- -------------------
select * from product p left join category c
on p.cid=c.cid
union
select * from product p right join category c
on p.cid=c.cid;

  

转载于:https://www.cnblogs.com/mozq/p/10305648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值