在本教程中,您将学习如何使用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子句从多个表中检索数据。