Oracle入门基础(五)一一多表查询
阅读原文时间:2023年07月08日阅读:1
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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器