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

发布时间:2023年12月22日

力扣题

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 年 作为 买家订单总数
以 任意顺序 返回结果表。
查询结果格式如下。

示例 1:

输入:
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

4、代码编写

正确写法

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 的行。
文章来源:https://blog.csdn.net/weixin_50223520/article/details/135146682
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。