【MySQL】外连接 where 和 on 的区别

本文介绍了一个SQL问题,要求找出每位用户在2019年的注册日期以及作为买家的订单总数。正确使用LEFTJOIN和WHERE子句的关键在于,ON用于连接表,而WHERE用于筛选,错误示例中因使用WHERE导致部分用户数据丢失。
摘要由CSDN通过智能技术生成

力扣题

1、题目地址

1158. 市场分析 I

2、模拟表

User 表:

Column NameType
user_idint
join_datedate
favorite_brandvarchar
  • user_id 是此表主键(具有唯一值的列)。
  • 表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。

Orders 表:

Column NameType
order_idint
order_datedate
item_idint
buyer_idint
seller_idint
  • order_id 是此表主键(具有唯一值的列)。
  • item_id 是 Items 表的外键(reference 列)。
  • (buyer_id,seller_id)是 User 表的外键。

Items 表:

Column NameType
item_idint
item_brandvarchar
  • item_id 是此表的主键(具有唯一值的列)。

3、要求

  • 编写解决方案找出 每个用户的注册日期 和 在 2019 年 作为 买家订单总数
  • 以 任意顺序 返回结果表。

4、示例

输入:

Users 表:

user_idjoin_datefavorite_brand
12018-01-01Lenovo
22018-02-09Samsung
32018-01-19LG
42018-05-21HP

Orders 表:

order_idorder_dateitem_idbuyer_idseller_id
12019-08-01412
22018-08-02213
32019-08-03323
42018-08-04142
52018-08-04134
62019-08-05224

Items 表:

item_iditem_brand
1Samsung
2Lenovo
3LG
4HP

输出:

buyer_idjoin_dateorders_in_2019
12018-01-011
22018-02-092
32018-01-190
42018-05-210

5、代码编写

正确写法

SELECT a.user_id AS buyer_id,
	   a.join_date, 
	   count(b.buyer_id) AS orders_in_2019
FROM Users a
		LEFT join Orders b ON a.user_id = b.buyer_id AND YEAR(b.order_date) = '2019'
GROUP BY a.user_id
| buyer_id | join_date  | orders_in_2019 |
| -------- | ---------- | -------------- |
| 1        | 2018-01-01 | 1              |
| 2        | 2018-02-09 | 2              |
| 3        | 2018-01-19 | 0              |
| 4        | 2018-05-21 | 0              |

错误写法

SELECT a.user_id AS buyer_id,
	   a.join_date, 
	   count(b.buyer_id) AS orders_in_2019
FROM Users a
		LEFT join Orders b ON a.user_id = b.buyer_id
WHERE YEAR(b.order_date) = '2019'
GROUP BY a.user_id
| buyer_id | join_date  | orders_in_2019 |
| -------- | ---------- | -------------- |
| 1        | 2018-01-01 | 1              |
| 2        | 2018-02-09 | 2              |

错误分析(网友回答)

外连接时要注意 whereon 的区别:

  • on 是在连接构造临时表时执行的,不管 on 中条件是否成立都会返回主表(也就是 left join 左边的表)的内容,
  • where 是在临时表形成后执行筛选作用的,不满足条件的整行都会被过滤掉。
  • 如果这里用的是 where year(order_date)='2019' 那么得到的结果将会把不满足条件的 user_id34 的行给删掉。
  • on 的话会保留 user_id34 的行。
  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值