join时mysql数据库中非常关键的连表查询手段,包括left join和inner join。
这里尝试说明left join和inner join的区别,并通过具体场景示例。
sql代码和例子,参考自网络资料。
1 left join
left join返回左表的所有记录,即使右表中没有匹配的记录。
如果右表中没有匹配,则结果为NULL。
在左连接中,左表的所有行都会显示,左连接适用于需要保留左表所有数据的情况。
2 inner join
inner join只返回两个表中匹配的记录,不包括不匹配的记录。
在内连接中,只有符合条件的行会显示,内连接适用于只关心匹配数据的情况。
3 场景示例
以下是示例场景,有 5 个客户,但只有 4 笔订单。赵六和钱七还没下过订单。
客户表(customers):
customer_id | name
1 | 张三
2 | 李四
3 | 王五
4 | 赵六
5 | 钱七 ← 还没下过订单!
订单表(orders):
order_id | customer_id | amount
101 | 1 | 250.00
102 | 2 | 180.00
103 | 1 | 420.00
104 | 3 | 95.00
3.1 left join查询
查询所有客户的信息以及其订单量,包括实际没有下单的客户。
sql示例如下
SELECT
c.customer_id,
[c.name](http://c.name),
COUNT(o.order_id) as order_count
FROM customers c
LEFT JOIN orders o
ON c.customer_id = o.customer_id
GROUP BY c.customer_id, [c.name](http://c.name);
查询结果如下所示,赵六和钱七还没下过订单,但也被统计在内。
customer_id | name | order_count
1 | 张三 | 2
2 | 李四 | 1
3 | 王五 | 1
4 | 赵六 | 0 ← 没有下订单
5 | 钱七 | 0 ← 没有下订单
3.2 inner join查询
查询所有客户及其订单数量,要求必须要有实际订单。
sql示例如下
SELECT
c.customer_id,
[c.name](http://c.name),
COUNT(o.order_id) as order_count
FROM customers c
INNER JOIN orders o
ON c.customer_id = o.customer_id
GROUP BY c.customer_id, [c.name](http://c.name);
查询结果,只显示 3 个客户,而不是 5 个,因为赵六和钱七还没下过订单。
customer_id | name | order_count
1 | 张三 | 2
2 | 李四 | 1
3 | 王五 | 1
reference
SQL JOIN详解:LEFT JOIN vs INNER JOIN避免数据丢失(附实战案例)