sql 语法中 join 的所有用法总结(简单例子)

join 常见的用法有

目录

left join (left outer join)

right join (right outer join)

join (inner join)

full join(full outer join 、outer join)

cross join


说明:left join 就是 left outer join、 right join 就是 right outer join、 join 就是 inner join 、full join 就是 full outer join 或者 outer join,他们就是简写而已!

 

下面来个简单的例子,让我们理解下他们分别是什么样的。

先建两个非常简单的表  table_a 、table_b ,表结构如下:

后面连接用的字段是 aId  和  bId   ,他们有4行是有相同的值的,然后每个表有一行是不同的

 

left join(left outer join)

左连接,表 table_a 左连接表 table_b ,表示以表 table_a 为主,关联上表 table_b 的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据,其余没有的为null

select * from table_a a left join table_b b on a.aId = b.bId;

语句查询结果如下:

right join(right outer join)

右连接,表 table_a 右连接表 table_b ,表示以表 table_b 为主,关联查询表 table_a 的数据,查出来的结果显示右边的所有数据,然后左边显示的是和右边有交集部分的数据,其余没有的为null

select * from table_a a right join table_b b on a.aId = b.bId;

语句查询结果如下:

join(inner join)

内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联(on 条件不满足)就不显示出来

select * from table_a a inner join table_b b on a.aId = b.bId;

语句查询结果如下:

 

full join(full outer join 、outer join)

外连接,就是求两个表集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录

mySql 不支持 full join ,下面语句在 mySql 下会运行报错!

select * from table_a a full join table_b b on a.aId = b.bId;

因为外连接,他还有一种概念的说法是:left join 和 right join 的结果加起来再去重

所以可以用 union 连接 left join 和 right join 的结果来替换 outer join

(注意是 union,不是 union all)

select * from table_a a left join table_b b on a.aId = b.bId
union 
select * from table_a a right join table_b b on a.aId = b.bId;

查询结果如下:

select * from table_a a outer join table_b b on a.aId = b.bId;

 

cross join

交叉连接,就是得出两个表的笛卡尔积,这个在实际开发中用得很少

注意:cross join 后面是不要加 on 条件的

说明:在 mysql 中,如果你用 cross join 后面跟 on 条件,那他跟 join 的效果是一样的

select * from table_a cross join table_b

查询结果如下:

 

 

 

 

<think>嗯,用户想要了解MySQL中LEFT JOIN的使用方法,包括教程、示例、语法和解释。首先,我需要回忆LEFT JOIN的基本概念。LEFT JOIN属于SQL中的外连接,它会返回左表的所有记录,即使右表中没有匹配的行。这种情况下,右表的字段会用NULL填充。 接下来,我应该整理语法结构。根据引用中的资料,LEFT JOIN的基本语法是SELECT列名FROM左表LEFT JOIN右表ON连接条件。比如,用户可能想知道如何写这样的查询语句,以及如何处理连接后的过滤条件,比如WHERE子句的位置。 然后,示例部分很重要。用户可能需要实际的SQL例子来理解LEFT JOIN如何工作。比如,假设有两个表,用户表和订单表,通过LEFT JOIN可以获取所有用户及其订单,即使有些用户没有订单。这时候,订单相关的字段会是NULL。 另外,需要注意LEFT JOIN和INNER JOIN的区别,以及LEFT JOIN和RIGHT JOIN的对比。根据引用,LEFT JOIN会保留左表所有记录,而INNER JOIN只返回匹配的记录。这可能帮助用户理解何时使用哪种连接类型。 还要考虑用户可能的疑问,比如性能问题,或者如何处理多表连接的情况。比如,LEFT JOIN多个表时的顺序和条件写法。此外,可能涉及到使用LEFT JOIN时的过滤条件应该放在ON子句还是WHERE子句,这会影响结果集。例如,在ON子句中添加条件会先过滤右表再连接,而WHERE子句是在连接后过滤,可能导致左表记录被排除。 还需要检查是否有常见错误或注意事项,比如重复列名、索引的使用等,以提高查询效率。根据引用中的资料,LEFT JOIN在处理关系型数据库时非常常见,特别是在需要分析左表全部数据时使用。 最后,生成相关问题时要考虑用户可能进一步想知道的内容,比如性能优化、使用场景、与RIGHT JOIN的区别等。这些问题有助于用户深入理解LEFT JOIN的应用和限制。</think>### MySQL LEFT JOIN 使用教程 #### 1. LEFT JOIN 基本语法 LEFT JOIN 用于从左表(主表)返回所有记录,即使右表(从表)中没有匹配项。语法如下: ```sql SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名 [WHERE 条件]; ``` 如果右表无匹配数据,则右表字段显示为 `NULL`[^3][^4]。 --- #### 2. 核心特性 - **保留左表所有数据**:即使右表无匹配,左表记录仍会被保留[^3]。 - **NULL填充机制**:右表未匹配的字段自动填充为 `NULL`[^2]。 - **与 INNER JOIN 对比**:INNER JOIN 仅返回两表匹配的数据,LEFT JOIN 包含左表全部数据。 --- #### 3. 使用示例 假设存在两个表: - **`users` 表**:存储用户信息(id, name) - **`orders` 表**:存储订单信息(order_id, user_id, amount) **目标**:查询所有用户及其订单(含未下单用户) ```sql SELECT users.name, orders.order_id, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id; ``` 结果示例: ``` | name | order_id | amount | |--------|----------|--------| | Alice | 1001 | 200 | | Bob | NULL | NULL | -- Bob无订单时显示NULL ``` --- #### 4. 高级用法 **场景1:过滤右表数据** ```sql SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id AND orders.amount > 500; -- 在连接时直接过滤右表 ``` **场景2:连接后筛选结果** ```sql SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.amount IS NULL; -- 查找未下单用户 ``` --- #### 5. 注意事项 1. **性能优化**:为连接字段(如 `user_id`)添加索引可加速查询。 2. **多表连接**:可连续使用多个 LEFT JOIN,但需注意表顺序对结果的影响。 3. **字段歧义**:若两表存在同名字段(如 `id`),需用 `表名.字段名` 明确指定[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值