Oracle学习系列4
************************************************************************************

数据库更新操作:

    分类:
        查询操作:select
        更新操作:insert ,update , delete

    为了保存原始的emp表的信息,在进行增删改之前备份词表:
        create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来

    添加数据:

        insert into table ( [ col1,col2,col3,. . .] )
                values( 值1,值2,值3,...) ;

        ex:
            insert into emp(enpno, ename, job, mgr, hiredate, sal, comm, deptno)
                values (,,,,) ;    

           select * from emp;//查询记录是否添加

          ex:插入新雇员,无领导,无奖金:
               insert into emp(enpno, ename, job, hiredate, sal, deptno)
                values (,,) ;    

        ex: 使用to_date()函数将字符串类型的数据变为date类型的数据

            insert into emp(enpno, ename, job, mgr, hiredate, sal, comm, deptno)
                values (,,to_date(,,) ;    

        更新数据:

                update table
                    set  字段1=值1 , 字段2=值2 ,... ;//全部修改

                update table
                    set  字段1=值1 , 字段2=值2 ,...
                        where 修改条件 ;//局部修改(重点推荐)

                ex:    update emp

                             ;

                 ex: update emp
                        set mgr=null
                             ;

                ex:将7399,,7788的领导及奖金取消:
                    update emp
                        set mgr=null, comm=null
                            ,, ) ;

        删除数据:

                delete from table   ;//全部删除

                delete from table
                    where  条件;   //局部删除

            ex: delete from emp
                    ;

                delete from emp
                    ,, ) ;
                    where comm is not null ;

************************************************************************************

数据库的事务处理:

        事务处理:保证数据的完整性,具有ACID特性

    创建一张包含10部门的临时表:
        create table emp10
            as select * from emp
                     ;

    delete from emp10
         ;

/**
    在oracle中,每个连接到数据库上的用户都表示创建了一个session,一个session队数据库所做的修改不会立刻反映到数据库的真实数据之上,当session提交所有的操作之后,数据库才真正做出修改。
            提交事务:commit
            回滚事务:rollback

    >>>>>>>>若事务已经提交了,则肯定无法回滚<<<<<<<<<<

 */

************************************************************************************

