SQL 之关联表查询 LEFT ON INNER ON RIGHT ON

本文详细解释了SQL中LEFT JOIN、RIGHT JOIN及INNER JOIN的区别,并通过具体示例展示了ON与WHERE条件的不同作用。LEFT JOIN返回左表所有记录,RIGHT JOIN返回右表所有记录,而INNER JOIN仅返回满足连接条件的记录。

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

浅谈 LEFT ON INNER ON RIGHT ON

开始说说关联表中on和where的区别之前我们先来谈谈LEFT ON INNER ON RIGHT ON,先看看下面的sql语句:

SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID
SELECT * FROM A INNER JOIN B ON A.ID = B.ID

第一条语句使用的是 LEFT JOIN,不管 ON 的条件是否为真都会返回A表的所有数据
第二条语句使用的是 RIGHT JOIN,不管 ON 的条件是否为真都会返回B表的所有数据
第三条语句使用的是 INNER JOIN,返回的是满足 ON 条件的数据

SQL中on条件与where条件的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。即生成中间表后再进行where条件的筛选,最终返回的是左边表中where条件为真的记录。

point表
这里写图片描述
address表
这里写图片描述

1. LEFT JOIN

sql语句

SELECT * FROM point LEFT JOIN address ON point.idKey = address.idKey

查询结果

这里写图片描述

2. inner join

对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。

sql语句

不使用where
SELECT point.idKey,address.dealt,point.content FROM point INNER JOIN address ON point.idKey=address.idKey AND address.dealt=’北京’ AND point.content>=’95’

使用where
SELECT point.idKey,address.dealt,point.content FROM point LEFT JOIN address ON point.idKey=address.idKey WHERE address.dealt=’北京’ AND point.content>=’95’

查询结果都如下

这里写图片描述

<think>嗯,用户想了解SQL中的JOIN操作,特别是LEFT JOIN、INNER JOIN和RIGHT JOIN,还希望有详细的例子。首先,我得回忆一下这些JOIN的区别和用法。LEFT JOIN会返回左表的所有记录,右表没有匹配的部分用NULL填充。INNER JOIN只返回两个表有匹配的记录。RIGHT JOIN则相反,返回右表的所有记录,左表没有匹配的用NULL。用户可能对左右表的概念不太清楚,需要解释清楚。 接下来,我应该考虑如何用例子来说明。可能需要创建两个简单的表,比如员工表和部门表,这样比较直观。员工表有员工ID、姓名和部门ID,部门表有部门ID和部门名称。然后通过不同的JOIN操作展示结果的变化。 用户可能还不太明白ON子句的作用,需要强调ON后面跟的是连接条件,比如两个表中部门ID相等。同时,要指出WHERE和ON的区别,避免混淆。 另外,用户可能在实际应用中会遇到需要多个JOIN的情况,或者更复杂的连接条件,但这次的问题应该先聚焦在基础的三种JOIN上,确保例子简单明了,便于理解。是否需要提到FULL JOIN呢?可能暂时不用,保持回答集中在用户提到的三个类型。 在写例子的时候,确保每个JOIN的结果都清楚,比如LEFT JOIN会显示所有员工,包括没有部门的,而INNER JOIN只显示有部门的员工。RIGHT JOIN则显示所有部门,包括没有员工的。可能还需要用表格来展示结果,但因为是文字形式,需要用文字描述清楚。 最后,需要总结一下使用场景,帮助用户理解什么时候该用哪种JOIN。比如需要包含所有左表记录时用LEFT JOIN,需要严格匹配时用INNER JOIN,需要所有右表记录时用RIGHT JOIN。可能还要提醒用户,RIGHT JOIN在实际中使用较少,通常可以通过调整表的顺序用LEFT JOIN代替,这样可读性更好。</think>好的,我将通过具体示例逐步解释 SQL 中三种主要 JOIN 的用法及区别。以下是结构化说明: --- ### 一、数据准备 先创建两个示例表: ```sql -- 员工表 (employees) +--------+-------+------------+ | emp_id | name | dept_id | +--------+-------+------------+ | 1 | 张三 | 101 | | 2 | 李四 | 102 | | 3 | 王五 | NULL | +--------+-------+------------+ -- 部门表 (departments) +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 101 | 技术部 | | 102 | 市场部 | | 103 | 财务部 | +---------+-----------+ ``` --- ### 二、JOIN 类型详解 #### 1. INNER JOIN(内连接) **特性**:仅返回两个表中匹配的行 **公式**: $$ A \cap B $$ **示例**: ```sql SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id; ``` **结果**: ``` +-------+-----------+ | name | dept_name | +-------+-----------+ | 张三 | 技术部 | | 李四 | 市场部 | +-------+-----------+ ``` #### 2. LEFT JOIN(左外连接) **特性**:返回左表所有行 + 右表匹配行(不匹配则填充 NULL) **公式**: $$ A $$ **示例**: ```sql SELECT e.name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id; ``` **结果**: ``` +-------+-----------+ | name | dept_name | +-------+-----------+ | 张三 | 技术部 | | 李四 | 市场部 | | 王五 | NULL | +-------+-----------+ ``` #### 3. RIGHT JOIN(右外连接) **特性**:返回右表所有行 + 左表匹配行(不匹配则填充 NULL) **公式**: $$ B $$ **示例**: ```sql SELECT e.name, d.dept_name FROM employees e RIGHT JOIN departments d ON e.dept_id = d.dept_id; ``` **结果**: ``` +-------+-----------+ | name | dept_name | +-------+-----------+ | 张三 | 技术部 | | 李四 | 市场部 | | NULL | 财务部 | +-------+-----------+ ``` --- ### 三、图示对比 ``` 左表(employees) 右表(departments) ● 张三 ↔ 技术部 (INNER JOIN) ● 李四 ↔ 市场部 ○ 王五 → NULL (LEFT JOIN) NULL ← 财务部 (RIGHT JOIN) ``` --- ### 四、使用场景建议 1. **INNER JOIN**:需精确匹配时(如订单关联商品信息) 2. **LEFT JOIN**:保留主表完整数据时(如显示所有用户及其订单,包括未下单用户) 3. **RIGHT JOIN**:实际较少使用(通常改用 LEFT JOIN 调换表顺序) --- ### 五、进阶注意 - **多表 JOIN** 可叠加使用 - **ON 与 WHERE** 的区别:ON 定义连接条件,WHERE 过滤最终结果 - 使用 `COALESCE()` 处理 NULL 值更安全 需要进一步具体场景的示例吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值