在本教程中,您将学习oracle inner join
子句,用来从表中检索在其他表的匹配行的行。
在关系数据库中,数据分布在许多相关的表中。例如,在样本数据库中,销售订单数据主要存储在orders
和order_items
表中。参考以下er图结构 -
orders
表存储订单的标题信息,order_items
表存储订单购买货物的明细。
订单(orders
)表通过order_id
列链接到order_items
表。这意味着对于orders
表中的每一行,我们都可以在order_items
表中,通过order_id
列中找到具有相同值的一个或多个行数据。
要从两个或多个相关表中查询数据,请使用inner join
子句。 以下语句说明如何连接两个表t1
和t2
。
select
*
from
t1
inner join t2 on join_predicate;
下面让我们仔细地来看看上面的语句:
from
子句之后的t1
是指定的主表。inner join
子句中指定条件join_predicate
。上面语句中的连接表是t2
。查询通过基于连接谓词组合表t1
和t2
的列值来返回结果集。它将表t1
的每一行与表t2
的行进行比较,以查找满足连接谓词的所有行记录。只要通过匹配非null
值来满足连接谓词,则t1
和t2
表的每对匹配行的列值就会被合并到结果集中的一行中。
以下查询使用inner join
子句从orders
表和order_items
表中检索数据:
select
*
from
orders
inner join order_items on
order_items.order_id = orders.order_id
order by
order_date desc;
在这个例子中,连接谓词(条件)是 -
order_items.order_id = orders.order_id
查询将orders
表中的每一行与order_items
表中的行进行比较。当两个表中的行在order_id
列中具有相同的值时,查询将两个表的行中的列值合并到结果行中,并将其包含在结果集中。
所以,执行上面查询语句,得到以下结果 -
除on
子句外,还可以使用using
子句指定在连接表时要测试哪些列的相等性。
下面用using
子句说明inner join
的语法。
select
*
from
t1
inner join t2 on( c1, c2, ... );
请注意,using
子句中列出的列(如c1
和c2
)必须在t1
和t2
表中都存在(可用)。
以下示例使用inner join
和using
子句从orders
表和order_items
表中检索数据:
select
*
from
orders
inner join order_items using( order_id )
order by
order_date desc;
执行上面示例代码,得到以下结果 -
内部联接子句可以联接两个以上的表。 在实践中,应该限制连接表的数量来提高性能。 以下语句显示如何连接三个表:
以下语句显示如何连接三个表:orders
,order_items
和customers
, 为了保证查询语句的效率,超过三个表连接慎用。
select
name,
order_id,
order_date,
item_id,
product_id,
quantity,
unit_price
from
orders
inner join order_items
using(order_id)
inner join customers
using(customer_id)
order by
order_date desc,
order_id desc,
item_id asc;
执行上面查询语句,得到以下结果 -
以下示例说明如何连接四个表:orders
,order_items
,customers
和products
。参考以下查询语句 -
select
name as customer_name,
order_id,
order_date,
item_id,
product_name,
quantity,
unit_price
from
orders
inner join order_items
using(order_id)
inner join customers
using(customer_id)
inner join products
using(product_id)
order by
order_date desc,
order_id desc,
item_id asc;
执行上面示例查询语句,得到以下结果 -
在本教程中,您已学习如何使用oracle内部联接从表中检索具有其他表的匹配行的数据记录。