死锁:
    一个session更新了数据库中的记录,其他session事无法立刻更新的,要等待对方提交后才允许更新

     SQL语法练习:

        ,列出至少有一个员工的所有部门:
            a,列出所有部门的员工数量
              select deptno ,count(empno)
                  from emp
                    group by deptno ;
            b,列出部门人数大于1的所有部门编号
                select deptno ,count(empno)
                    from emp
                        group by deptno  having count(empno)> ;
            c , 通过部门表,查询出部门的信息即可:
                select d.*, ed.cou
                    from emp d, (

                            select deptno,count(empno) cou
                                from emp
                                    group by deptno having count(empno) >

                                ) ed
                            where d.deptno=ed.deptno ; 

        ,列出新金比Smith多的所有员工:
            a,先求出smith的工资:
                select sal from emp where ename ='SMITH';
            b,以上面的结果为条件,查询所有符合条件的雇员信息
                select * from emp
                    where sal > (

                        select sal from emp where ename ='SMITH';

                        ) ;
        ,列出所有员工的姓名及其直接上级的姓名:
            select e.ename, m.ename
                from emp e, emp m
                    where e.mgr=m.empno(+);

        ,列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称:
            a,查找mgr=empno的同时还要比较hiredate,先查询编号,姓名
                select e.empno, e.ename
                    from emp e, emp n
                        where e.mgr=m.empno and e.hiredate < m.hiredate ;

            b, 查询部门编号
                select e.empno, e.ename ,d.dname
                    from emp e, emp n, dept d
                        where e.mgr=m.empno and e.hiredate < m.hiredate
                                and e.deptno=d.deptno;

            ,列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门:
                select d.deptno, d.dname, e.empno, e.ename
                    from dept d, emp e
                        where d.deptno=e.deptno(+);

            ,列出所有办事员的姓名及其部门名称,部门人数:
                select e.ename, d.dname, ed.cou
                    from emp e, dept d, (

                                select deptno, count(empno) cou
                                    from emp
                                        group by deptno    

                                    ) ed
                        where job='CLERK' and e.deptno=d.deptno and ed.deptno=e.deptno;

            ,列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数:
                select e.job, count(e.empno)
                    from emp e
                        where e.job in(

                            select job
                                from emp
                                    group by job having min(sal)>

                                    )
                                group by e.job ;

            ,列出部门销售部工作的员工的姓名,假定不知道销售部的部门编号:
                select ename
                    from emp
                        where deptno=(

                            select deptno from dept
                                where dname='SALES'
                        ) ;

             ,列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级:
                   select e.empno, e.ename, s.grade, m.empno, m.ename, d.deptno, d.dname, d.loc
                          from emp e, dept d, emp m, salgrade s
                            where e.sal>(

                                select avg(sal) from emp 

                                    )and e.deptno=d.deptno
                                     and e.mgr=m.empno(+)
                                     and e.sal between s.losal and s.hisal ;

            ,列出与“SCOTT”从事相同工作的所有员工及部门名称:
                select e.empno, e.ename, e.job, e.sal, d.dname, d.loc
                    from emp e, dept d
                        where job =(select job from emp where ename='SCOTT')
                              and ename !='SCOTT'
                              and e.deptno=deptno ;

            ,列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金:
                select ename,sal
                    from emp
                        where sal IN(

                            select sal from emp
                                )

                                and deptno != ;

            ,列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称:
                select e.ename, e.sal, d.dname, d.loc
                    from emp e, dept d
                        where e.sal >ALL(

                                select sal from emp
                                )
                                and e.deptno!= and e.deptno = d.deptno ;

            ,列出每个部门工作的员工数量,平均工资和平均服务期限:
                    select d.dname, count(e.empno), avg(e.sal), avg(months_between(sysdate,e.hiredate)/) years
                        from emp e, dept d
                            where e.deptno=d.deptno
                                group by d.dname ;

            ,列出所有员工的姓名,部门名称和工资:
                select e.ename, d.dname , e.sal
                    from emp e,dept d
                        where e.detpno=d.deptno ;

            ,列出所有部门的详细信息和部门人数:
                  select d.* ,nvl(ed.cou ,)
                      from dept d,(

                      select deptno dno,count(empno) cou from emp group by deptno

                      ) ed
                          where d.deptno=ed.dno (+);

            ,列出各种工作的最低工资及从事此工作的雇员姓名:
                  select * from emp
                      where sal IN (

                            select min(sal) from emp group by job
                            )  ;

            ,列出各个部门的manager的最低薪金:
                    select deptno ,min(sal)
                        from emp
                            where job='MANAGER'
                                group by deptno ;

            ,列出所有员工的年工资,按年薪升序排序:
                select ename, ( sal+NVL(comm,))* income
                    from emp
                        order by income ;

            ,查出某个员工的上级主管,并要求这些主管中的年薪不超过3000:
                select distinct m.*
                    from emp e , emp m
                         ;

            ,求出部门名称中带“S“字符的部门员工的,工资合计,部门人数:
                select deptno, sum(sal), count(empno)
                    from emp
                        where deptno in(

                            select deptno from dept where dname like '%S%'

                            )
                            group by deptno ;

            ,给任职日期超过10年的人加薪10%:
                update emp
                    set sal=sal*0.1
                         > ;

            --------------------------------
            commit ;

************************************************************************************
SUMMARY

    ,多表查询,注意产生笛卡尔积
    ,分组统计,所有统计函数只能在分组语句中使用
    ,子查询:子查询可以在任意的位置上编写,多表查询,子查询,分组统计一起完成复杂查询
    ,数据库的增删改
    ,了解一下事务的处理方式,commit,rollback

