• 数据库——Oracle(8)


    1 标准SQL外连接(二)
      1) 全外连接:查询所有表所有的数据
        格式:
          select 别名1.*/列名,别名2.*/列名
          from 表1 别名1 full outer join 表2 别名2
          on 关联条件
        案例:查询emp表中所有员工的编号,姓名,职位以及dept表所有部门的所有信息
          select e.empno,e.ename,e.job,d.*
          from emp e full outer join dept d
          on e.deptno = d.deptno
        案例:查询emp表中所有员工的姓名,职位,入职时间,工资以及工资等级表中所有工资的等级和该等下最低工资,最后根据入职时间进行升序排列。
          select e.ename,e.job,e.hiredate,e.sal,s.grade,s.losal
          from salgrade s full outer join emp e
          on e.sal between s.losal and s.hisal
          order e.hiredate asc
        案例:查询emp表中没有字母S的所有员工的编号,姓名,工资,入职时间以及所有部门的编号,名称,最后根据员工的编号进行升序排列。
          select e.empno,e.ename,e.sal,e.hiredate,d.deptno,d.dname
          from emp e full outer join dept d
          on e.deptno = d.deptno
          where e.ename not like '%S%'
          order by e.empno

      2) 可以使用标准SQL实现内连接,不常用,知道即可。
        格式:
          select 别名1.*/列名,别名2.*/列名
          from 表1 别名1 inner join 表2 别名2
          on 关联条件
        案例:查询emp表中员工的编号,姓名,职位,工资以及所属部门的编号,名称
          select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname
          from emp e,dept d
          where e.deptno = d.deptno
          select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname
          from emp e inner join dept d
          on e.deptno = d.deptno
        案例:查询emp表中工资在1000~3000之间员工的编号,姓名,职位,工资,入职时间以及工资的等级,最后根据员工的编号进行降序排列(2种写法)
          select e.empno,e.ename,e.job,e.sal,e.hiredate,s.grade
          from emp e inner join salgrade s
          on e.sal between s.losal and s.hisal
          where e.sal between 1000 and 3000
          order by e.empno desc
          select e.empno,e.ename,e.job,e.sal,e.hiredate,s.grade
          from emp e,salgrade s
          where e.sal between s.losal and s.hisal and e.sal between 1000 and 3000
          order by e.empno desc

    2 视图:视图是一个虚拟表,通过视图从一张或者多张表中查看数据。
      1)视图中不存储任何物理数据,只是用来查看数据的窗口。所以删除视图,对表中的数据没有任何的影响。
      2)视图中的数据都来源于基本表,是在视图被引用的时候动态生成的。使用视图可以集中,简化,定制查询数据,让用户可以通过视图来访问表中的数据,而不需要去直接查询表格。
      3)创建视图的格式:
        create view 视图名称
        as
        查询语句
        案例:创建一个视图emp_view1,查询emp表中所有的数据,查询语句作为视图emp_view1
          create view emp_view1
          as
          select * from emp
          对视图的使用,跟使用表是一样的
        案例:通过视图emp_view1查询emp表中工资大于2000的所有员工的编号,姓名,职位,工资,以及入职时间。
          select empno,ename,job,sal,hiredate from emp_view1
          where sal > 2000
        案例:通过视图emp_view1查询emp表中名字不是以及K开头所有员工的姓名,职位,工资
          select ename,job,sal from emp_view1
          where ename not like 'K%'
        案例:创建一个视图dept_view,查询dept表中所有的数据,查询语句作为视图dept_view
          create view dept_view
          as
          select * from dept
        案例:创建一个视图emp_view2,查询emp表中所有员工的编号,姓名,职位,工资,入职时间以及所在部门的编号,名称,查询语句作为视图emp_view2
          create view emp_view2
          as
          select e.empno,e.ename,e.job,e.sal,e.hiredate,d.deptno,d.dname
          from emp e left outer join dept d
          on e.deptno = d.deptno

        案例:查询emp表中所有员工的编号,姓名,职位,入职时间以及所在部门的名字,最后根据入职时间进行降序排列
          select e.empno,e.ename,e.job,e.hiredate,d.dname
          from emp e left join dept d
          on e.deptno = d.deptno
          order by e.hiredate desc
          select empno,ename,job,hiredate,dname
          from emp_view2
          order by hiredate desc
        案例:创建一个视图emp_view3,查询emp表中所有员工的编号,姓名,职位,工资,上级领导的编号和该工资的等级,该等级的最低和最高工资,查询语句作为emp_view3
          create view emp_view3
          as
          select e.empno,e.ename,e.job,e.sal,e.mgr,s.*
          from emp e left join salgrade s
          on e.sal between s.losal and s.hisal
        案例:查询emp表中名字中没有T的所有员工的编号,姓名,工资,工资的等级和该等级的最高工资,最后根据员工的编号进行降序排列(2种写法)
          select e.empno,e.ename,e.sal,s.grade,s.hisal
          from salgrade s right join emp e
          on e.sal between s.losal and s.hisal
          where e.ename not like '%T%'
          order by e.empno desc
          select empno,ename,sal,grade,hisal from emp_view3
          where ename not like '%T%'
          order by empno desc

        案例:创建视图emp_view4,查询emp表中所有员工的编号,姓名,职位,工资,入职时间以及该员工上级领导的编号,姓名,职位,工资
          create view emp_view4
          as
          select e.empno,e.ename,e.job,e.sal,e.hiredate,m.empno 领导的编号,m.ename 领导的姓名,m.job 领导的职位,m.sal 领导的工资
          from emp e left join emp m
          on e.mgr = m.empno

      4)视图中列名不能重复,遇到重复列名,使用别名进行处理。
      5)修改视图:
        create or replace view 视图名
        as
        查询语句
        案例:查询emp表中10,20号部门员工的编号,姓名,职位,工资,所属部门的编号,查询语句来修改视图emp_view1
          create or replace view emp_view1
          as
          select empno,ename,job,sal,deptno from emp
          where deptno in(10,20)
      6) 使用视图对表进行修改操作(insert , update , delete)
        a) 使用视图实现插入操作(insert):
          select * from dept
          insert into dept_view values(70,'财务部门','迪拜')
        b) 使用视图实现修改操作(update):
          update dept_view set dname = '运维部门',loc = '旧金山'
          where deptno = 70
        c) 使用视图实现删除操作(delete):
          案例:使用视图删除50,60,70号部门
            delete from dept_view where deptno in(50,60,70)

      7) 只读视图:只能通过视图进行查询操作,不能通过视图进行修改操作。
        create view 视图名
        as
        查询语句
        with read only

        create view dept_view2
        as
        select * from dept
        with read only

        --反例:
          insert into dept_view2
          values(100,'开发部门','深圳')

      8)删除视图
        格式:
          drop view 视图名
          drop view dept_view2
        案例:删除视图emp_view1,emp_view2,emp_view3,
          emp_view4
          drop view emp_view1
          drop view emp_view2
          drop view emp_view3
          drop view emp_view4

    3 外键约束:用来维护两张表或者多张表之间的关联关系,被外键约束所修饰的列,其列值参照与之关联的另外一张表中主键所修饰的列的列值。
      子表:外键所在的表,称为子表,外键所修饰的列的列值参照于主表中主键所修饰的列的列值。
      主表/父表:没有外键的表,子类中的数据参照主表中的数据。
      注意:插入数据的时候,要先往主表中插入数据,然后再往子表中插入数据。
      create table dept2(
        did number(4) primary key,
        dname varchar2(50) unique not null
      )
      create table emp2(
        eid number(4) primary key,
        ename varchar2(50),
        deptId number(4)
      )
      alter table emp2
      add constraint fk_deptId_did_emp2
      foreign key(deptId)
      references dept2(did)
      --反例
        insert into emp2 values(1,'刘备',1)

      先往主表中插入数据,然后再往子表中插入数据。
      insert into dept2 values(1,'研发')
      insert into emp2 values(1,'刘备',1)


    4 子查询(二):在一条查询语句中又包含一条查询语句。
      案例:查询JONES所在部门的名称和地址
      1) JONES所在部门的编号
        select deptno from emp
        where ename = 'JONES'
      2) 根据部门的编号查询该部门的名称和地址
        select dname,loc from dept
        where deptno = (
          select deptno from emp
          where ename = 'JONES'
        )
        案例:查询部门名称是RESEARCH的部门下员工的编号,姓名,职位,以及所在部门的编号
          1)RESEARCH部门的编号
            select deptno from dept
            where dname = 'RESEARCH'
          2)根据部门编号查询该部门下员工的信息
            select empno,ename,job,deptno
            from emp
            where deptno = (
              select deptno from dept
              where dname = 'RESEARCH'
            )
        案例:查询职业是MANAGER的员工所在部门的编号,名称和地址
          1)查询职业是MANAGER的员工所在部门的编号
            select deptno from emp
            where job = 'MANAGER'
          2)根据部门的编号查询该部门的信息
            select * from dept
            where deptno in (
              select deptno from emp
              where job = 'MANAGER'
            )
        案例:查询工资在1000~2000之间的员工所在部门的编号,名称
          1)查询工资在1000~2000之间的员工的所在部门的编号
            select deptno from emp
            where sal between 1000 and 2000
          2)根据部门的编号查询该部门的编号,名称
            select deptno,dname from dept
            where deptno in(
              select deptno from emp
              where sal between 1000 and 2000
            )

  • 相关阅读:
    jquery blockUI插件实现遮罩层
    ckeditor粘入word内容如何默认设置为保留样式
    抓紧时间把c学习一下
    4G时代的解释
    。。。。
    几个常用的VS快捷键
    清除html标记并截取前50个字符
    SQL Server 2005 sp2安装后导入数据出错的处理方法
    自己做的一道机试题
    敏捷合同摘自网络
  • 原文地址:https://www.cnblogs.com/KalosOwen/p/8570594.html
Copyright © 2020-2023  润新知