人生三大境界
衣带渐宽终不悔,为伊消得人憔悴。
昨夜西风凋碧树,独上高楼,望尽天涯路。
众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

Oracle入门基础(五)一一多表查询

SQL> --等值连接
SQL> --查询员工信息:员工号  姓名 月薪 部门名称
SQL> set linesize 80
SQL> desc dept

名称                                      是否为空? 类型 
 DEPTNO                                   NOT NULL NUMBER(2)
 DNAME                                     VARCHAR2(14)
  LOC                                          VARCHAR2(13)

SQL> select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;

 EMPNO ENAME             SAL DNAME                                                                  
  7369 SMITH             800 RESEARCH                                       
  7499 ALLEN            1600 SALES                                          
  7521 WARD             1250 SALES                                          

SQL> --不等值连接
SQL> --查询员工信息:员工号  姓名 月薪 工资级别                                            
SQL> select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s
  3  where e.sal between s.losal  and s.hisal;

 EMPNO ENAME             SAL      GRADE                                                                
  7369 SMITH             800          1                                     
  7900 JAMES             950          1                                     


SQL> --外连接:
SQL> --按部门统计员工信息:部门号 部门名称  人数
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
  2  from emp e,dept d
  3  where e.deptno=d.deptno
  4  group by d.deptno,d.dname;

部门号 部门名称             人数                                                                    
    10 ACCOUNTING              3                                            
    20 RESEARCH                5                                            
    30 SALES                   6                                                                                                                                              

SQL> 希望把某些不成立的记录(40号部门),任然包含在最后的结果中 ---> 外连接
SQL> 左外连接: 当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含在最后的结果中
SQL>     写法:where e.deptno=d.deptno(+)
SQL> 右外连接: 当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含在最后的结果中
SQL>     写法:where e.deptno(+)=d.deptno
SQL> */
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
  2  from emp e,dept d
  3  where e.deptno(+)=d.deptno
  4  group by d.deptno,d.dname;

部门号 部门名称             人数                                                                     
    10 ACCOUNTING              3                                            
    40 OPERATIONS              0                                            
    20 RESEARCH                5                                            
    30 SALES                   6                                            

SQL> host cls
SQL> --自连接
SQL> --查询员工信息:员工姓名  老板姓名
SQL> set linesize 200
SQL> select * from emp;

EMPNO ENAME      JOB        MGR HIREDATE      SAL       COMM    DEPTNO                                                                                                                                                                                                                                                                                                                                  
  7902 FORD       ANALYST         7566 03-12月-81           3000                    20                                                                                                              
  7934 MILLER     CLERK           7782 23-1月 -82           1300                    10                                                                                                              


SQL>  --自连接: 通过表的别名,将同一张表视为多张表
SQL> select e.ename 员工姓名,b.ename 老板姓名
  2  from emp e,emp b
  3  where e.mgr=b.empno;

 员工姓名   老板姓名                                                                                                                                                                                                                                                                                                                                                                 
	FORD       JONES                                                                                                                                                                                        
	SCOTT      JONES                                                                                                                                                                                        
	JAMES      BLAKE                                                                                                                                                                                                                                                                                                                                                                  

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;

 LEVEL      EMPNO ENAME             MGR                                                                                                                                                                                                                                                                                                                 
     1       7839 KING                                                                                                                                                                              
     2       7566 JONES            7839                                                                                                                                                             
     2       7698 BLAKE            7839                                                                                                                                                                                                                                                                                                                     
     3       7654 MARTIN           7698                                                                                                                                                                                                                                                                         
     3       7844 TURNER           7698                                                                                                                                                             
     4       7876 ADAMS            7788                                                                                                                                                             
     4       7369 SMITH            7902                                                                                                                                                             
posted @ 2019-09-17 21:59  一剑霜寒十九洲  阅读(98)  评论(0编辑  收藏  举报