mysql 多表查询

  • 一、什么是多表查询
  • 二、笛卡尔积现象
  • (1)、使用SQL去查询观察结果:
  • (2)、使用连接关系查询结果:
  • 三、多表查询
  • 四、其余问题


一、什么是多表查询

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

二、笛卡尔积现象

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

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

查询cart表,共计6条数据:

MYSQL COUNT 两个表 mysql查询两个表的所有信息_数据库


查询goods表,共计9条数据:

MYSQL COUNT 两个表 mysql查询两个表的所有信息_MYSQL COUNT 两个表_02


若不使用连接关系将这两张表查询,会出现什么情况呢?

MYSQL COUNT 两个表 mysql查询两个表的所有信息_字符串_03


我们会发现产生了笛卡尔现象,产生了数据冗余,那么如何才能正确的进行查询呢?这时候我们就用到了多表连接查询

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

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

MYSQL COUNT 两个表 mysql查询两个表的所有信息_数据库_04


我们发现此时查询出了我们期望的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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_MYSQL COUNT 两个表_05


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_字符串_06


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_数据库_07


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_数据库_08


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);

MYSQL COUNT 两个表 mysql查询两个表的所有信息_MYSQL COUNT 两个表_09


6. 张三最喜欢在哪个时间点买东西?

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

MYSQL COUNT 两个表 mysql查询两个表的所有信息_字符串_10


7. 购物车的商品全部销售,赚了多少钱?

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

MYSQL COUNT 两个表 mysql查询两个表的所有信息_MYSQL COUNT 两个表_11


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_多表查询_12


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';

MYSQL COUNT 两个表 mysql查询两个表的所有信息_数据库_13


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_MYSQL COUNT 两个表_14


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;

MYSQL COUNT 两个表 mysql查询两个表的所有信息_多表查询_15

四、其余问题

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格式化

MYSQL COUNT 两个表 mysql查询两个表的所有信息_多表查询_16


3.CONCAT字符串的拼接

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

CONCAT(string1, string2, ...)

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