Oracle数据库入门之多表连接与子查询

上传人:泽*** 文档编号:76297029 上传时间:2022-04-18 格式:DOC 页数:9 大小:255.50KB
收藏 版权申诉 举报 下载
Oracle数据库入门之多表连接与子查询_第1页
第1页 / 共9页
Oracle数据库入门之多表连接与子查询_第2页
第2页 / 共9页
Oracle数据库入门之多表连接与子查询_第3页
第3页 / 共9页
资源描述:

《Oracle数据库入门之多表连接与子查询》由会员分享,可在线阅读,更多相关《Oracle数据库入门之多表连接与子查询(9页珍藏版)》请在装配图网上搜索。

1、Oracle 表连接概述: SQL/Oracle 使用表连接从多个表中查询数据格式: select 字段列表 from table1,table2 where table1.column1=table2.column2;说明:当被连接的多个表中存在同名字段时,必须在该字段前加上“ table.”作为前缀如果没有限定 where 连接条件, 否则就会出现笛卡尔集的不现实或没有实用意义的结果举例: select empno, ename, sal, emp.deptno, dname, loc from emp, dept;- 这时得到的就是笛卡尔集。此时得到 70 条记录select empno

2、, ename, sal, emp.deptno, dname, loc from emp, dept whereemp.deptno=dept.deptno;- 得到 14 条记录类型:Oracle8i 之前的表连接 (支持 SQL92 标准):等值连接 (Equijoin) 、非等值连接 (NonEquijoin) 、自连接 (Self join)外连接 (Outer join) :左外连接、右外连接Oracle9i 新引入的连接形式 (支持 SQL99 规范):交叉连接 (Cross join) 、自然连接 (Naturaljoin) 、使用 Using 或 On 子句建立连接内连接 (

3、Inner join) 、外连接 (Outer join) :左外连接、右外连接、全外连接补充:多表连接中可使用 AND 操作符增加查询条件,使用表别名可以简化查询,使用表名(表别名 )前缀可提高查询效率而连接 n 个表,则至少需要 n-1 个连接条件。 如 select a.ename, a.deptno, b.dname from empa, dept b where a.deptno=b.deptno;样本: hr 帐户也是 Oracle 自带的样本帐户,里面有很多样本表,其数据量及复杂程度都要比 scott 强一些hr 帐户缺省是锁定的,可以在 OEM 中将其解锁并设密码。其中的 em

4、ployees 表是 scott中的 emp 表的增强版另外还有 departments 和 locations 表的数据看起来都比较真实。这三个表通常用于复杂的多表连接查询等值连接 (Equijoin)举 例 : select empno, ename, emp.deptno, dname from emp, dept whereemp.deptno=dept.deptno;非等值连接 (NonEquijoin)问题:如何查得每个员工的工资等级举例:select empno, ename, sal, grade 工资等级 from emp,salgrade where sal between

5、 losaland hisal;外连接 (Outer join)概述:外连接运算符为 (+) 。使用外连接可以看到参与连接的某一方不满足连接条件的记录传统的外连接分为左外连接和右外连接两种。 实际开发中, 外连接的使用频率要比等值连接少一些语法: select 字段列表 from table1,table2 where table1.column1(+)=table2.column2;select 字段列表 from table1,table2 where table1.column1=table2.column2(+);说明: table1.column1(+)=table2.column2

6、;- 显示所有符合条件的记录,同时 table2 中不符合连接条件的记录也会显示出来table1.column1=table2.column2(+);- 显示所有符合条件的记录,同时 table1 中不符合连接条件的记录也会显示出来补充:在 SQL99 规范中,内连接 (Inner Join)只返回满足连接条件的数据,而外连接还返回不满足连接条件的行分类:左外联接 (Left Outer Join) :即两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行右外联接 (Right Outer Join) :即两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件

7、的行满外联接 (Full Outer Join) :即两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的行举例: select employee_id, last_name, salary, department_id, department_nameform employees left join departments using(department_id);- 返回 107 行自连接 (Self join)概述:自连接诶本质就是把一个表当作两个表来使用,只是定义不同的别名而已平时很少使用自连接,但有时确实只有采用自连接的方式才能解决某些问题问题:如何查得每个员工及

