Advertisement

Oracle第五章笔记

阅读量:

第五章 多表连接

  • 什么是连接?
  • 通过一定的条件, 是表发生关联
复制代码
 使用一条sql语句, 查询员工姓名, 部门名称, 共工作地
       select ename, dname, loc
       from emp, dept
       where emp.deptno = dept.deptno;n
       
    2. 可以起别名, 标识关键字, 使用别名
       --注意: 为表起别名时, 不能使用as 关键字
       select ename, dname, loc
       from emp e, dept d
       where e.deptno=d.deptno;
       
    3. 笛卡尔积 在进行表连接时, 没有指定连接条件
    -- 如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,
    --其中往往包含了很多错误的数据,所以这种查询方式并不常用
    select * from emp, dept;
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

内连接

复制代码
    内连接查询操作列出与连接条件匹配的数据行,
    结果集中不包括一个表与另一个表不匹配的行。 
    
    
      
      
    
    代码解释

1. 等值连接

复制代码
查询10号部门的员工姓名, 部门名称, 工作地点
     select e.ename, d.dname, d.loc
     from emp e, dept d 
     where e.deptno = d.deptno and e.deptno = 10;
     
    1.写一个查询, 显示所有员工姓名, 部门编号, 部门名称
     select e.ename, d.deptno, d.dname 
     from emp e, dept d 
     where e.deptno = d.deptno;
    
    2.写一个查询, 显示所有工作地点在CHICAGO并且奖金不为空的员工姓名, 工作地点, 奖金
     select e.ename, d.loc, e.comm 
     from emp e, dept d 
     where e.deptno = d.deptno 
     and d.loc = 'CHICAGO' 
     and e.comm is not null;
    
    3.写一个查询, 显示所有姓名中含A字符的员工工作姓名,工作地点
     1).select e.ename, d.loc 
       from emp e, dept d 
       where e.deptno = d.deptno 
       and e.ename like '%A%';
     2).select e.ename, d.loc 
       from emp e, dept d 
       where e.deptno = d.deptno
       and instr(e.ename, 'A') > 0; 
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

2. 非等值连接

复制代码
查询所有员工的员工姓名, 工资, 和工资等级
     select  e.ename, e.sal, s.grade
     from emp e, salgrade s
     where e.sal >= s. losal and e.sal <= s.hisal;
     
    2.查询每个员工编号, 姓名, 工资, 工资等级, 所在工作城市, 按照工资等级进行升序排序
      select e.empno, e.ename, e.sal, s.grade, d.loc
      from emp e, salgrade s, dept d
      where e.sal >= s.losal and e.sal <= s.hisal  and e.deptno = d.deptno 
      order by s.grade;
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解释

自身连接 (也叫自连接)

复制代码
查询所有员工的编号, 姓名, 上级领导的编号, 上级领导的姓名
     select e.empno, e.ename,e. mgr,m.ename mgrname
     from emp e, emp m
     where e.mgr = m.empno;
      
    2.查询所有工作在new york和chicago 的员工姓名, 员工编号, 以及他们的经理姓名, 经理编号, 添加没有经理的员工King, 并按照员工编号排序。
    select e.empno, e.ename, e.mgr, m.ename
    from emp e, emp m, dept ds
    where e.mgr = m.empno(+) 
    and e.deptno = d.deptno 
    and (d.loc = 'NEW YORK' or loc = 'CHICAGO')
    order by e.empno
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

外连接(两种实现方式)

第一种(+)

复制代码
    -- 左外连接和右外连接不能同时使用
    -- 注意: 该种连接方式, 只适用oracle数据库, 不适用其他关系型数据库。
    -- 确定数据(没有通过连接条件匹配上的数据) 来源于哪张表, 那么, 这张表作为主表
    -- 在连接条件中, 在主表的对端添加(+)
    
    
      
      
      
      
    
    代码解释
复制代码
查询员工姓名, 部门名称, 部门编号 ,   没有员工的部门也要查询出来
      select  e.ename, d.dname, deptno
      from emp e, dept d
      where e.deptno (+)= d.deptno
      order by d. deptno;
      
    2.查询所有员工的姓名, 部门名称, 部门编号, 要求没有分配部门的员工也要查询
      select e.ename, d.dname, d.deptno
      from emp e, dept d
      where e.deptno = d.deptno(+);
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解释

第二种自然连接(join)

复制代码
    -- using 子句
    select * from emp e join dept d using(deptno)
    -- join on 
    1. 查询所有员工的姓名, 部门名称, 部门编号, 
    要求没有分配部门的员工也要查询(左外连接) 
    select e.ename, d.dname, d.deptno
    from emp e left join dept d on e.deptno=d.deptno
    
    2. 查询所有工作在new york和chicago 的员工姓名, 员工编号, 
    以及他们的经理姓名, 经理编号, 添加没有经理的员工King, 并按照员工编号排序。
    select e.ename,e.empno, e.mgr, m.ename
    from emp e left join emp m on e.mgr = m.empno  
    join dept d on e.deptno = d.deptno
    where d.loc = 'NEW YORK' or d.loc = 'CHIGAGO'
    order by e.empno
    
    传统语法:
    select e.ename, d.loc, e.empno,e.mgr, m.name 
    from emp e, emp m, deptno
    where m.empno(+) = e.mgr and  e.deptno = d.deptno 
    and (d.loc = 'CHICAGO' or d.loc = 'NEW YORK')
    order by e.empno;
    --两种连接语法的区别:
    --传统语法中,连接条件和过滤条件都定义在了where子句中, 这样会造成where子句混乱。
    --sql99语法,连接条件定义在了join on子句中, 更加清晰。
    
    3.查询所有员工编号, 姓名, 部门名称,包括没有部门的员工也要显示出来
    select e.ename, d.dname, d.deptno
    from emp e full join dept d on e.deptno = d.deptno
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

课后作业

复制代码
    --5.1  显示员工SMITH的姓名, 部门名称, 直接上级名称
    select e.ename, d.dname, m.ename
    from emp e join dept d on e.deptno=d.deptno join emp m on e.mgr=m.empno
    where e.ename='SMITH'
    --5.2  显示员工姓名,部门名称,工资, 工资级别, 要求工资级别大于4级
    select e.ename, d.dname, e.sal, s.grade
    from emp e join dept d on e.deptno=d.deptno 
    join salgrade s on e.sal>=s.losal and e.sal<=s.hisal
    where s.grade > 4;
    --5.3  显示员工KING 和 FORD管理的员工姓名以及其经理名称
    select e.ename empname, m.ename mgrname
       from emp e join emp m on e.mgr = m.empno
       where m.ename in ('KING', 'FORD')
       
    --5.4 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早
    select e.ename, e.hiredate,m.ename, m.hiredate
    from emp e join emp m on e.mgr = m.empno
    where e.hiredate < m.hiredate
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

全部评论 (0)

还没有任何评论哟~