sql中 inner/left/right join on的用法

本文详细介绍了SQL中的三种连接查询方式:INNER JOIN ON用于查询两个表中匹配的记录;LEFT JOIN ON保留左表所有记录并补充右表匹配项,未匹配项以空值填充;RIGHT JOIN ON则相反,保留右表所有记录并补充左表匹配项。

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

sql中inner join on 的用途:(等值连接)
 
   select * from A inner join Bon A.no=B.no;

查询出所有A的号数跟B的号数相等的记录,相当于:select * from A,B where A.no=B.no;

多表查询:

  select * from ((表1 inner join 表2 on表1.no=表2.no)inner join 表3 on 表1.no=表3.no )inner join 表4 onmember.no=表4.no;

  (三个表以上使用Member)

 

sql中left join on的用途:   (左连接)

 

   select * from A left join Bon A.no=B.no;

查询出所有 A号数等于B号数的记录,并将A中没有的值添加入结果集中,也就是B的所有字段都为空。
这个相当于:

   select * from B rigth joinA on A.no=B.no;

 

sql中right join on的用途:   (右连接)

 

   select * from A right joinB on A.no=B.no;

查询出所有A号数等于B号数的记录,并将B中A没有的记录加入结果集中,这时A的字段默认为空。
相当于:

  select * from B left join A on A.no=B.no;

<think>嗯,用户想了解SQL中的JOIN操作,特别是LEFT JOININNER JOINRIGHT 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
发出的红包

打赏作者

盒马coding

你的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值