【入门】mysql多表查询

一、什么是多表查询

       多表查询就是从多张表中去查询数据,在实际开发中大多数情况数据都是存储在多张中的,它们通过一个关联关系连接起来,这样就可以通过这个关联关系去查询到想要的数据。

二、笛卡尔积现象

       上面提到了需要通过一个关联关系连接起来,如果不通过关系连接会出现什么情况呢?答案就是笛卡尔积现象。

(1)、使用SQL去查询观察结果:

查询cart表,共计6条数据:
在这里插入图片描述
查询goods表,共计9条数据:
在这里插入图片描述
若不使用连接关系将这两张表查询,会出现什么情况呢?
在这里插入图片描述
我们会发现产生了笛卡尔现象,产生了数据冗余,那么如何才能正确的进行查询呢?这时候我们就用到了多表连接查询

(2)、使用连接关系查询结果:

 select cart.*,goods.goods_name,goods.price
 from cart,goods
 where cart.goods_no = goods.good_no;

在这里插入图片描述
我们发现此时查询出了我们期望的6条记录!
因为关联关系是字段是good_no(商品编号),所有可以对应查询到的结果只有6条记录。

三、多表查询

接下来我们进行实操!按照上述数据库及表进行下面题目的练习:

  1. 火腿肠被谁买走了?
select goods.goods_name,account.name
from cart,goods,account
where goods.goods_name='火腿肠' and cart.goods_no=goods.good_no and account.id=cart.account_id;

在这里插入图片描述
2. 零食被谁买了?

select account.name
from cart,goods,account,category
where category.name='零食' and cart.goods_no=goods.good_no and account.id=cart.account_id and goods.category_no=category.no;

在这里插入图片描述
3. 张三花费了多少钱去买东西?

select account.name,sum(goods.price * cart.num)  as total_cost
from cart,goods,account
where account.name='张三' and cart.goods_no=goods.good_no and account.id=cart.account_id;

在这里插入图片描述
4. 所有用户分别花了多少钱?

select account.name ,sum(goods.price * cart.num) AS total_cost
from cart,goods,account
where cart.goods_no=goods.good_no and account.id=cart.account_id group by account.name;

在这里插入图片描述
5. 周几的营业额最高?

select dayname(cart.create_time) AS weekday_name,sum(goods.price*cart.num) AS total_cost
from cart,goods
where goods.good_no = cart.goods_no
group by dayname(cart.create_time);

在这里插入图片描述
6. 张三最喜欢在哪个时间点买东西?

select account.name,time(cart.create_time)
from cart,account
where account.name='张三' and account.id = cart.account_id;

在这里插入图片描述
7. 购物车的商品全部销售,赚了多少钱?

select sum(cart.num*(goods.price-goods.cost)) AS total_cost
from cart,goods
where goods.good_no = cart.goods_no;

在这里插入图片描述
8. 所有商品的利润率?

select goods.goods_name,concat(format((goods.price-goods.cost)/goods.cost*100,2),'%')  AS profit
from cart,goods
where  goods.good_no = cart.goods_no;

在这里插入图片描述
9. 求2023年3月12日前一周销售的产品?

select goods.goods_name
from goods,cart
where goods.good_no=cart.goods_no and cart. create_time between '2023-03-05'and '2023-03-12';

在这里插入图片描述
10. 用户购买完东西后,求用户账户的余额分别是多少?

select account.name,(account.money-sum(goods.price * cart.num)) AS balance
from goods,cart,account
where goods.good_no = cart.goods_no and account.id = cart.account_id
group by account.name;

在这里插入图片描述
11. 购物车商品售出后,商品库存剩余量是多少?

select goods.goods_name,(goods.count-sum(cart.num)) AS inventory
from goods,cart
where goods.good_no = cart.goods_no
group by goods.goods_name;

在这里插入图片描述

四、其余问题

1.sql中如何对日期进行修改?

--将日期增加一天
update account set create_time=date_add(create_time,interval 1 day);
--将日期增加一月
update account set create_time=date_add(create_time,interval 1 month);
--将日期减少一天
update account set create_time=date_sub(create_time,interval 1 day);
#此函数应用时变量依据需求进行修改,如:year(年)、month(月)、day(日)、hour(时)、minute(分)、second(秒)、microsecond(微秒)
#其中 date_add为增加,date_sub为减少

2.FORMAT格式化

FORMAT(number, decimal_places)
--其中,number 是需要格式化的数值,decimal_places 是需要保留的小数位数。

上面第8题便使用到了FORMAT格式化

在这里插入图片描述
3.CONCAT字符串的拼接

在 MySQL 中,CONCAT 函数用于将多个字符串连接在一起。它接受多个字符串作为参数,并按照参数的顺序将它们连接成一个新的字符串。

CONCAT(string1, string2, ...)

其中,string1、string2 等为要连接的字符串参数,可以是常量字符串、列名或其他表达式。CONCAT 函数会将这些参数依次连接起来,形成一个新的字符串,并返回结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值