关于MySQL外连接查询的NULL

本文详细解析了SQL中的左连接(left join)与右连接(right join)的区别及使用场景。通过具体的SQL语句示例,说明了如何处理表间连接时的条件过滤问题,特别是当非主表存在条件时如何避免过滤掉NULL值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

left join 或 right join :
1) select * from 表1 left join 表2 on 表1=表2 where 表1.id>10 ; 
   //不考虑表2 的重复值有40条数据
   返回 表1 的所有数据40条。如果表2中没有对应的值以null 返回。

   1.1) select * from 表1 right join 表2 on 表1=表2 where 表1.id>10 ; 
       这时主表是 表2 ,如果表1中没有对应的值会以 null 返回,并且会被where条件过滤掉;
       //不考虑表2 的重复值有40条数据
       返回 表2 的数据30条。如果表1中没有对应的值会被过滤(10条)。

2) select * from 表1 left join 表2 on 表1=表2 
   where 表1.id>10 and 表2.time>unix_timestamp('2017-09-01'); 
   //不考虑表2 的重复值有20条数据
   返回 表1 的20条数据。如果表2中没有对应的值null则会被过滤调。

3) select * from 表1 left join 表2 on 表1=表2 and 表2.time>unix_timestamp('2017-09-01') 
   where 表1.id>10 ; 
   //不考虑表2 的重复值有30条数据(10条是表2的null值)
   返回 表1 的30条数据。如果表2中没有对应的值以null 返回。

总结:外连接查询如果非主表有条件,必须加在 :left Join .. on .. and (条件) ; 这样才不会过滤掉表2 的null值(有空再补图)
MySQL 中,**内连接(INNER JOIN)**和**外连接(OUTER JOIN)**是用于从多个表中检索数据的两种主要方式。它们的核心区别在于如何处理连接条件不匹配的情况。 ### 内连接(INNER JOIN) 内连接只返回两个表中满足连接条件的行。如果某一行在一个表中没有与另一个表中的记录匹配,则这些行不会出现在结果集中。这是最常见的一种连接类型,通常用于仅需要获取两个表中相关联的数据时[^4]。 例如,以下查询将返回 `employees` 和 `departments` 表中 `department_id` 匹配的所有员工及其所属部门名称: ```sql SELECT e.employee_id, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id; ``` 内连接的一个显著优点是性能较高,因为它不需要处理不匹配的 NULL 值,因此在大多数情况下推荐优先使用[^2]。 ### 外连接(OUTER JOIN外连接则可以分为三种形式:左外连接LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。MySQL 仅支持左外连接和右外连接,而全外连接可以通过联合查询模拟实现。 #### 左外连接LEFT OUTER JOIN) 左外连接返回左表中的所有记录,即使在右表中没有匹配的行。如果没有匹配项,那么来自右表的字段值将为 NULL。这种连接方式适用于需要保留左表全部数据并补充右表信息的场景[^1]。 例如,下面的查询将返回所有员工的信息,并附上他们的部门名称(如果没有匹配的部门,则显示为 NULL): ```sql SELECT e.employee_id, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id; ``` #### 右外连接(RIGHT OUTER JOIN) 右外连接与左外连接类似,但它确保右表的所有记录都会被返回,即使左表中没有匹配项。如果没有匹配项,那么来自左表的字段值将为 NULL。这在某些特定场景下非常有用,但实际应用中较少使用[^3]。 ```sql SELECT e.employee_id, d.department_name FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id; ``` ### 使用建议 - **性能方面**:内连接通常效率最高,因为其不需要处理 NULL 值。对于大表操作,应避免使用全外连接,以防止性能问题。 - **NULL 处理**:在外连接中,为了提升用户体验或数据分析准确性,通常需要对 NULL 字段进行处理,可以使用 `COALESCE()` 或 `IFNULL()` 函数来替换 NULL 值。 - **自连接(Self Join)**:当需要在同一张表中进行关联查询时,可以使用自连接。例如查询员工及其上级: ```sql SELECT a.emp_name, b.emp_name AS manager FROM employees a LEFT JOIN employees b ON a.manager_id = b.emp_id; ``` ### 总结 选择连接方式时,需结合具体业务需求。合理设计索引可显著提升多表查询效率,同时注意 SQL 查询的结构优化,以提高数据库的整体性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值