当前位置:首页 > SCHOOL > Oracle字典 > 正文内容

Oracle Inner Join子句(多表连接)

admin3年前 (2022-03-23)Oracle字典2840

在本教程中,您将学习Oracle INNER JOIN子句以从表中检索具有其他表的匹配行的行。

内连接是一种常用的多表关联查询方式,一般使用关键字 INNER JOIN 来实现。其中,INNER 关键字可以省略,当只使用 JOIN 关键字时,语句只表示内连接操作。在使用内连接查询多个表时,必须在 FROM 子句之后定义一个 ON 子句,该子句用来指定两个表实现内连接的“连接条件”。需要注意的是,在内连接的检索结果中,所有记录行都是满足连接条件的。

Oracle INNER JOIN语法简介

在关系数据库中,数据分布在许多相关的表中。例如,在样本数据库中,销售订单数据主要存储在orders和order_items表中。参考以下ER图结构 

d2141ce7d4ad72a83e9fb315dcb9a384.png

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表的每对匹配行的列值就会被合并到结果集中的一行中。

1. Oracle INNER JOIN示例

以下查询使用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列中具有相同的值时,查询将两个表的行中的列值合并到结果行中,并将其包含在结果集中。

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

e1fc85f21c07ee1a5a4c9c29a48104f8.png

2. 使用USING子句的Oracle INNER JOIN示例

除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;

执行上面示例代码,得到以下结果

97716be15511e31740413e7d0d83db4d.png

3. INNER JOIN多表连接示例

内部联接子句可以联接两个以上的表。 在实践中,应该限制连接表的数量来提高性能。 以下语句显示如何连接三个表:

以下语句显示如何连接三个表: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;

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

6b57fdb9714f23bc009fca62cfc143f7.png

以下示例说明如何连接四个表: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;

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

2b9fdce5d3b4a80ad5f9ac2f8771299f.png

在本教程中,您已学习如何使用Oracle内部联接从表中检索具有其他表的匹配行的数据记录。


 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。
标签: 连接表

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。