在日常工作中,处理数据时经常需要把两个或多个表的信息拼在一起看。比如你是一家电商公司的运营,想看看每个订单对应的商品信息,但订单表和商品表是分开的。这时候,LEFT JOIN 就派上用场了。
什么是 LEFT JOIN
LEFT JOIN 是 SQL 中用来合并两个表的一种方式。它的特点是:以左表为基础,返回左表中的所有记录,即使右表中没有匹配的内容,也会保留左表的数据,而右表对应的部分则显示为 NULL。
举个例子,你有两张表:orders(订单)和 products(商品)。你想查出每个订单的商品名称,但有些订单可能还没绑定商品。用 LEFT JOIN 就能确保所有订单都列出来,没匹配到商品的字段就留空。
基本语法长什么样
语法结构如下:
SELECT 列名
FROM 左表
LEFT JOIN 右表 ON 条件;
具体写成实际语句可能是这样:
SELECT o.order_id, o.order_date, p.product_name, p.price
FROM orders o
LEFT JOIN products p ON o.product_id = p.id;
这里的意思是:从订单表 orders 中取出每条记录,并尝试去 products 表里找对应的 product_id 匹配项。能找到的就把商品名和价格加上;找不到的,product_name 和 price 就是空值,但订单本身不会丢。
什么时候该用它
当你关心的是“主表”的完整数据,同时想附带查看“副表”有没有相关信息时,LEFT JOIN 是最合适的。比如:
- 统计每个用户的登录记录,不管他们最近有没有登录;
- 导出所有客户信息,并附上他们最近一笔订单金额,即使有些人还没下单;
- 核对库存系统中哪些商品还没有被加入任何促销活动。
如果换成 INNER JOIN,那些没有匹配项的记录就会直接被过滤掉,容易漏掉关键信息。
一个小坑要注意
使用 LEFT JOIN 时,过滤条件的位置很关键。如果你在 WHERE 里对右表字段加限制,可能会无意中把原本想保留的左表数据也筛掉了。
比如下面这条:
SELECT o.order_id, p.product_name
FROM orders o
LEFT JOIN products p ON o.product_id = p.id
WHERE p.price > 100;
看起来是想查价格超过100的商品订单,但实际上这会让整个 LEFT JOIN 变成类似 INNER JOIN 的效果——因为 WHERE 不接受 NULL,那些没匹配到商品的订单也被去掉了。
正确的做法是把条件移到 ON 里面:
SELECT o.order_id, p.product_name
FROM orders o
LEFT JOIN products p ON o.product_id = p.id AND p.price > 100;
这样既保留了所有订单,又只关联符合条件的商品。
掌握好 LEFT JOIN,你会发现查数据变得更灵活,尤其在做报表、核对异常数据时特别实用。多练几次,很快就能信手拈来。