LEFT JOIN可保留左表所有记录,右表无匹配时字段为NULL;ON用于连接条件,WHERE可能过滤掉左表数据,应谨慎使用;多表关联可用多个LEFT JOIN实现。

在mysql中使用LEFT JOIN可以获取左表中的所有记录,即使右表中没有匹配的记录也会保留左表的数据。这种方式特别适合需要完整展示主表信息,并附带关联表数据的场景。
LEFT JOIN的基本语法
LEFT JOIN通过连接两个表,返回左表的所有行和右表中满足连接条件的行。如果右表没有匹配项,对应字段值为NULL。
select 列名 FROM 左表名 LEFT JOIN 右表名 ON 左表名.列 = 右表名.列;
例如有两张表:users(用户)和orders(订单),想查看每个用户的订单情况,包括没有下单的用户:
SELECT users.name, orders.order_number FROM users LEFT JOIN orders ON users.id = orders.user_id;
结果会列出所有用户,未下单用户的order_number显示为NULL。
使用WHERE与ON的区别
注意ON是连接条件,决定如何匹配两表数据;而WHERE是在连接完成后过滤结果。
若在LEFT JOIN后使用WHERE限制右表字段,可能导致非预期结果,比如:
SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.amount > 100;
这条语句实际上会排除右表为NULL的行(即没订单的用户),相当于变成了INNER JOIN的效果。如需保留所有用户,应把条件写在ON中:
SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id AND orders.amount > 100;
多表LEFT JOIN的应用
可以连续使用多个LEFT JOIN来关联三张或更多表。
比如再加一个product表记录订单商品:
SELECT users.name, orders.order_number, product.name FROM users LEFT JOIN orders ON users.id = orders.user_id LEFT JOIN product ON orders.product_id = product.id;
这样能展示用户、其订单及对应商品,任何环节缺失数据都不会导致整条记录被忽略。
基本上就这些。掌握ON条件的使用,理解LEFT JOIN保留左表全部数据的特性,就能准确查询所需信息。


