首页 > 编程笔记 > MySQL笔记 阅读:15

MySQL外连接查询详解(附带实例)

连接是关系数据库的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接(Inner Join)、外连接(Out Join)等。通过连接运算符可以实现多表查询。

在关系数据库管理系统中,建立表时各数据之间的关系不必确定,常把一个实体的所有信息存放在一张表中。当查询数据时,通过连接操作查询出存放在多张表中的不同实体的信息。当两张或多张表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

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

外连接分为左外连接(或左连接)和右外连接(或右连接):

LEFT JOIN(左连接)

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

为了演示的需要,首先创建数据表 customers,SQL 语句如下:
CREATE TABLE customers
(
c_id          int        NOT NULL AUTO_INCREMENT,
c_name        char(50)   NOT NULL,
c_address     char(50)   NULL,
c_city        char(50)   NULL,
c_zip         char(10)   NULL,
c_contact     char(50)   NULL,
c_email       char(255)  NULL,
PRIMARY KEY (c_id)
);
插入数据,SQL 语句如下:
INSERT INTO customers(c_id, c_name, c_address, c_city, c_zip,  c_contact, c_email)
VALUES(10001, 'RedHook', '200 Street ', 'Tianjin',  '300000',  'LiMing',
'LMing@163.com'),
(10002, 'Stars', '333 Fromage Lane', 'Dalian', '116000',  'Zhangbo',
'Jerry@hotmail.com'),
(10003, 'Netbhood', '1 Sunny Place', 'Qingdao',  '266000', 'LuoCong', NULL),
(10004, 'JOTO', '829 Riverside Drive', 'Haikou',  '570000',  'YangShan',
'sam@hotmail.com');

再创建表 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);

【实例】在表 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。

RIGHT JOIN(右连接)

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

【实例】在表 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。

相关文章