【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-优快云博客
《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)
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字段进行了升序排序。