因为今天用到了连接查询 ,并且实际学习到了他们区别,总结一下
一、核心区别:INNER JOIN
vs LEFT JOIN
1. INNER JOIN
(内连接)
作用:仅返回两个表中匹配条件的行。
场景:需要两表关联数据都存在时(如订单和用户信息)。
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
结果(仅返回有订单的用户):
2. LEFT JOIN
(左连接)
作用:返回左表全部行 + 右表匹配的行(不匹配则右表字段为
NULL
)。场景:需包含左表所有数据,即使右表无匹配(如所有用户及其订单,包含无订单用户)。
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
结果(包含无订单用户):
二、选择建议
需要严格匹配数据 →
INNER JOIN
(例如:查询已支付订单的详情)需保留主表全部记录 →
LEFT JOIN
(例如:统计所有用户的订单量,包括零订单用户)检查数据完整性 →
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;
结果集