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