sql语句左外连接和右外连接的区别

本文介绍了MySQL中的左外连接和右外连接操作,并通过具体例子展示了如何使用这些连接来查询两个表之间的相关数据。同时,还展示了如何进行分组汇总查询。

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

 mysql> select * from customers;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | tom   |   21 |
|  3 | Mike  |   24 |
|  4 | Jack  |   30 |
|  5 | Linda |   25 |
|  6 | Tom   | NULL |
+----+-------+------+

mysql> select * from orders;
+----+----------------+-------+-------------+
| id | order_number   | price | customer_id |
+----+----------------+-------+-------------+
|  1 | Tom_Order001   |   100 |           1 |
|  2 | Tom_Order002   |   200 |           1 |
|  3 | Tom_Order003   |   300 |           1 |
|  4 | Mike_Order001  |   100 |           3 |
|  5 | Jack_Order001  |   200 |           4 |
|  6 | Linda_Order001 |   100 |           5 |
|  7 | UnknownOrder   |   200 |        NULL |
+----+----------------+-------+-------------+


左外连接:
 如果用左外连接的话,指查询出来的是在右表中没有对应左表中的记录以及符合条件(c.id=o.customer_id)的数据,比如:
  customers为左表,orders为右表
  select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c left outer join orders o on c.id=o.customer_id;
  这样的结果显示的是在左表中的某些用户在orders表中没有对应的订单
  
 mysql> select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c left outer join orders o on c.id=o.customer_id;
+----+-------------+-------+----------+----------------+
| id | customer_id | name  | order_id | order_number   |
+----+-------------+-------+----------+----------------+
|  1 |           1 | tom   |        1 | Tom_Order001   |
|  1 |           1 | tom   |        2 | Tom_Order002   |
|  1 |           1 | tom   |        3 | Tom_Order003   |
|  3 |           3 | Mike  |        4 | Mike_Order001  |
|  4 |           4 | Jack  |        5 | Jack_Order001  |
|  5 |           5 | Linda |        6 | Linda_Order001 |
|  6 |        NULL | Tom   |     NULL | NULL           |
+----+-------------+-------+----------+----------------+
7 rows in set (0.00 sec)
  
右外连接:
 正好和左外连接相反,查询出来的结果是在左表中没有对应的项和以及符合条件(c.id=o.customer_id)的数据
 
mysql>  select c.id,o.customer_id,c.name,o.id order_id,order_number from customers c right outer join orders o on c.id=o.customer_id;
+------+-------------+-------+----------+----------------+
| id   | customer_id | name  | order_id | order_number   |
+------+-------------+-------+----------+----------------+
|    1 |           1 | tom   |        1 | Tom_Order001   |
|    1 |           1 | tom   |        2 | Tom_Order002   |
|    1 |           1 | tom   |        3 | Tom_Order003   |
|    3 |           3 | Mike  |        4 | Mike_Order001  |
|    4 |           4 | Jack  |        5 | Jack_Order001  |
|    5 |           5 | Linda |        6 | Linda_Order001 |
| NULL |        NULL | NULL  |        7 | UnknownOrder   |
+------+-------------+-------+----------+----------------+
7 rows in set (0.00 sec)

=============================================================================

mysql> select name,age,sum(price) from customers c left join orders o on c.id=o.customer_id group by c.id;
+-------+------+------------+
| name  | age  | sum(price) |
+-------+------+------------+
| tom   |   21 |        600 |
| Mike  |   24 |        100 |
| Jack  |   30 |        200 |
| Linda |   25 |        100 |
| Tom   | NULL |       NULL |
+-------+------+------------+
5 rows in set (0.00 sec)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值