zoukankan      html  css  js  c++  java
  • Oracle【多表查询操作(SQL92&SQL99)】

    多表联合查询:需要获取的数据分布在多张表中

    SQL92:

    1 --笛卡尔积:将多个表的数据进行一一对应,所得的结果为多表的笛卡尔积
    2 select * from emp;
    3 select * from dept;
    4 select * from emp,dept;--进行全排列 14*5=70

     1 --等值连接:先笛卡尔积,然后筛选,筛选条件为等值筛选
     2  --查询员工的姓名,工作,薪资,部门名称
     3  --可直接在select子句中使用字段获取数据,但效率低,建议字段前明确表名
     4 select ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;--效率低
     5  --两张表存在的公众字段,必须明确表名:emp.deptno=dept.deptno
     6 select emp.ename,emp.job,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;--效率高  
     7  --给表添加别名(推荐)
     8 select e.ename,e.job,e.sal,d.dname
     9 from emp e,dept d
    10 where e.deptno=d.deptno;

    1 --查询员工的姓名,工作,工资,工资等级
    2 select e.ename,e.job,e.sal,s.grade
    3 from emp e,salgrade s
    4 where e.sal>=s.losal and e.sal<=s.hisal;

    1 --自连接
    2  --查询员工的姓名,工作,薪资,及上级领导的姓名
    3 select e1.ename,e1.job,e1.sal,e2.ename
    4 from emp e1,emp e2
    5 where e1.mgr=e2.empno;
    6 ----------------下面SQL可详细查看到对应的领导姓名详情-------------------
    7 select e1.empno,e1.ename,e1.job,e1.sal,e1.mgr,e2.ename
    8 from emp e1,emp e2
    9 where e1.mgr=e2.empno;



    外连接:左外连接&&右外连接

    1 --左外链接
    2  --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
    3 select e.ename,e.job,e.sal,d.dname
    4 from emp e,dept d
    5 where e.deptno=d.deptno(+);

    1 --右外连接
    2  --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
    3 select e.ename,e.job,e.sal,d.dname
    4 from emp e,dept d
    5 where e.deptno(+)=d.deptno;

    SQL99:
    1:可给表添加别名
    2:如果使用on或者usering关键字对结果进行筛选,必须使用inner join作为表与表的连接,其中inner可缺省
    3:外连接的outer可缺省
    4:依然可以使用分组,having,排序等。

    1 --笛卡尔积:使用关键字 cross join
    2  --select * from 表名1 cross join 表名2;
    3 select * from emp cross join dept;

    1 --筛选
    2  --自然连接:使用关键字 natural join
    3  --特点1:底层先笛卡尔积,然后按照所有同名同值字段自动进行等值筛选
    4  --查询员工的姓名,工作,薪资,部门名称
    5 select e.ename,e.job,e.sal,d.dname from emp e natural join dept d;

    问题1:如果只想按照部分字段结束筛选?
    解决1:使用using关键字
    作用1:指明使用指定的字段对联合查询的结果进行等值筛选
    注意1:指明字段必须是两表的同名同值字段
    使用:select * from 表名 inner join 表名 using(字段名1,字段名2...);

    1 --查询员工的姓名,工作,薪资,部门名称
    2 select emp.ename,emp.job,emp.sal,dept.dname 
    3 from emp 
    4 inner join dept using(deptno);

    问题2:如果按照字段名不同,但是值相同进行等值筛选?
    解决2:使用on关键字进行自定义条件筛选(等值,不等值)
    注意1:普通筛选条件使用where进行筛选,不要使用on。(增加SQL语句的阅读性)
    使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件;

    1 --查询员工的姓名,工作,薪资,部门名称并工资大于等于2000
    2 select emp.ename,emp.job,emp.sal,dept.dname 
    3 from emp 
    4 inner join dept 
    5 on emp.deptno=dept.deptno where sal>=2000;



    外链接
    --左外连接:select 内容 from 表名 left outer join 表名 on 连接条件

    1 --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试) 
    2 select e.ename,e.job,e.sal,d.dname 
    3 from emp e 
    4 left outer join dept d 
    5 on e.deptno=d.deptno;


    --右外连接:select 内容 from 表名 right outer join 表名 on 连接条件

    1 --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
    2 select e.ename,e.job,e.sal,d.dname 
    3 from emp e 
    4 right outer join dept d 
    5 on e.deptno=d.deptno;
    1 --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
    2 select e.ename,e.job,e.sal,d.dname 
    3 from emp e 
    4 full outer join dept d 
    5 on e.deptno=d.deptno;
    1 --自链接:
    2   --查询员工的姓名,工作,薪资,及上级领导的姓名
    3 select e1.ename,e1.job,e1.sal,e2.ename 
    4 from emp e1 
    5 inner join emp e2 
    6 on e1.mgr=e2.empno;



    SQL92 && SQL99 详细比对:

     1 -------------------------------------------------- SQL92 && SQL99 详细比对 --------------------------------------------------
     2 --SQL92
     3  --笛卡尔积
     4 select * from emp,dept;--进行全排列 
     5 --SQL99
     6  --笛卡尔积:使用关键字 cross join
     7 select * from emp cross join dept;
     8 
     9 
    10 --SQL92
    11  --等值连接
    12  --查询员工的姓名,工作,薪资,部门名称
    13 select e.ename,e.job,e.sal,d.dname
    14 from emp e,dept d
    15 where e.deptno=d.deptno;
    16 --SQL99
    17  --自然连接:使用关键字 natural join
    18  --查询员工的姓名,工作,薪资,部门名称
    19 select e.ename,e.job,e.sal,d.dname 
    20 from emp e 
    21 natural join dept d;
    22  --查询员工的姓名,工作,薪资,部门名称
    23 select emp.ename,emp.job,emp.sal,dept.dname 
    24 from emp 
    25 inner join dept using(deptno);
    26 
    27 
    28 --SQL92
    29  --不等值连接
    30  --查询员工的姓名,工作,工资,工资等级
    31 select e.ename,e.job,e.sal,s.grade
    32 from emp e,salgrade s
    33 where e.sal>=s.losal and e.sal<=s.hisal;
    34 --SQL99
    35  --查询员工的姓名,工作,工资,工资等级
    36 select e.ename,e.job,e.sal,s.grade
    37 from emp e
    38 natural join salgrade s 
    39 where e.sal>=s.losal and e.sal<=s.hisal;
    40 
    41 
    42 --SQL92
    43  --自连接
    44  --查询员工的姓名,工作,薪资,及上级领导的姓名
    45 select e1.ename,e1.job,e1.sal,e2.ename
    46 from emp e1,emp e2
    47 where e1.mgr=e2.empno;
    48 --SQL99
    49  --查询员工的姓名,工作,薪资,及上级领导的姓名
    50 select e1.ename,e1.job,e1.sal,e2.ename 
    51 from emp e1 
    52 inner join emp e2 
    53 on e1.mgr=e2.empno;
    54 
    55 
    56 --SQL92
    57  --左外链接
    58  --查询员工的姓名,工作,薪资,部门名称及没有部门的员工信息(删除SMITH的部门编号测试)
    59 select e.ename,e.job,e.sal,d.dname
    60 from emp e,dept d
    61 where e.deptno=d.deptno(+);
    62 --SQL99
    63 select e.ename,e.job,e.sal,d.dname
    64 from emp e
    65 left outer join dept d 
    66 on e.deptno=d.deptno
    67 
    68 
    69 --SQL92
    70  --右外连接
    71  --查询员工的姓名,工作,薪资,部门名称及没有员工的部门信息
    72 select e.ename,e.job,e.sal,d.dname
    73 from emp e,dept d
    74 where e.deptno(+)=d.deptno;
    75 --SQL99
    76 select e.ename,e.job,e.sal,d.dname 
    77 from emp e 
    78 right outer join dept d 
    79 on e.deptno=d.deptno;
    80 
    81 
    82 --SQL99
    83  --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件
    84 select e.ename,e.job,e.sal,d.dname 
    85 from emp e 
    86 full outer join dept d 
    87 on e.deptno=d.deptno;
    SQL92 && SQL99 详细比对
  • 相关阅读:
    Android Handler与多线程
    在Eclipse发展Webapp部署过程,缓存的位置
    虚拟仿真引擎消息机制
    OpenGL+VS2013+WIN7(64)组态
    注解
    ios背景更新和下载
    uva 11529
    ATMEGA16 IOport相关汇总
    【剑指offer】Q32:从1至n整1出现的次数(python)
    Android NDK进入发展
  • 原文地址:https://www.cnblogs.com/cao-yin/p/9744321.html
Copyright © 2011-2022 走看看