Oracle多表查询详解:笛卡尔积与内连接示例

需积分: 9 0 下载量 181 浏览量 更新于2024-07-16 收藏 210KB PDF 举报
Oracle数据库中的多表查询是数据检索过程中常见的操作,它允许从多个表中同时获取相关数据。在SQL语句中,多表查询通常涉及两种基本类型:笛卡尔积和关联查询(内联接)。 首先,我们来看"笛卡尔积"部分。当你运行`SELECT * FROM bonus;`和`SELECT * FROM salgrade;`这样的查询时,实际上执行的是两张表的笛卡尔积。这意味着每行来自第一个表与第二张表的所有行组合在一起,形成一个新的结果集,即使它们之间没有实际的关联关系。这种操作在实际开发中极少有用,因为它可能会导致数据量急剧增加,尤其是当表的大小很大时,效率非常低。 接下来,多表查询的基本形式是使用逗号(`,`)来分隔两个或更多的表名,如`SELECT * FROM emp, dept;`。这种写法虽然简洁,但默认执行的是隐式内联接,即每个行在第一个表中匹配到第二个表中的所有行。如果没有特定的连接条件,这实际上也是笛卡尔积的结果。 内联接更为精确,分为几种类型: 1. **等值内联接**:例如`SELECT * FROM emp e1, dept d1 WHERE e1.deptno = d1.deptno;`,在这个例子中,只有当员工的部门编号(deptno)与经理的部门编号相等时,才会返回匹配的行。这是最常见的内联接类型,用于查找具有相同或特定条件的数据。 2. **不等值内联接**:`SELECT * FROM emp e1, dept d1 WHERE e1.deptno <> d1.deptno;`,这里查询的是不同部门的员工和经理,即员工和经理不在同一个部门的情况。 3. **自联接**:当一个表与自身进行连接时,如查询员工与其上级的联系,例如`SELECT e1.empno, e1.ename, m1.ename FROM emp e1, emp m1 WHERE e1.mgr = m1.empno;`,这表明每个员工的经理是另一个员工。 4. **显示内联接**:使用`INNER JOIN`关键字明确表示内联接,如`SELECT * FROM emp e1 INNER JOIN dept d1 ON e1.deptno = d1.deptno;`,这与`SELECT * FROM emp, dept WHERE e1.deptno = d1.deptno;`的效果相同,但语法更清晰。 5. **更复杂的内联接**:例如,查询员工、经理及其所在部门的完整信息时,可能需要同时连接三个表:员工、经理和部门,如`SELECT e1.empno, e1.ename, d1.dname, m1.ename, d2.dname FROM emp e1, emp m1, dept d1, dept d2 WHERE e1.mgr = m1.empno AND e1.deptno = d1.deptno AND m1.deptno = d2.deptno;`,这样能得到员工、经理、经理的部门和员工的部门等多维度信息。 总结来说,Oracle数据库的多表查询通过内联接功能,使得我们可以根据业务需求从多个表中获取所需数据,并通过不同的连接条件来筛选出满足特定关系的行。理解这些基本概念和语法对于编写高效、准确的SQL查询至关重要。