mysql-内连接、左连接、右链接查询

本文详细讲解了MySQL内连接(INNER JOIN)、左连接(LEFT JOIN)和右连接(RIGHT JOIN)在runoob_tbl与tcount_tbl表的应用,展示了如何通过作者名进行数据关联,并介绍了NULL值在不同连接类型中的表现。

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

mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程  | 10           |
| RUNOOB.COM    | 20           |
| Google        | 22           |
+---------------+--------------+
3 rows in set (0.01 sec)
 
mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | 学习 PHP    | 菜鸟教程  | 2017-04-12      |
| 2         | 学习 MySQL  | 菜鸟教程  | 2017-04-12      |
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
| 5         | 学习 C      | FK            | 2017-04-05      |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.01 sec)

INNER JOIN(内连接,或等值连接):

使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
相当于:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鸟教程    | 10             |
| 2           | 菜鸟教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
+-------------+-----------------+----------------+

 MySQL LEFT JOIN:

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鸟教程    | 10             |
| 2           | 菜鸟教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+

 MySQL RIGHT JOIN:

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鸟教程    | 10             |
| 2           | 菜鸟教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| NULL        | NULL            | 22             |
+-------------+-----------------+----------------+

### 不同类型的 JOIN 介绍 #### 左连接 (LEFT JOIN) 左连接返回表中的所有记录,以及表中存在的匹配记录。如果表中不存在匹配,则结果集中相应的列包含 NULL。 ```sql SELECT * FROM table_left AS l LEFT JOIN table_right AS r ON l.id = r.left_id; ``` 此操作会保留侧表格 `table_left` 的全部行数,并尝试找到侧表格 `table_right` 中相匹配的项;当找不到对应关系时,在最终的结果集里来自边表的相关字段会被填充成NULL值[^1]。 #### 连接 (RIGHT JOIN) 连接正好相反于左连接,它返回的是表所有的记录加上边存在的匹配记录。对于那些在表没有找到配对的情况,其对应的属性将被设置为空(NULL)。 ```sql SELECT * FROM table_left AS l RIGHT JOIN table_right AS r ON l.id = r.left_id; ``` 这里展示了如何利用SQL语句实现两个表之间的外联接,即优先显示`table_right`的所有条目并补充可能有的关联数据自`table_left`之中。 #### 内连接 (INNER JOIN) 内连接只选取两表间存在交集的部分作为输出,也就是说只有满足条件(通常是键值相同)才会出现在查询结果当中。 ```sql SELECT * FROM table_left AS l INNER JOIN table_right AS r ON l.id = r.left_id; ``` 上述例子说明了怎样执行一次内部链接,仅获取到共同拥有的部分——也就是两个集合重叠之处所代表的信息实体。 ### 实际案例分析 假设有一个订单(order)表和客户(customer)表: | order_id | customer_id | | --- | --- | | 1 | 1 | | 2 | 2 | | customer_id | name | | --- | --- | | 1 | Alice | | 2 | Bob | | 3 | Charlie | - 使用 **INNER JOIN** 将得到如下结果: | order_id | customer_id | name | | --- | --- | --- | | 1 | 1 | Alice | | 2 | 2 | Bob | 这是因为查找出两者都具有的customer_ids(1 和 2),而忽略了不在此范围内的任何一方的数据。 - 如果采用 **LEFT JOIN**, 则可以获得这样的列表: | order_id | customer_id | name | | --- | --- | --- | | 1 | 1 | Alice | | 2 | 2 | Bob | 这表明即使某些顾客从未下单过也不会丢失这些客户的资料,因为是从订单表出发做扩展。 - 对应地,若是选择了 **RIGHT JOIN**, 输出将是: | order_id | customer_id | name | | --- | --- | --- | | 1 | 1 | Alice | | 2 | 2 | Bob | | NULL | 3 | Charlie | 这意味着即便有些顾客未曾有过购买行为,依然会在报表中体现出来,只是它们不会有关联的订单编号而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值