Oracle学习系列4的更多相关文章

  1. Oracle学习系列1-7

    Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...

  2. Oracle学习系列7

    Oracle学习系列7 ************************************************************************************ 关联表 ...

  3. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

  4. Oracle学习系列5

    Oracle学习系列5 ************************************************************************************ ,掌握 ...

  5. Oracle学习系列3

    Oracle学习系列3 ************************************************************************************ 多表查 ...

  6. Oracle学习系列1

    两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 300 ; set pag ...

  7. oracle学习系列之四 (视图)

    视图视图是数据库中特有的对象.视图用于存储查询,但不会存储数据(物化视图除外).这是视图和数据表的重要区别.可以利用视图进行查询,插入,更新和删除数据.Oracle有如下四种视图(关系视图,内嵌视图, ...

  8. oracle学习系列之三 (约束)

    主键约束:外键约束:唯一性约束:检查约束:默认值约束 -——————五大约束 一. 主键约束: --创建表的主键约束  create table student (student_id number ...

  9. Oracle 学习系列之二(会话与事务级临时表和dual表 )

    一. 会话临时表 --创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20) ...

随机推荐

  1. HDU-4534 郑厂长系列故事——新闻净化 AC自动机+DP

    题意:给定一些单词,这些单词必须要是一个目标串的子串,同时给定一些串,这些串不能够出现在目标串中,其余一些串只会带来不同附加值.现在问满足前两者的情况下,要求附加值最大.数据给定一个原始串,现在要求在 ...

  2. [WebLoad] 使用WebLoad进行Web Application 性能测试的流程

    1. 打开WebLOAD IDE录制或编写一个脚本文件,成功后会生成一个后缀为“.wlp”的文件. 2. 打开WebLOAD Console创建一个Load Template,创建过程当中需要添加“. ...

  3. Windows 7 封装与定制不完全教程

    Windows 7 封装与定制不完全教程 从定制Win7母盘到封装详细教程 手把手教你定制WIN7小母盘 Windows 7 封装与定制不完全教程 [教程] Windows 7 封装与定制不完全教程( ...

  4. DOS批处理不支持将UNC 路径作为当前目录的巧妙解决方案

    DOS批处理不支持将UNC 路径作为当前目录的巧妙解决方案在有些时候,需要在批处理中操作UNC目录,但批处理并不能直接对UNC目录进行操作,怎么办? 废话少说,直接上代码,打开网上邻居→整个网络→Mi ...

  5. 【xsy1019】小A的树论

    题意 三种操作: ①区间增值 ②某一个点换父亲 ③求子树和 \(1\leq n\leq 100000\) 分析 Splay维护dfn序. 小结 (1)使用Splay,通常要在Splay的两端各添加一个 ...

  6. MySQL 循环执行kill语句杀掉连接

    mysql中创建索引时,一直卡住不动,刚开始以为可能是数据量太大导致的,可是一直等了很久还是一样没有反应,看来操作的表被锁住了,执行show processlist 果然发现有大量的lock,使用ki ...

  7. office openxml学习(一)

    以前用过,aspose.dll处理word ,excel,之后发现 npoi,使用了一段时间,总觉得是第三方,不明白底层的实现,直到最近发现了office openxml ,其实这个技术,很久以前就有 ...

  8. windows 下配置 Nginx 常见问题(转)

    windows 下配置 Nginx 常见问题 因为最近的项目需要用到负载均衡,不用考虑,当然用大名鼎鼎的Nginx啦.至于Nginx的介绍,这里就不多说了,直接进入主题如何在Windows下配置. 我 ...

  9. 分治法求2n个数的中位数

    问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数.试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数 思想: 对于数组X[0:n-1]和Y[0:n ...

  10. DbUtils常用API的使用 方便以后查阅

    package com.lizhou.Test; import java.sql.SQLException; import java.util.List; import java.util.Map; ...