8、其上司的工号和姓名举例: select a.empno, a.ename, a.mgr, b.ename from emp a, emp b where a.mgr=b.empno;SQL99 连接语法概述: SQL1999 规范中规定的连接查询语法。两个以上的表进行连接时应依次分别指定相临的两个表之间的连接条件语法: select 字段列表from table1cross join table2|natural join table2|join table2 using( 字段名 )|join table2 on(table1.column_name=table2.column_name)|

9、(left|right|full outer)join table2 on(table1.column_name=table2.column_name);cross join table3|natural join table3|join table3 using( 字段名 )|join table3 on(table2.column_name=table3.column_name)|(left|right|full outer)join table3 on(table2.column_name=table3.column_name).;说明: 如果感觉新语法比较混乱,在没有强制性要求的时候,

10、 完全可以使用旧语法,二者不存在效率上的差异交叉连接 (Cross join)概述: Cross join 产生了一个笛卡尔集,其效果等同于在两个表进行连接时未使用WHERE 子句限定连接条件举例: select empno, ename, dname from emp a cross join dept b;- 交叉连接实际上没有太大的意义自然连接 (Natural join)概述: Natural join 基于两个表中的全部同名列建立连接。从两个表中选出同名列的值均对应相等的所有行如果两个表中同名列的数据类型不同, 则出错。 而且不允许在参照列上使用表名或别名作为前缀举例: select

11、 demno, ename, sal, deptno, dname from emp natural jon dept;Using 子句概述:如果不希望参照被连接表的所有同名列进行等值连接, 自然连接将无法满足要求可以在连接时使用 USING 子句来设置用于等值连接的列 (参照列 )名同样不允许在参照列上使用表名或别名作为前缀举例: select empno, ename, sal, deptno, dname form emp join dept using(deptno);On 子句概述:如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用 ON子句举 例 : select

12、empno, ename, sal, emp.deptno, dname from emp join depton(emp.deptno=dept.deptno);子查询 (Sub Query)概述: 子查询在主查询前执行一次, 主查询使用子查询的结果。 比如查询所有比张三工资高的员工信息子查询分为单行子查询 (返回一行结果 )和多行子查询 (返回多行结果 )两大类语法: select 字段列表 form table where 表达式 operator(select 字段列表 from table);比如 select * from emp where sal>(select sal

13、from emp where empno=7654);注意:基于未知值的查询应考虑使用子查询。子查询必须包含在括号内建议将子查询放在比较运算符的右侧,以增强可读性。除非进行 TopN 分析,否则不要在子查询中使用 ORDER BY 子句对单行子查询可以使用单行记录比较运算符。 而对多行子查询则只能使用多行记录比较运算符空值:如果子查询未返回任何行,则主查询也不会返回任何结果比如 select * from where sal>(select sal from emp where empno=8888);- 不会返回任何结果多值: 如果子查询返回多行结果, 则为多行子查询, 此时不允许对其

14、使用单行记录比较运算符比如 select * from emp where sal>(select avg(sal) from group by deptno);- 非法TopN 查询(TopN 分析)概述:即获得按照某种规则排序之后的前 n 条的记录。 Oracle 中通常采用子查询的方式实现 TOPN 查询其实子查询可以认为是查到了一个临时表,或没有名字的临时视图语法: select 字段列表 from (select 字段列表 from table order by 排序字段 ) whererownum<=n;举例: select * from (select * from

15、emp order by sal desc) where rownum <=5;伪列 rownum概述: SELECT 查询结果中会隐含的增加一个字段 rownum ,即伪列。 rownum 用起来很灵活,但也很容易出错rownum 伪列并不是数据表中或者子查询的虚拟表中真实存在的列,它只是查询结果中的一个伪列它标记的是符合查询条件的结果的编号,第一条记录的 rownum 值为 1,第二条记录的rownum 值为 2可以理解为,符合查询条件的第一行记录编号为 1,符合查询条件的第二行记录编号为2例一: select * from emp where rownum>=5;- 它执行后

