天天看点

两表联合查询【SQL92与SQL99的对比】

---多表联合查询:
  --当需要获取的数据分布在多张中,考虑使用联合查询
    --SQL92方式
    --SQL99方式
----------------------------------------------------------------
--SQL99多表查询
    --注意1:依然可以给表添加别名
    --注意2:如果使用on或者usering关键对结果进行筛选,必须使用inner join作用表与表的连接,其中inner可以省略
    --注意3:外连接的 outer关键字可以省略不写
    --注意4:依然可以继续使用分组,having ,排序等
    --笛卡尔积:使用cross join 关键字
            ---select 内容 from 表名 cross join 
             select * from emp cross join dept
             select * from emp ,dept
    --筛选
         --查询员工姓名,工作,薪资,   
         --等值筛选的对比      
         select e.ename,e.job,e.sal,d.deptno from emp e inner join dept d on e.deptno = d.deptno
         select e.ename,e.job ,e.sal,d.deptno from emp e,dept d where e.deptno=d.deptno
         --自然连接:使用关键字 natural join
            --使用:select 内容 from 表名 natural join 表名
            --二者在自连接方面是有一些区别的
            select * from emp e1,emp d2
            select * from emp natural join dept
            select * from emp dept部门名称
            --特点1:底层先笛卡尔积,然后按照所有的同名同值字段自动进行等值筛选。
            --问题1:如果只想按照部分字段结果筛选怎么办?
            --问题2:如果想按照字段名不同,但是值相同进行等值筛选怎么办?
            select * from emp natural join dept
             --解决1:使用using关键字
                  --作用1:指明使用指定的字段对联合查询的结果进行等值筛选
                  --注意:指明的字段必须是两表的同名同值字段
                  --使用:select 内容 from 表名 inner join 表名 using(字段名,字段名,....)
                  select * from emp inner join dept using(deptno)
                  select * from emp inner join dept using(deptno)
            --解决2:使用on关键字进行自定义连接条件筛选(等值筛选,不等值筛选)
                  --注意:普通筛选条件使用where进行筛选,不要使用on进行。好处:SQL语句的阅读性变强。
                  --使用:select 内容 from 表名 inner join 表名 on 连接条件 where 普通筛选条件
                  --等值连接的对比
                  select * from emp e  inner join dept d on e.deptno = d.deptno
                  select * from emp inner join dept on emp.deptno=dept.deptno where sal>2000
                  select * from emp e ,dept d where e.deptno = d.deptno
                  select * from emp e,dept d where e.deptno=e.deptno and sal>'2000'
                  select * from emp e inner join dept d on e.deptno = d.deptno where sal>'2000'
                  --不等值连接的对比
                  select * from emp e,salgrade s where e.sal>s.losal and e.sal<s.hisal
                  select * from emp e inner join salgrade s on e.sal>s.losal and e.sal<s.hisal
        --外连接:
             --左外连接:select 内容 from 表名 left outer join 表名 on 连接条件 
                 --查询员工姓名,工作,薪资,部门名称及没有部门的员工信息
                 select e.ename,e.job,e.sal,d.deptno from emp e,dept d where e.deptno = d.deptno
                 select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e inner join dept d on e.deptno = d.deptno
                 --左外链接
                 select e.ename,e.job,e.sal,d.deptno from emp e,dept d where e.deptno = d.deptno(+)
                 select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e left outer join dept d on e.deptno = d.deptno

                 select * from emp e left outer  join dept d on e.deptno=d.deptno
             --右外连接:select 内容 from 表名 right outer join 表名 on 连接条件 
                  --查询员工姓名,工作,薪资,部门名称及没有员工的部门信息
                  select e.ename,e.job,e.sal,d.deptno,e.deptno from emp e right outer join dept d on e.deptno = d.deptno
                  select e.ename,e.job,e.sal,d.deptno,e.deptno from emp e,dept d where e.deptno(+) = d.deptno
                  select * from emp e right outer  join dept d on e.deptno=d.deptno
             --全外连接:select 内容 from 表名 full outer join 表名 on 连接条件 
                  select * from emp e full  outer join dept d on e.deptno=d.deptno
              --外连接有区别    
              select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e full outer join dept d on e.deptno = d.deptno
              select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e , dept d where e.deptno = d.deptno
       --自连接:
             --查询员工及其上级领导姓名
             --自连接
             select e1.ename,e1.empno,e2.mgr from emp e1,emp e2 where e1.empno = e2.mgr
             select e1.ename,e1.empno,e2.mgr from emp e1 inner join emp e2 on e1.empno = e2.mgr
             
             select  e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr=e2.empno