Oracle 专题
专题目录
您的位置:database > Oracle专题 > Oracle左连接
Oracle左连接
作者:--    发布时间:2019-11-20

在本教程中,您将学习如何使用oracle left join子句来查询多个表中的数据。

oracle left join子句简介

以下语句说明连接两个表t1t2时的left join子句的语法:

select
    column_list
from
    t1
left join t2 on
    join_predicate;

在这个查询中,t1是左表,t2是右表。查询将t1表中的每一行与t2表中的行进行比较。如果t1t2表中的一对行满足连接谓词,查询将组合两个表中行的列值,并将结果行记录包含在结果集中。

如果t1表中的行在t2表中没有找到匹配的行,则查询将会将select子句中出现在t2表的每个列的值设置为null并与t1表的行记录组合作为结果集输出。

换句话说,左连接(left join)返回左表中的所有行,并从右表中返回匹配的行。

oracle left join示例

请参阅示例数据库中的以下ordersemployees表,其er结构图如下所示 -

oracle左连接

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;

执行上面查询语句,得到以下结果 -

oracle左连接

如上图中,结果包括订单表中的所有行。 对于在employees表中没有匹配行的orders表中的行记录时,使用null值(红色线框内)。

oracle left join 连接多个表

以下语句使用left join子句演示如何连接三个表:orders, employeescustomers,如下查询语句 -

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;

执行上面查询语句,得到以下结果 -

oracle左连接

oracle left与using子句联接

using子句指定在连接表时要测试哪个列的相等性。以下显示了如何在left join中使用using子句的语法:

select
    column_list
from
    t1
left join t2 using(c1,c2,c3, ...);

在这个语句中,using子句中列出的列必须在t1t2表中有存在。

上面查询语句使用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;

执行上面查询语句,得到以下结果 -

oracle左连接

上面语句检索所有客户及其订单。对于尚未下过任何订单的客户,select子句使用null设置在orders表的列,即:order_idstatusorder_date

on与where子句中的条件

以下语句查询获得订单id为58的订单和销售员数据。

select
    order_id,
    status,
    employee_id,
    last_name
from
    orders
left join employees on
    employee_id = salesman_id
where
    order_id = 58;

执行上面查询语句,得到以下结果 -

oracle左连接

现在,如果将条件从where子句移动到left joinon子句:

select
    order_id,
    status,
    employee_id,
    last_name
from
    orders
left join employees on
    employee_id = salesman_id
    and order_id = 58;

执行上面查询语句,得到以下结果 -

oracle左连接

在这种情况下,查询将返回所有订单,但只有订单58具有与其关联的销售员数据。

请注意,对于内连接,置于on中的条件与置于where子句中的条件相同。

在本教程中,您已学习如何使用oracle left join子句从多个表中检索数据。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册