江小黑
发布于 2025-06-23 / 11 阅读
2
0

mysql——>LEFT JOIN 和 INNER JOIN

因为今天用到了连接查询 ,并且实际学习到了他们区别,总结一下

一、核心区别:INNER JOIN vs LEFT JOIN

特性

INNER JOIN (内连接)

LEFT JOIN (左连接)

匹配原则

只返回两个表匹配成功的行

返回左表所有行 + 右表匹配的行

不匹配时的行为

丢弃不匹配的行

保留左表数据,右表用 NULL 填充

结果集大小

结果行数 ≤ 左/右表行数

结果行数 = 左表行数

1. INNER JOIN (内连接)

  • 作用:仅返回两个表中匹配条件的行。

  • 场景:需要两表关联数据都存在时(如订单和用户信息)。

SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

结果(仅返回有订单的用户):

name

amount

Alice

100

Bob

50

2. LEFT JOIN (左连接)

  • 作用:返回左表全部行 + 右表匹配的行(不匹配则右表字段为 NULL)。

  • 场景:需包含左表所有数据,即使右表无匹配(如所有用户及其订单,包含无订单用户)。

SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

结果(包含无订单用户):

name

amount

Alice

100

Bob

50

Charlie

NULL

← 无订单用户

二、选择建议

  1. 需要严格匹配数据INNER JOIN
    (例如:查询已支付订单的详情)

  2. 保留主表全部记录LEFT JOIN
    (例如:统计所有用户的订单量,包括零订单用户)

  3. 检查数据完整性 → LEFT JOIN + WHERE IS NULL
    (例如:找出没有订单的用户)

    SELECT users.* 
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id
    WHERE orders.id IS NULL;

💡 性能提示

  • INNER JOIN 通常比 LEFT JOIN 快(因数据量更小)

  • 确保连接字段有索引(如 user_id)可大幅提升速度

三、实际应用

  • 使用LEFT JOIN

SELECT
	count( o.activity_type ) AS activitytypeCount,
	o.activity_type AS activityType,
	s.dict_name AS dictName 
FROM
	organization_activity o
	LEFT JOIN scs_dictionary s ON s.id = o.activity_type 
	AND s.dept_id = 410 
	AND s.dictionary_type = 'activity_type' 
WHERE
	o.dept_id = 410 
GROUP BY
	o.activity_type
				
  • 结果集

  • 使用INNER JOIN

SELECT
	COUNT( o.activity_type ) AS activitytypeCount,
	o.activity_type AS activityType,
	s.dict_name AS dictName 
FROM
	organization_activity o
	INNER JOIN scs_dictionary s ON s.id = o.activity_type 
	AND s.dept_id = 410 
	AND s.dictionary_type = 'activity_type' 
WHERE
	o.dept_id = 410 
GROUP BY
	o.activity_type;
  • 结果集


评论