Oracle数据库之多表查询、层次查询(五)

目录

前言

Oracle 的连接条件的类型

多表查询

1. 使用JOIN关键字

2. 使用WHERE子句进行多表查询

3. 子查询

4. EXISTS关键字

5. 集合运算

6. 注意事项:

层次查询

前言

Oracle 的连接条件的类型

  • 等值连接
  • 不等值连接
  • 外连接
  • 自连接

多表查询

在Oracle数据库中,多表查询通常涉及到从两个或更多的表中检索数据,并通过某种关联条件将这些表连接起来。以下是一些关于Oracle多表查询的基本方法和示例:

1. 使用JOIN关键字

  • INNER JOIN(内连接):返回两个表中满足连接条件的记录。

    SELECT *   
    FROM table1   
    INNER JOIN table2 ON table1.id = table2.id;
  • LEFT JOIN(左连接):从左表返回所有的记录,以及右表中连接字段相等的记录。如果右表中没有匹配,则结果中右表的部分包含空值。

    SELECT *   
    FROM table1   
    LEFT JOIN table2 ON table1.id = table2.id;
  • RIGHT JOIN(右连接):与左连接相反,从右表返回所有的记录。
    SELECT *   
    FROM table1   
    RIGHT JOIN table2 ON table1.id = table2.id;
  • FULL OUTER JOIN(全外连接):当左表或右表中有匹配时返回行。

2. 使用WHERE子句进行多表查询

虽然JOIN关键字更直观且更常用于多表查询,但你也可以使用WHERE子句来连接表。但请注意,使用WHERE子句进行多表查询可能会导致笛卡尔积问题(即返回两个表中所有可能的组合),因此应谨慎使用。

SELECT *   
FROM table1, table2   
WHERE table1.id = table2.id;

3. 子查询

子查询是嵌套在另一个查询中的查询。你可以在主查询的WHERE子句、FROM子句或SELECT子句中使用子查询。

SELECT *   
FROM table1   
WHERE id IN (SELECT id FROM table2 WHERE some_condition);

4. EXISTS关键字

EXISTS用于检查子查询是否返回任何结果。如果子查询返回至少一行,则EXISTS返回TRUE,否则返回FALSE。

SELECT *   
FROM table1 t1   
WHERE EXISTS (SELECT 1 FROM table2 t2 WHERE t1.id = t2.id);

5. 集合运算

  • UNION:返回两个或多个SELECT语句的结果集的并集,但不包括重复行。
  • UNION ALL:返回两个或多个SELECT语句的结果集的并集,包括重复行。
  • INTERSECT:返回两个或多个SELECT语句的结果集的交集。
  • MINUS:返回第一个SELECT语句的结果集,但排除第二个SELECT语句的结果集中出现的任何行。

6. 注意事项:

  • 在进行多表查询时,确保你理解了表之间的关系以及你想从查询中获得什么。
  • 使用适当的连接类型(如INNER JOIN、LEFT JOIN等)来确保你获得所需的结果。
  • 当使用子查询时,注意子查询的性能,并考虑是否可以使用JOIN或其他技术来优化查询。
  • 在使用集合运算时,确保参与运算的SELECT语句具有相同的列数和数据类型,并且这些列的顺序也必须相同。

层次查询

Oracle中的层次查询(Hierarchical Queries)用于遍历具有树形结构的数据集合,以获取树的层次关系报表。这种查询特别适用于处理具有父子关系的数据,如组织结构、文件系统目录等。

层次查询主要通过START WITHCONNECT BY子句来实现。START WITH子句用于指定遍历的起始点(根节点),而CONNECT BY子句则用于定义父子关系以及遍历的方向。

以下是层次查询的基本语法:

SELECT [LEVEL], column, expr...  
FROM table  
[WHERE condition]  
START WITH condition  
CONNECT BY [PRIOR] column1 = column2 | column1 = [PRIOR] column2;
  • LEVEL是一个伪列,表示当前行在树中的层次。例如,根节点的层次为1,其子节点的层次为2,依此类推。
  • table是包含树形数据的表名。
  • WHERE子句用于限制查询返回的行,但不影响层次关系。被截断的节点的下层子节点不受影响。
  • START WITH子句用于指定遍历的起始点。对于真实的层次关系,这个子句是必须的。
  • CONNECT BY子句用于定义父子关系以及遍历的方向。PRIOR是一个运算符,用于指定关系的方向。例如,PRIOR column1 = column2表示从父节点到子节点的遍历,而column1 = PRIOR column2则表示从子节点到父节点的遍历。

以下是一个具体的示例,假设有一张名为employees的表,其中包含员工的编号(employee_id)、姓名(last_name)和上级的编号(manager_id):

SELECT last_name, employee_id, manager_id, LEVEL  
FROM employees  
START WITH manager_id IS NULL -- 从根节点(没有上级)开始遍历  
CONNECT BY PRIOR employee_id = manager_id; -- 定义父子关系:当前员工的上级是前一行员工的编号

这个查询将返回所有员工的姓名、编号、上级编号以及他们在组织中的层次。

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值