Oracle多表查询

笛卡儿积 就行两表相乘

oracle 表连接分为 等值连接 不等值连接  外连接 自连接

SQL> --等值连接
SQL> --查询员工信息: 员工号 姓名 月薪  部门名称
SQL> select empno,ename,sal,dname
  2  from emp,dept
  3  where emp.deptno=dept.deptno;
SQL> ed
已写入 file afiedt.buf

  1  select empno,ename,sal,dname
  2  from emp e,dept d
  3* where e.deptno=d.deptno
SQL> /
SQL> --不等值连接
SQL> --查询员工信息: 姓名 月薪  工资级别
SQL> select ename,sal,grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;
SQL> --外连接
SQL> --按部门统计员工人数: 部门号  部门名称  人数
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno
  4  group by d.deptno,d.dname;
SQL>--以上结果部队 
SQL> /*
SQL> 外连接解决的问题:当条件不成立时,任然希望在结果中包含不成立的记录
SQL> 左外连接: where d.deptno=e.deptno 当不成立时,等号左边代表的表的信息任然被包含
SQL>          写法: where d.deptno=e.deptno(+)
SQL> 右外连接: where d.deptno=e.deptno 当不成立时,等号右边代表的表的信息任然被包含
SQL>          写法:where d.deptno(+)=e.deptno
SQL> */
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname;

    DEPTNO DNAME          COUNT(E.EMPNO)                                                                                                              
---------- -------------- --------------                                                                                                              
        10 ACCOUNTING                  3                                                                                                              
        40 OPERATIONS                  0                                                                                                              
        20 RESEARCH                    5                                                                                                              
        30 SALES                       6                                                                                                              

SQL>		   select d.deptno,d.dname,count(e.empno) 
       2   from dept d left join emp e  ON d.deptno=e.deptno
       3   group by d.deptno,d.dname;
SQL> ed
已写入 file afiedt.buf

  1  select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname
  5* order by 1
SQL> /

    DEPTNO DNAME          COUNT(E.EMPNO)                                                                                                              
---------- -------------- --------------                                                                                                              
        10 ACCOUNTING                  3                                                                                                              
        20 RESEARCH                    5                                                                                                              
        30 SALES                       6                                                                                                              
        40 OPERATIONS                  0                                                                                                              

SQL> --自连接
SQL> --查询员工信息:***的老板是***
SQL> select e.ename||'的老板是'||b.ename
  2  from emp e,emp b
  3  where e.mgr=b.empno;
SQL> --自连接:利用表的别名,将同一张表视为多张表
SQL> --层次查询
SQL> --自连接不太适合操作大表


层次查询

SQL> --层次查询:  对同一张表的前后两次操作,进行连接
SQL> select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null
  5  order by 1;

适用场景类似于树  一对多  比如 中国-》省份》城市

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值