16、的结果是没有返回值执行时先取出结果集中的, 或者说是数据表中的第一条记录, 并标记第一条记录的编号为 1判断后得知 1 小于 5,不符合条件。随后便过滤掉这条记录了,接着判断下一条记录是不是符合条件于是就又取出下一条记录,下一条记录的 rownum 还是从 1 开始。而 rownum 永远是从1 开始的,结果可想而知接着的下一条记录的编号还是 1。即照此情形下去,记录的编号永远不会符合大于等于5 的条件也就是说在这条 SQL 语句的环境下, rownum 永远也不会大于等于 5。所以就不能指望用 rownum 进行区间排序也就是说 rownum>=5 and rownum <=10

17、 是永远也不会成立的。 这就是所谓的 TopN分析例二: select * from emp where rownum<=5 order by sal desc;该句执行后并不会得到预期的结果。 虽然也会得到 5 条记录, 但并不是工资降序排列后的前 5 个值它返回的是 emp 表中的前 5 行记录,只不过显示的时候是按照工资进行降序排列之后的效果执行时会先对 where 条件进行过滤, 过滤后得到了原表中的前 5 条记录。 然后再对表的前 5 条记录排序并输出很显然这并不是我们想要得到的。 我们希望的是先排序, 排好了顺序之后再获取前面的5 行信息但若写成 select * from

18、emp order by sal desc where rownum<=5; 的话,是不符合 select语法的,会出错所以只能通过子查询的方式在一条语句中结合 rownum 伪列来实现 TopN 查询分页:在 JavaWeb 编程中,经常会遇到分页显示的问题。有时需要在某一页显示一个区间的记录比如显示第 21 条到第 30 条记录。在这种情况下,单纯的 TopN 查询显然不能满足要求这时可以让子查询中的伪列变成一个真实存在的列, 或者说让它变成能够进行比较运算的真实的列述一: select rownum, a.* from (select * from emp order by sal

19、 desc) a;这里如果将 a.*写成* 的话, 就会出现缺失表达式的错误。 而子查询不是真实的表, 所以只能靠它的别名它的运行结果是显示原 emp 中的所有记录,而且还多出了一列 ROWNUM 的记录,列值是从 1 到 14 的连续数字此时的 rownum 还是虚的, 仍然不能执行 where rownum>=5 and rownum<=10 的区间排序因为 rownum 实际上是等于本次查询 14 行记录中的每一行记录的伪列号从第一行开始永远等于 1,如果不符合大于等于 5 的条件的话,第一行记录就会被过滤掉了而下一行记录的伪列号还是从 1 开始的, 便又会出现 “例一” 中

20、的结果, 所以此时仍不能进行区间排序述二:这时可以给 rownum 起一个别名,如 myno。然后再把刚才的整条语句作为一个子查询即 select * from (select rownum myno, a.* from (select * from emp order by sal desc) a);整个括号括起来的又充当了一个子查询。这个子查询会得到 n+1 条记录,其中第一条记录是 myno 字段这时的 myno 就是一个实际存在的结果了。如果把子查询当作一个真实的表, 这个表中应该有 n+1 个字段都是真实存在的字段,一个字段叫 myno,其它的是原来 emp 中的所有字段然后在语句中

21、将查询条件 where myno>=5 and myno<=10 写在该语句的后面。 整句就如“模板”中句子这时再执行整条语句,得到的就是预期中的结果,即 emp 中工资排名在第 5 到第 10 名之间的员工信息模板: select * from (select rownum myno, a.* from (select * from emp order by sal desc) a)where myno>=5 and myno<=10;这就是在 Oracle 中利用 TopN 查询实现分页显示效果的 SQL 语句,也可以把当前的语法格式当作一个模板来记住子查询可以当作是一个表,假想这个表是物理存在的,里面有 n+1 个真实存在的字段,其中一个字段叫 myno如果这时把条件改成 where rownum>=5 and rownum<=10 ,那么执行结果是:未选定行或没有选定任何内容因为这个 rownum 指的根本不是子查询中的返回的结果 rownum ,而是这一次主查询中又得到的一个伪列更多信息请查看 IT 技术专栏

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!