Oracle多表查询与自连接、子查询笔记

需积分: 3 1 下载量 161 浏览量 更新于2024-07-30 收藏 653KB PPTX 举报
"这是一份关于Oracle数据库的学习笔记,由韩顺平老师的讲解内容整理而成,主要涵盖了多表查询、自连接查询以及子查询等重要概念。笔记详细介绍了如何通过SQL语句进行复杂的数据检索,旨在帮助学习者理解和掌握Oracle数据库的高级查询技巧。" 在Oracle数据库中,多表查询是日常数据操作中必不可少的一部分。当需要从多个表中获取关联信息时,就需要使用多表查询。例如,要同时显示员工的姓名、工资和所在部门的名字,就需要将`emp`表(员工表)与`dept`表(部门表)进行联接。在SQL中,可以使用如下语句实现: ```sql SELECT a1.ename AS 员工姓名, a1.sal AS 雇员工资, a2.dname AS 部门名称 FROM emp a1, dept a2 WHERE a1.deptno = a2.deptno; ``` 这里,`a1`和`a2`是别名,用于简化表名,`WHERE`子句中的条件`a1.deptno = a2.deptno`确保了两表的关联基于部门编号。如果要限制查询条件,例如只显示部门编号为10的信息,可以添加额外的条件: ```sql SELECT a1.ename, a1.sal, a2.dname FROM emp a1, dept a2 WHERE a1.deptno = a2.deptno AND a1.deptno = 10; ``` 此外,查询还可以涉及更多的字段和复杂的逻辑,例如显示员工的姓名、工资和工资等级,这需要结合`salgrade`表(工资等级表)进行查询: ```sql SELECT a1.ename, a1.sal, a2.grade FROM emp a1, salgrade a2 WHERE a1.sal BETWEEN a2.losal AND a2.hisal; ``` 在查询结果中按特定字段排序也很常见,例如按部门名称降序排列: ```sql SELECT a.ename AS 雇员姓名, a.sal AS 雇员工资, b.dname AS 部门名称 FROM emp a, dept b WHERE a.deptno = b.deptno ORDER BY b.dname DESC; ``` 自连接查询则涉及到同一个表的不同记录之间的关联。比如,找出某个员工的直接上级: ```sql SELECT worker.ename AS 下属姓名, boss.ename AS 上级姓名 FROM emp worker, emp boss WHERE worker.mgr = boss.empno; ``` 如果要查询特定员工(如FORD)的上级,则可以在条件中添加这个特定的员工名称: ```sql SELECT worker.ename, boss.ename FROM emp worker, emp boss WHERE worker.mgr = boss.empno AND worker.ename = 'FORD'; ``` 子查询,又称为嵌套查询,是在一个SQL语句内部嵌入另一个查询,常用于单行或多行查询。单行子查询返回单个值,可以用于比较或限制条件。例如,找到所有工资高于某个特定员工工资的员工: ```sql SELECT e.ename, e.sal FROM emp e WHERE e.sal > (SELECT sal FROM emp WHERE ename = 'SOME_EMPLOYEE'); ``` 这里,子查询`(SELECT sal FROM emp WHERE ename = 'SOME_EMPLOYEE')`会先执行,返回一个值,然后主查询根据这个值筛选数据。 通过这些例子,我们可以看到Oracle数据库的查询能力非常强大,能够处理复杂的业务需求。理解并熟练掌握这些查询技术对于数据库管理员和开发人员来说至关重要。