Oracle数据库入门之多表连接与子查询 电脑资料_第1页
Oracle数据库入门之多表连接与子查询 电脑资料_第2页
Oracle数据库入门之多表连接与子查询 电脑资料_第3页
Oracle数据库入门之多表连接与子查询 电脑资料_第4页
Oracle数据库入门之多表连接与子查询 电脑资料_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle数据库入门之多表连接与子查询 电脑资料 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;-这时得到的就是笛卡尔集, select empno, ename, sal, emp.deptno, dname, loc from emp, dept where emp.deptno=dept.deptno;-得到14条记录 类型:Oracle8i之前的表连接(支持SQL92标准):等值连接(Equijoin)、非等值连接(NonEquijoin)、自连接(Self join) 外连接(Outer join):左外连接、右外连接 Oracle9i新引入的连接形式(支持SQL99规范):交叉连接(Cross join)、自然连接(Natural join)、使用Using或On子句建立连接 内连接(Inner join)、外连接(Outer join):左外连接、右外连接、全外连接 补充:多表连接中可使用AND操作符增加查询条件,使用表别名可以简化查询,使用表名(表别名)前缀可提高查询效率 而连接n个表,则至少需要n-1个连接条件。如select a.ename, a.deptno, b.dname from emp a, dept b where a.deptno=b.deptno; 样本:hr帐户也是Oracle自带的样本帐户,里面有很多样本表,其数据量及复杂程度都要比scott强一些 hr帐户缺省是锁定的,可以在OEM中将其解锁并设密码。其中的employees表是scott中的emp表的增强版 另外还有departments和locations表的数据看起来都比较真实。这三个表通常用于复杂的多表连接查询 等值连接(Equijoin) 举例:select empno, ename, emp.deptno, dname from emp, dept where emp.deptno=dept.deptno; 非等值连接(NonEquijoin) 问题:如何查得每个员工的工资等级 举例:select empno, ename, sal, grade 工资等级 from emp,salgrade where sal between losal and 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;-显示所有符合条件的记录,同时table2中不符合连接条件的记录也会显示出来 table1.column1=table2.column2(+);-显示所有符合条件的记录,同时table1中不符合连接条件的记录也会显示出来 补充:在SQL99规范中,内连接(Inner Join)只返回满足连接条件的数据,而外连接还返回不满足连接条件的行 分类:左外联接(Left Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行 右外联接(Right Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行 满外联接(Full Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的行 举例:select employee_id, last_name, salary, department_id, department_name form. employees left join departments using(department_id);-返回107行 自连接(Self join) 概述:自连接诶本质就是把一个表当作两个表来使用,只是定义不同的别名而已 平时很少使用自连接,但有时确实只有采用自连接的方式才能解决某些问题 问题:如何查得每个员工及其上司的工号和姓名 举例:select a.empno, a.ename, a.mgr, b.ename from emp a, emp b where a.mgr=b.empno; SQL99连接语法 概述:SQL1999规范中规定的连接查询语法。两个以上的表进行连接时应依次分别指定相临的两个表之间的连接条件 语法:select 字段列表 from table1 cross join table2| natural join table2| join table2 using(字段名)| join table2 on(table1.column_name=table2.column_name)| (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).; 说明:如果感觉新语法比较混乱,在没有强制性要求的时候,完全可以使用旧语法,二者不存在效率上的差异 交叉连接(Cross join) 概述:Cross join产生了一个笛卡尔集,其效果等同于在两个表进行连接时未使用WHERE子句限定连接条件 举例:select empno, ename, dname from emp a cross join dept b;-交叉连接实际上没有太大的意义 自然连接(Natural join) 概述:Natural join基于两个表中的全部同名列建立连接。从两个表中选出同名列的值均对应相等的所有行 如果两个表中同名列的数据类型不同,则出错。而且不允许在参照列上使用表名或别名作为前缀 举例:select 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 empno, ename, sal, emp.deptno, dname from emp join dept on(emp.deptno=dept.deptno); 子查询(Sub Query) 概述:子查询在主查询前执行一次,主查询使用子查询的结果, 子查询分为单行子查询(返回一行结果)和多行子查询(返回多行结果)两大类 语法:select 字段列表 form. table where 表达式 operator(select 字段列表 from table); 比如select * from emp where sal(select sal from emp where empno=7654); 注意:基于值的查询应考虑使用子查询。子查询必须包含在括号内 建议将子查询放在比较运算符的右侧,以增强可读性。除非进行TopN分析,否则不要在子查询中使用ORDER BY子句 对单行子查询可以使用单行记录比较运算符。而对多行子查询则只能使用多行记录比较运算符 空值:如果子查询未返回任何行,则主查询也不会返回任何结果 比如select * from where sal(select sal from emp where empno=8888);-不会返回任何结果 多值:如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符 比如select * from emp where sal(select avg(sal) from group by deptno);-非法 TopN查询(TopN分析) 概述:即获得按照某种规则排序之后的前n条的记录。Oracle中通常采用子查询的方式实现TOPN查询 其实子查询可以认为是查到了一个临时表,或没有名字的临时视图 语法:select 字段列表 from (select 字段列表 from table order by 排序字段) where rownum=n; 举例:select * from (select * from emp order by sal desc) where rownum =5;-它执行后的结果是没有返回值 执行时先取出结果集中的,或者说是数据表中的第一条记录,并标记第一条记录的编号为1 判断后得知1小于5,不符合条件。随后便过滤掉这条记录了,接着判断下一条记录是不是符合条件 于是就又取出下一条记录,下一条记录的rownum还是从1开始。而rownum永远是从1开始的,结果可想而知 接着的下一条记录的编号还是1。即照此情形下去,记录的编号永远不会符合大于等于5的条件 也就是说在这条SQL语句的环境下,rownum永远也不会大于等于5。所以就不能指望用rownum进行区间排序 也就是说rownum=5 and rownum =10是永远也不会成立的。这就是所谓的TopN分析 例二:select * from emp where rownum=5 order by sal desc; 该句执行后并不会得到预期的结果。虽然也会得到5条记录,但并不是工资降序排列后的前5个值 它返回的是emp表中的前5行记录,只不过显示的时候是按照工资进行降序排列之后的效果 执行时会先对where条件进行过滤,过滤后得到了原表中的前5条记录。

温馨提示

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

评论

0/150

提交评论