MySQL外连接查询

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-优快云博客

《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)

MySQL9数据库技术_夏天又到了的博客-优快云博客

MySQL内连接查询参看下面博文:

MySQL内连接查询-优快云博客

本文讲解MySQL外连接查询。外连接查询将查询多张表中相关联的行。内连接查询,返回的查询结果集合中仅是符合查询条件和连接条件的行。有时候需要包含没有关联的行中的数据,即在返回的查询结果集合中,不仅包含符合连接条件的行,还包含左表(左外连接或左连接)和右表(右外连接或右连接)。外连接分为左外连接(或左连接)和右外连接(或右连接):

  • LEFT JOIN(左连接):返回左表中的所有记录和右表中与左表中的行匹配的记录。
  • RIGHT JOIN(右连接):返回右表中的所有记录和左表中与右表中的行匹配的记录。

1. LEFT JOIN(左连接)

左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择的表列均为空值。

为了演示的需要,首先创建表orders,SQL语句如下:

CREATE TABLE orders
(
o_num  int      NOT NULL AUTO_INCREMENT,
o_date datetime NOT NULL,
c_id   int      NOT NULL,
PRIMARY KEY (o_num)
) ;

然后插入需要演示的数据,SQL语句如下:
 

INSERT INTO orders(o_num, o_date, c_id)
VALUES(30001, '2008-09-01', 10001),
(30002, '2008-09-12', 10003),
(30003, '2008-09-30', 10004),
(30004, '2008-10-03', 10005),
(30005, '2008-10-08', 10001);

【例5.49】在表customers和表orders中,查询所有客户,包括没有订单的客户,SQL语句如下:

mysql> SELECT customers.c_id, orders.o_num  FROM customers LEFT OUTER JOIN orders ON customers.c_id = orders.c_id;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30005 |
| 10001 | 30001 |
| 10002 |  NULL |
| 10003 | 30002 |
| 10004 | 30003 |
+-------+-------+

结果显示了5条记录,c_id等于10002的客户目前并没有下订单,所以对应的表orders中并没有该客户的订单信息,因此该条记录只取出了表customers中相应的值,而从表orders中取出的值为NULL。

2. RIGHT JOIN右连接

右连接是左连接的反向连接,将返回右表中的所有行和左表中与右表中的行匹配的行。如果右表的某行在左表中没有匹配行,左表将返回空值。

【例5.50】在表customers和表orders中,查询所有订单,包括没有客户的订单,SQL语句如下:

mysql> SELECT customers.c_id, orders.o_num   FROM customers RIGHT OUTER JOIN orders ON customers.c_id = orders.c_id;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10003 | 30002 |
| 10004 | 30003 |
|  NULL | 30004 |
| 10001 | 30005 |
+-------+-------+

结果显示了5条记录,订单号等于30004的订单的客户可能由于某种原因取消了该订单,对应的表customers中并没有该客户的信息,因此该条记录只取出了表orders中相应的值,而从表customers中取出的值为NULL。

5.4.3  复合条件连接查询

复合条件连接查询是在连接查询的过程中,通过添加过滤条件来限制查询的结果,使查询的结果更加准确。

【例5.51】在表customers和表orders中,使用INNER JOIN语法查询表customers中c_id为10001的客户的订单信息,SQL语句如下:

mysql> SELECT customers.c_id, orders.o_num  FROM customers INNER JOIN orders
  ON customers.c_id = orders.c_id AND customers.c_id = 10001;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10001 | 30005 |
+-------+-------+

返回的结果中只有两条记录,这是因为在连接查询时,指定查询c_id为10001的订单信息,添加了过滤条件之后,返回的结果将会变少。

继续使用连接查询,并对查询的结果进行排序。

【例5.52】在表fruits和表suppliers之间,使用INNER JOIN语法进行内连接查询,并对查询结果排序,SQL语句如下:

mysql> SELECT suppliers.s_id, s_name,f_name, f_price FROM fruits INNER JOIN suppliers ON fruits.s_id = suppliers.s_id ORDER BY fruits.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  101 | FastFruit Inc. | apple      |    5.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  102 | LT Supplies    | orange     |   11.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  103 | ACME           | apricot    |    2.20 |
|  103 | ACME           | coconut    |    9.20 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  104 | FNK Inc.       | lemon      |    6.40 |
|  105 | Good Set       | melon      |    8.20 |
|  105 | Good Set       | xbabay     |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  107 | DK Inc.        | xxxx       |    3.60 |
|  107 | DK Inc.        | xbababa    |    3.60 |
+------+----------------+------------+---------+

由结果可以看到,内连接查询的结果按照suppliers.s_id字段进行了升序排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值