mysql 之各种 join 之间的关系

本文深入解析MySQL中的Join操作,包括Left Join、Right Join和Inner Join三种类型。通过具体案例阐述每种Join方式的特点及应用场景,帮助读者理解并掌握SQL联接查询技巧。

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

一、了解一下 mysql 中所拥有的各种 join  

   left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录 
 right join(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录
 inner join(等值连接):只返回两个表中联结字段相等的行

二、案例呈上

     

2.1. left join
  select * from A left jon B on A.aID = B.bID

   

结果说明:

  left join 是以 A表 的记录为基础的,A可以看成左表,B可以看成右表,left join 是以左表为准的。
  换句话说,左表(A) 的记录将会全部表示出来,而右表(B) 只会显示符合搜索条件的记录( 例子中为: A.aID = B.bID)

2.2. right join
  select * from A right join B on A.aID = B.bID

  

结果说明:

  仔细观察一下就会发现,和 left join 的结果刚好相反,这次是以右表(B) 为基础的,A表不足的地方用 NULL 填充。

2.3. inner join
  select * from A inner join B on A.aID = B.bID

   

结果说明:

  很明显,这里只显示出了 A.aID = B.bID 的记录。这说明 inner join 并不以谁为基础,它只显示符合条件的记录、

 

转载于:https://www.cnblogs.com/liang1101/p/10330294.html

### MySQL 各种 JOIN 类型及用法 #### 1. INNER JOIN (内连接) INNER JOIN 返回两个表中满足条件的记录组合。只有当左表和右表中的某个键相等时,才会返回相应的行。 ```sql SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key; ``` 此查询会获取两表中共有部分的数据[^3]。 #### 2. LEFT OUTER JOIN (左外连接) LEFT OUTER JOIN 返回左表中的所有记录以及右表中符合条件的记录;如果右表无匹配,则结果为 NULL 值填充。 ```sql SELECT * FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.id; ``` 即使部门表里不存在对应员工的信息,也会显示这些员工数据,并且对于找不到配对的情况,来自右侧表的列将以NULL表示。 #### 3. RIGHT OUTER JOIN (右外连接) RIGHT OUTER JOIN 是 LEFT OUTER JOIN 的镜像版本,它保留右边表格的所有行并补充左边表格中存在的任何匹配项。 ```sql SELECT * FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.id; ``` 这将展示所有的部门信息及其关联的雇员详情,如果没有找到相应的人事条目则为空白或null值代替。 #### 4. FULL OUTER JOIN (全外连接) FULL OUTER JOIN 结合了 LEFT 和 RIGHT 外部联接的功能,即无论哪一侧存在不匹配都将被包含进来。然而需要注意的是,在标准SQL之外的一些数据库系统可能并不支持这种类型的JOIN操作,比如MySQL就不直接提供这一功能。 为了实现相同的效果可以在某些情况下通过UNION ALL来模拟: ```sql (SELECT a.*, b.* FROM table_a AS a LEFT JOIN table_b AS b ON a.key = b.key) UNION ALL (SELECT a.*, b.* FROM table_a AS a RIGHT JOIN table_b AS b ON a.key = b.key); ``` 请注意上述方法可能会引入重复行因此实际应用需谨慎处理去重逻辑。 #### 5. CROSS JOIN (交叉连接) CROSS JOIN 不带ON子句的情况下会产生笛卡尔乘积——意味着第一个表每一行都会与第二个表每一条记录相结合形成新的集合。而在指定了适当条件之后可以得到类似于INNER JOIN的结果集。 ```sql SELECT * FROM customers c CROSS JOIN orders o WHERE c.customer_id = o.customer_id; ``` 这里如果不加WHERE过滤器将会获得客户订单间所有可能性组合而成的大规模列表[^1]。 #### 6. SELF JOIN (自连接) SELF JOIN 表示同一张表内部之间的联合查询,通常用于比较同一个实体的不同实例间的差异关系。 ```sql SELECT t1.column, t2.other_column FROM mytable t1, mytable t2 WHERE condition; ``` 例如在一个员工管理系统的场景下可以通过这种方式找出上下级之间或者同事间的关系链路。 #### 7. NATURAL JOIN (自然连接) NATURAL JOIN 自动基于具有相同名称的列来进行匹配而无需显式声明ON表达式。不过由于其隐式的特性容易造成误解所以一般建议避免使用除非非常清楚所涉及字段含义。 ```sql SELECT * FROM suppliers s NATURAL JOIN products p; ``` 这条命令假设供应商表和产品表中有至少一列同名并且类型兼容从而自动完成它们之间的关联计算过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值