Oracle数据库查询深入理解:多表查询与连接操作

需积分: 18 9 下载量 83 浏览量 更新于2024-07-19 1 收藏 5.82MB DOC 举报
"Oracle学习笔记,李兴华老师的Oracle教程,涵盖了从基础到高级的Oracle知识,包括多表查询、连接操作等重要概念。" Oracle数据库是企业级的关系型数据库管理系统,广泛应用于数据存储和管理。在Oracle学习笔记中,重点讲述了多表查询这一核心概念,这对于理解复杂业务数据至关重要。 多表查询允许我们从两个或多个表中获取数据,通过联接这些表来获取更完整的信息。在例子中,为了查询雇员的名称、所在部门及其位置,我们需要将雇员表(emp)与部门表(dept)进行联接。通常,我们会为表指定别名以简化查询语句,例如,`empe`代表`emp`表,`deptd`代表`dept`表。 在标准的SQL查询中,一个常见的多表查询是内连接(INNER JOIN),它仅返回两个表中匹配的行。例如: ```sql SELECT e.empno, e.ename, d.deptno, d.dname, d.loc FROM empe, deptd WHERE e.deptno = d.deptno; ``` 但这个例子中,由于40部门在雇员表中没有对应的记录,因此40部门的信息不会出现在查询结果中。为了包含所有部门,我们可以使用外连接。 左连接(LEFT JOIN)会返回左表(在连接条件中位于前列的表)的所有记录,即使在右表中没有匹配项。在Oracle中,使用`(+)`操作符可以实现左连接,如: ```sql SELECT e.empno, e.ename, d.deptno, d.dname, d.loc FROM empe, deptd WHERE e.deptno(+) = d.deptno; ``` 这里,`(+)`放在`e.deptno`前面,表示如果在部门表中找不到匹配的部门编号,仍保留雇员表中的记录,从而确保40部门被显示出来。 另一方面,右连接(RIGHT JOIN)则返回右表的所有记录,即使在左表中没有匹配项。如果将`(+)`放在`d.deptno`前面,就会实现右连接。 SQL:1999标准引入了更多的联接类型,如自然连接(NATURAL JOIN)和USING子句。自然连接会基于共享的列自动进行联接,而USING子句允许我们指定用于联接的特定列。例如: ```sql CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE DEPTNO = 10; SELECT * FROM emp NATURAL JOIN dept; ``` 这条查询将根据相同的列名自动联接emp和dept表。 另外,交叉连接(CROSS JOIN)会产生两个表的笛卡尔积,即每个左表的记录与右表的每个记录组合。这通常不是我们想要的结果,但在特定情况下,如计算所有可能的组合时,可能会用到。 USING子句使得联接更加简洁明了,如: ```sql SELECT * FROM empe JOIN deptd USING (deptno) WHERE deptno = 30; ``` 这条语句将基于`deptno`列联接emp和dept表,并只返回部门编号为30的记录。 Oracle学习笔记涵盖了数据库查询的基础和进阶知识,对于理解和应用多表查询以及各种类型的连接操作提供了深入的指导。通过这些笔记,学习者可以系统地掌握Oracle数据库管理的关键技能。