在本教程中,您将学习如何使用Oracle LEFT JOIN
子句来查询多个表中的数据。
以下语句说明连接两个表T1
和T2
时的LEFT JOIN
子句的语法:
SELECT column_list FROM T1 LEFT JOIN T2 ON join_predicate;
在这个查询中,T1
是左表,T2
是右表。查询将T1
表中的每一行与T2
表中的行进行比较。如果T1
和T2
表中的一对行满足连接谓词,查询将组合两个表中行的列值,并将结果行记录包含在结果集中。
如果T1
表中的行在T2
表中没有找到匹配的行,则查询将会将SELECT子句中出现在T2
表的每个列的值设置为NULL
并与T1
表的行记录组合作为结果集输出。
换句话说,左连接(Left join)返回左表中的所有行,并从右表中返回匹配的行。
请参阅示例数据库中的以下orders
和employees
表,其ER结构图如下所示 -
orders
表存储销售订单标题数据。它的salesman_id
列引用employees
表中的employee_id
列。
salesman_id
列的值部分是无效的,这意味着并不是所有的订单都有负责订单的销售人员。
以下语句从orders
表和employees
表中检索所有订单和员工数据:
SELECT order_id, status, first_name, last_name FROM orders LEFT JOIN employees ON employee_id = salesman_id ORDER BY order_date DESC;
执行上面查询语句,得到以下结果 -
如上图中,结果包括订单表中的所有行。 对于在employees
表中没有匹配行的orders
表中的行记录时,使用NULL
值(红色线框内)。
以下语句使用LEFT JOIN
子句演示如何连接三个表:orders
, employees
和 customers
,如下查询语句 -
SELECT order_id, name AS customer_name, status, first_name, last_name FROM orders LEFT JOIN employees ON employee_id = salesman_id LEFT JOIN customers ON customers.customer_id = orders.customer_id ORDER BY order_date DESC;
执行上面查询语句,得到以下结果 -
USING
子句指定在连接表时要测试哪个列的相等性。以下显示了如何在LEFT JOIN
中使用USING
子句的语法:
SELECT column_list FROM T1 LEFT JOIN T2 USING(c1,c2,c3, ...);
在这个语句中,USING
子句中列出的列必须在T1
和T2
表中有存在。
上面查询语句使用USING
子句改写后等同于使用ON
子句的语句,以下所示:
SELECT column_list FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1 AND t1.c2 = t2.c2 AND t1.c3 = t2.c3 AND ... ;
以下语句演示如何在LEFT JOIN
中使用USING
子句:
SELECT name, order_id, status, order_date FROM customers LEFT JOIN orders USING(customer_id) ORDER BY name;
执行上面查询语句,得到以下结果 -
上面语句检索所有客户及其订单。对于尚未下过任何订单的客户,SELECT
子句使用NULL
设置在orders
表的列,即:order_id
,status
和order_date
。
以下语句查询获得订单ID为58
的订单和销售员数据。
SELECT order_id, status, employee_id, last_name FROM orders LEFT JOIN employees ON employee_id = salesman_id WHERE order_id = 58;
执行上面查询语句,得到以下结果 -
现在,如果将条件从WHERE子句移动到LEFT JOIN
的ON
子句:
SELECT order_id, status, employee_id, last_name FROM orders LEFT JOIN employees ON employee_id = salesman_id AND order_id = 58;
执行上面查询语句,得到以下结果 -
在这种情况下,查询将返回所有订单,但只有订单58
具有与其关联的销售员数据。
请注意,对于内连接,置于ON
中的条件与置于WHERE
子句中的条件相同。
在本教程中,您已学习如何使用Oracle LEFT JOIN
子句从多个表中检索数据。