设为首页 收藏本站
查看: 524|回复: 0

[经验分享] oracle基础知识4_多表查询

[复制链接]

尚未签到

发表于 2016-8-12 07:04:17 | 显示全部楼层 |阅读模式
  

   || 符号解释: 字符串连接,相当于 mssql中的 +
  
  笛卡尔集:
  
  联合两个表 emp, dept 查询数据,那么查询的结果:
  1 列是两个表的列数相加
  2 行数是这两个表的行数乘积
  3 查询结果会在两个表形成笛卡尔集结果后在按照条件筛选得到。
  
  
DSC0000.jpg
 
  
  笛卡尔集产生条件:
  
  1 查询时省略连接条件
  2 连接条件无效
  3 所有表中的所有行相互连接
  
  为了提高查询效率,应该让where条件的连接条件更有效
  学多表下查询就是学连接条件如何写。
  
  连接条件分类:
  1 等值连接
  查询员工信息: 员工号 姓名 月薪 部门名称
  select e.empno,e.ename,e.sal,d.dname
    from emp e,dept d
    where e.deptno=d.deptno;
  
  2 不等值连接
  select e.empno,e.ename,e.sal,s.grade
    from emp e,salgrade s
    where e.sal between s.losal and s.hisal;
  
  3 外连接(在结果集中,包含某些不成立的记录)
  看如下写法:
  
  按部门统计员工人数
  select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
   from emp e,dept d
   where e.deptno=d.deptno
   group by d.deptno,d.dname
  


部门号
部门名称
人数


10
ACCOUNTING
3


20
RESEARCH
5


30
SALES
6
  
  结果: 部门号40无法显示出来,虽然这部门下没人,但是按照题目要求,显示所有部门人数,应该显示40号部门为0人。
  未显示原因:因为用条件 e.deptno=d.deptno,表emp中没有deptno=40的记录,因此查询结果必然没有40这项。
  
  
  
  
  左外连接: 当where e.deptno=d.deptno不成立的时候,等号左边所代表的表记录 任然被包含
  tablea left join tableb on 条件
  右外连接: 当where e.deptno=d.deptno不成立的时候,等号右边所代表的表记录 任然被包含
  tablea rigth join tableb on 条件
  
  使用右外连接,达到需要的效果,语句如下:
  select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
   from emp e right join dept d
   on e.deptno=d.deptno
   group by d.deptno,d.dname
   order by d.deptno ;
  查询结果如下:


部门号
部门名称
人数


10
ACCOUNTING
4


20
RESEARCH
5


30
SALES
6


40
OPERATIONS
0
  
  
  
  4 自连接(通过表的别名,将同一张表视为多张表====>就是自己跟自己连接查询,工作中常涉及到 部门表, 帖子表 设计成自连接查询)
  
  select e.ename||'的领导是'||b.ename
   from emp e,emp b
   where e.mgr=b.empno;
  

FORD的领导是JONES
SCOTT的领导是JONES
JAMES的领导是BLAKE
TURNER的领导是BLAKE
MARTIN的领导是BLAKE
  
  
  自连接操作不太适合操作太大的表,否则查询的时候产生的笛卡尔集会随着表记录增长而成平方级别的增长
  
  
  5 层次查询(遍历的是一棵树,利用递归)
  
  分析上面案例,得到领导和下属关系的树结构图如下:
  
DSC0001.jpg
 
  前一次操作的员工号是后一次操作的领导号
  select level,empno,ename,sal,mgr
    from emp
    connect by prior empno=mgr
    start with mgr is null
    order by level;  --->  可以修改成 order by 1;   1表示查询条件的第一个字段,即level
  
  
  执行的过程:
 1. KING: start with mgr is null ---> empno=7839
 2. where mgr = 7839; ---> 7566 7698 7782
 3. where mgr in (7566 7698 7782)
  
  结果:


LEVEL
EMPNO
ENAME
SAL
MGR


1
7839
KING
5000
 


2
7566
JONES
2975
7839


2
7698
BLAKE
2850
7839


2
7782
CLARK
2450
7839


3
7902
FORD
3000
7566


3
7521
WARD
1250
7698


3
7900
JAMES
950
7698


3
7934
MILLER
1300
7782
  
  
  多表连接查询案例;
  查询员工工资大于本部门平均工资的员工信息:(涉及的知识1 子查询 2 多表查询 3 函数 4 分组)
  
  select e.empno,e.deptno,e.ename,e.sal,d.avgsal
 from emp e,(select deptno,avg(sal)avgsal from emp group by deptno) d
  where  e.deptno= d.deptno and e.sal > d.avgsal;
  


EMPNO
DEPTNO
ENAME
SAL
AVGSAL


7698
30
BLAKE
2850
1566.66667


7499
30
ALLEN
1600
1566.66667


7902
20
FORD
3000
2175


7788
20
SCOTT
3000
2175


7566
20
JONES
2975
2175


7839
10
KING
5000
3687.5


1001
10
Tom_ABCD
6000
3687.5
  
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256599-1-1.html 上篇帖子: oracle基础知识3_组函数 下篇帖子: ORACLE数据库集合类型示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表