MySQL外连接查询详解(附带实例)
连接是关系数据库的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接(Inner Join)、外连接(Out Join)等。通过连接运算符可以实现多表查询。
在关系数据库管理系统中,建立表时各数据之间的关系不必确定,常把一个实体的所有信息存放在一张表中。当查询数据时,通过连接操作查询出存放在多张表中的不同实体的信息。当两张或多张表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
本节将介绍多表之间的外连接查询。外连接查询将查询多张表中相关联的行。内连接查询,返回的查询结果集合中仅是符合查询条件和连接条件的行。有时候需要包含没有关联的行中的数据,即在返回的查询结果集合中,不仅包含符合连接条件的行,还包含左表(左外连接或左连接)和右表(右外连接或右连接)。
外连接分为左外连接(或左连接)和右外连接(或右连接):
为了演示的需要,首先创建数据表 customers,SQL 语句如下:
再创建表 orders,SQL 语句如下:
【实例】在表 customers 和表 orders 中,查询所有客户,包括没有订单的客户,SQL 语句如下:
【实例】在表 customers 和表 orders 中,查询所有订单,包括没有客户的订单,SQL 语句如下:
在关系数据库管理系统中,建立表时各数据之间的关系不必确定,常把一个实体的所有信息存放在一张表中。当查询数据时,通过连接操作查询出存放在多张表中的不同实体的信息。当两张或多张表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
本节将介绍多表之间的外连接查询。外连接查询将查询多张表中相关联的行。内连接查询,返回的查询结果集合中仅是符合查询条件和连接条件的行。有时候需要包含没有关联的行中的数据,即在返回的查询结果集合中,不仅包含符合连接条件的行,还包含左表(左外连接或左连接)和右表(右外连接或右连接)。
外连接分为左外连接(或左连接)和右外连接(或右连接):
- LEFT JOIN(左连接):返回左表中的所有记录和右表中与左表中的行匹配的记录;
- RIGHT 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。