Oracle Database 11g Express Edition学习笔记

系统 2113 0

修改字符集

使用用户system,通过sqlplus程序连接到Oracle数据库,输入以下命令,查看字符集:

      SQL
      
        >
      
      
        select userenv('language') from
      
      
        
           dual;
        
        
          USERENV(
        
      
      
        'LANGUAGE')


      
      
        --
      
      
        --------------------------------------------------
      
      
        
          AMERICAN_AMERICA.AL32UTF8
        
        



SQL
      
      
        >
      
    

我们可以看到查到的字符集为“ AMERICAN_AMERICA.AL32UTF8 ”,而国内数据库常用的字符集为“ ZHS16GBK ”。

例如:某字段在企业版中定义的为varchar2(4), 保存数据为''田田'',则导入oraclexe时,该字段定义仍为varchar2(4),但数据''田田''就需要占用6个字符长度,出现的问题如下所示:

IMP-00019: 由于 ORACLE 错误 12899 而拒绝行
IMP-00003: 遇到 ORACLE 错误 12899
ORA-12899: 列 "TEST"."TEST_TIANYC"."A" 的值太大 (实际值: 6, 最大值: 4)

此时就需要按照以下操作说明进行操作后即可解决问题。

操作说明:

开始菜单-->所有程序-->Oracle Database 11g Express Edition-->运行SQL命令行,启动sqlplus程序。

由于sqlplus程序不支持直接在程序窗口中右键,进行复制、粘贴等操作,所以博主采用的是在运行命令行中启动sqlplus程序。

开始菜单-->运行-->输入cmd,并回车-->打开cmd命令行。

      
        Microsoft Windows [版本 6.1.7601]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。



C:\Users\Candy>
        
          C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe /nolog
        
        



SQL*Plus: Release 11.2.0.2.0 Production on 星期三 11月 26 12:11:59 2014



Copyright (c) 1982, 2010, Oracle.  All rights reserved.



SQL> 
        
          connect system as sysdba
        
        

输入口令:

已连接。

SQL> 
        
          shutdown immediate
        
        

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> 
        
          startup mount
        
        

ORACLE 例程已经启动。



Total System Global Area  644468736 bytes

Fixed Size                  1385488 bytes

Variable Size             192941040 bytes

Database Buffers          444596224 bytes

Redo Buffers                5545984 bytes

数据库装载完毕。

SQL> 
        
          alter system enable restricted session;
        
        



系统已更改。



SQL> 
        
          alter system set JOB_QUEUE_PROCESSES=0;
        
        



系统已更改。



SQL> 
        
          alter system set AQ_TM_PROCESSES=0;
        
        



系统已更改。



SQL> 
        
          alter database open;
        
        



数据库已更改。



SQL> 
        
          alter database character set internal_use ZHS16GBK;
        
        



数据库已更改。



SQL> 
        
          shutdown immediate
        
        

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> 
        
          startup
        
        

ORACLE 例程已经启动。



Total System Global Area  644468736 bytes

Fixed Size                  1385488 bytes

Variable Size             192941040 bytes

Database Buffers          444596224 bytes

Redo Buffers                5545984 bytes

数据库装载完毕。

数据库已经打开。

SQL> 
        
          select userenv('language') from dual;
        
        



USERENV('LANGUAGE')

----------------------------------------------------


        
          SIMPLIFIED CHINESE_CHINA.ZHS16GBK
        
        



SQL>
      
    

此时,再进行数据导入或者在字段类型为varchar2(4)的字段插入“田田”,就不会报错了。

修改字符集后可能导致navicat连不上Oracle数据库,请在菜单-->工具-->选项-->其他-->OCI中将OCI library(oci.dll)的值修改为

C:\oraclexe\app\oracle\product\11.2.0\server\bin\oci.dll,点击确定后,重启navicat即可。

Oracle自带的Scott用户下的Demo库的SQL  

      
        DROP
      
      
        TABLE
      
      
         EMP;




      
      
        DROP
      
      
        TABLE
      
      
         DEPT;




      
      
        DROP
      
      
        TABLE
      
      
         BONUS;




      
      
        DROP
      
      
        TABLE
      
      
         SALGRADE;




      
      
        CREATE
      
      
        TABLE
      
      
         DEPT (

    DEPTNO 
      
      
        NUMBER
      
       (
      
        2
      
      ) 
      
        CONSTRAINT
      
       PK_DEPT 
      
        PRIMARY
      
      
        KEY
      
      
        ,

    DNAME 
      
      
        VARCHAR2
      
       (
      
        14
      
      
        ),

    LOC 
      
      
        VARCHAR2
      
       (
      
        13
      
      
        )

);




      
      
        CREATE
      
      
        TABLE
      
      
         EMP (

    EMPNO 
      
      
        NUMBER
      
       (
      
        4
      
      ) 
      
        CONSTRAINT
      
       PK_EMP 
      
        PRIMARY
      
      
        KEY
      
      
        ,

    ENAME 
      
      
        VARCHAR2
      
       (
      
        10
      
      
        ),

    JOB 
      
      
        VARCHAR2
      
       (
      
        9
      
      
        ),

    MGR 
      
      
        NUMBER
      
       (
      
        4
      
      
        ),

    HIREDATE DATE,

    SAL 
      
      
        NUMBER
      
       (
      
        7
      
      , 
      
        2
      
      
        ),

    COMM 
      
      
        NUMBER
      
       (
      
        7
      
      , 
      
        2
      
      
        ),

    DEPTNO 
      
      
        NUMBER
      
       (
      
        2
      
      ) 
      
        CONSTRAINT
      
       FK_DEPTNO 
      
        REFERENCES
      
      
         DEPT

);




      
      
        INSERT
      
      
        INTO
      
       DEPT 
      
        VALUES
      
       (
      
        10
      
      , 
      
        '
      
      
        ACCOUNTING
      
      
        '
      
      , 
      
        '
      
      
        NEW YORK
      
      
        '
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       DEPT 
      
        VALUES
      
       (
      
        20
      
      , 
      
        '
      
      
        RESEARCH
      
      
        '
      
      , 
      
        '
      
      
        DALLAS
      
      
        '
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       DEPT 
      
        VALUES
      
       (
      
        30
      
      , 
      
        '
      
      
        SALES
      
      
        '
      
      , 
      
        '
      
      
        CHICAGO
      
      
        '
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       DEPT 
      
        VALUES
      
       (
      
        40
      
      , 
      
        '
      
      
        OPERATIONS
      
      
        '
      
      , 
      
        '
      
      
        BOSTON
      
      
        '
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7369
      
      , 
      
        '
      
      
        SMITH
      
      
        '
      
      , 
      
        '
      
      
        CLERK
      
      
        '
      
      , 
      
        7902
      
      , TO_DATE (
      
        '
      
      
        17-12-1980
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        800
      
      , 
      
        NULL
      
      , 
      
        20
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7499
      
      , 
      
        '
      
      
        ALLEN
      
      
        '
      
      , 
      
        '
      
      
        SALESMAN
      
      
        '
      
      , 
      
        7698
      
      , TO_DATE (
      
        '
      
      
        20-2-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        1600
      
      , 
      
        300
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7521
      
      , 
      
        '
      
      
        WARD
      
      
        '
      
      , 
      
        '
      
      
        SALESMAN
      
      
        '
      
      , 
      
        7698
      
      , TO_DATE (
      
        '
      
      
        22-2-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        1250
      
      , 
      
        500
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7566
      
      , 
      
        '
      
      
        JONES
      
      
        '
      
      , 
      
        '
      
      
        MANAGER
      
      
        '
      
      , 
      
        7839
      
      , TO_DATE (
      
        '
      
      
        2-4-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        2975
      
      , 
      
        NULL
      
      , 
      
        20
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7654
      
      , 
      
        '
      
      
        MARTIN
      
      
        '
      
      , 
      
        '
      
      
        SALESMAN
      
      
        '
      
      , 
      
        7698
      
      , TO_DATE (
      
        '
      
      
        28-9-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        1250
      
      , 
      
        1400
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7698
      
      , 
      
        '
      
      
        BLAKE
      
      
        '
      
      , 
      
        '
      
      
        MANAGER
      
      
        '
      
      , 
      
        7839
      
      , TO_DATE (
      
        '
      
      
        1-5-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        2850
      
      , 
      
        NULL
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7782
      
      , 
      
        '
      
      
        CLARK
      
      
        '
      
      , 
      
        '
      
      
        MANAGER
      
      
        '
      
      , 
      
        7839
      
      , TO_DATE (
      
        '
      
      
        9-6-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        2450
      
      , 
      
        NULL
      
      , 
      
        10
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7788
      
      , 
      
        '
      
      
        SCOTT
      
      
        '
      
      , 
      
        '
      
      
        ANALYST
      
      
        '
      
      , 
      
        7566
      
      , TO_DATE (
      
        '
      
      
        13-07-87
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-rr
      
      
        '
      
      ) 
      
        -
      
      
        85
      
      , 
      
        3000
      
      , 
      
        NULL
      
      , 
      
        20
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7839
      
      , 
      
        '
      
      
        KING
      
      
        '
      
      , 
      
        '
      
      
        PRESIDENT
      
      
        '
      
      , 
      
        NULL
      
      , TO_DATE (
      
        '
      
      
        17-11-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        5000
      
      , 
      
        NULL
      
      , 
      
        10
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7844
      
      , 
      
        '
      
      
        TURNER
      
      
        '
      
      , 
      
        '
      
      
        SALESMAN
      
      
        '
      
      , 
      
        7698
      
      , TO_DATE (
      
        '
      
      
        8-9-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        1500
      
      , 
      
        0
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7876
      
      , 
      
        '
      
      
        ADAMS
      
      
        '
      
      , 
      
        '
      
      
        CLERK
      
      
        '
      
      , 
      
        7788
      
      , TO_DATE (
      
        '
      
      
        13-07-87
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-rr
      
      
        '
      
      ) 
      
        -
      
      
        51
      
      , 
      
        1100
      
      , 
      
        NULL
      
      , 
      
        20
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7900
      
      , 
      
        '
      
      
        JAMES
      
      
        '
      
      , 
      
        '
      
      
        CLERK
      
      
        '
      
      , 
      
        7698
      
      , TO_DATE (
      
        '
      
      
        3-12-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        950
      
      , 
      
        NULL
      
      , 
      
        30
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7902
      
      , 
      
        '
      
      
        FORD
      
      
        '
      
      , 
      
        '
      
      
        ANALYST
      
      
        '
      
      , 
      
        7566
      
      , TO_DATE (
      
        '
      
      
        3-12-1981
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        3000
      
      , 
      
        NULL
      
      , 
      
        20
      
      
         );




      
      
        INSERT
      
      
        INTO
      
       EMP 
      
        VALUES
      
       ( 
      
        7934
      
      , 
      
        '
      
      
        MILLER
      
      
        '
      
      , 
      
        '
      
      
        CLERK
      
      
        '
      
      , 
      
        7782
      
      , TO_DATE (
      
        '
      
      
        23-1-1982
      
      
        '
      
      , 
      
        '
      
      
        dd-mm-yyyy
      
      
        '
      
      ), 
      
        1300
      
      , 
      
        NULL
      
      , 
      
        10
      
      
         );




      
      
        CREATE
      
      
        TABLE
      
      
         BONUS (

    ENAME 
      
      
        VARCHAR2
      
       (
      
        10
      
      
        ),

    JOB 
      
      
        VARCHAR2
      
       (
      
        9
      
      
        ),

    SAL 
      
      
        NUMBER
      
      
        ,

    COMM 
      
      
        NUMBER
      
      
        

);




      
      
        CREATE
      
      
        TABLE
      
      
         SALGRADE (

    GRADE 
      
      
        NUMBER
      
      
        ,

    LOSAL 
      
      
        NUMBER
      
      
        ,

    HISAL 
      
      
        NUMBER
      
      
        

);




      
      
        INSERT
      
      
        INTO
      
       SALGRADE 
      
        VALUES
      
       (
      
        1
      
      , 
      
        700
      
      , 
      
        1200
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       SALGRADE 
      
        VALUES
      
       (
      
        2
      
      , 
      
        1201
      
      , 
      
        1400
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       SALGRADE 
      
        VALUES
      
       (
      
        3
      
      , 
      
        1401
      
      , 
      
        2000
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       SALGRADE 
      
        VALUES
      
       (
      
        4
      
      , 
      
        2001
      
      , 
      
        3000
      
      
        );




      
      
        INSERT
      
      
        INTO
      
       SALGRADE 
      
        VALUES
      
       (
      
        5
      
      , 
      
        3001
      
      , 
      
        9999
      
      
        );




      
      
        COMMIT
      
      ;
    

  练习题目

      
        根据Oracle数据库scott模式下的emp表和dept表,完成下列操作。

(
      
      
        1
      
      
        )    查询20号部门的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       deptno 
      
        =
      
      
        20
      
      
        ;

(
      
      
        2
      
      
        )    查询所有工种为CLERK的员工的工号、员工名和部门名。


      
      
        select
      
       empno,ename,deptno 
      
        from
      
       emp 
      
        where
      
       job 
      
        like
      
      
        '
      
      
        CLERK
      
      
        '
      
      
        ;

(
      
      
        3
      
      
        )    查询奖金(COMM)高于工资(SAL)的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       comm 
      
        >
      
      
         sal;

(
      
      
        4
      
      )    查询奖金高于工资的20
      
        %
      
      
        的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       comm 
      
        >
      
       (sal
      
        *
      
      
        0.2
      
      
        );

(
      
      
        5
      
      
        )    查询10号部门中工种为MANAGER和20号部门中工种为CLERK的员工的信息。


      
      
        select
      
      
        *
      
      
        from
      
      
         emp 


      
      
        where
      
       (deptno 
      
        =
      
      
        10
      
      
        and
      
       job 
      
        like
      
      
        '
      
      
        MANAGER
      
      
        '
      
      ) 
      
        or
      
       (deptno 
      
        =
      
      
        20
      
      
        and
      
       job 
      
        like
      
      
        '
      
      
        CLERK
      
      
        '
      
      
        );

(
      
      
        6
      
      
        )    查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。


      
      
        select
      
      
        *
      
      
        from
      
      
         emp 


      
      
        where
      
       job 
      
        not
      
      
        in
      
       (
      
        '
      
      
        MANAGER
      
      
        '
      
      ,
      
        '
      
      
        CLERK
      
      
        '
      
      ) 
      
        and
      
       sal 
      
        >=
      
      
        2000
      
      
         ;

(
      
      
        7
      
      
        )    查询有奖金的员工的不同工种。


      
      
        select
      
      
        distinct
      
       job 
      
        from
      
       emp 
      
        where
      
       comm 
      
        is
      
      
        not
      
      
        null
      
      
        ;

(
      
      
        8
      
      
        )    查询所有员工工资和奖金的和。


      
      
        select
      
       ename,(sal
      
        +
      
      nvl(comm,
      
        0
      
      )) salcomm 
      
        from
      
      
         emp;

(
      
      
        9
      
      
        )    查询没有奖金或奖金低于100的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       (comm 
      
        is
      
      
        null
      
      
        or
      
       comm 
      
        <
      
      
        100
      
      
        ) ;

(
      
      
        10
      
      
        )    查询各月倒数第2天入职的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       hiredate 
      
        in
      
       (
      
        select
      
       (last_day(hiredate)
      
        -
      
      
        1
      
      ) 
      
        from
      
      
         emp);

(
      
      
        11
      
      
        )    查询员工工龄大于或等于10年的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       (sysdate 
      
        -
      
       hiredate)
      
        /
      
      
        365
      
      
        >=
      
      
        10
      
      
         ;

(
      
      
        12
      
      
        )    查询员工信息,要求以首字母大写的方式显示所有员工的姓名。


      
      
        select
      
      
        upper
      
      (substr(ename,
      
        1
      
      ,
      
        1
      
      )) 
      
        ||
      
      
        lower
      
      (substr(ename,
      
        2
      
      ,length(ename)
      
        -
      
      
        1
      
      )) 
      
        from
      
      
         emp;

(
      
      
        13
      
      
        )    查询员工名正好为6个字符的员工的信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       length(ename)
      
        =
      
      
        6
      
      
         ;

(
      
      
        14
      
      
        )    查询员工名字中不包含字母“S”员工。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       ename 
      
        not
      
      
        in
      
       (
      
        select
      
       ename 
      
        from
      
       emp 
      
        where
      
       ename 
      
        like
      
      
        '
      
      
        %S%
      
      
        '
      
      
        ) ;


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       ename 
      
        not
      
      
        like
      
        %
      
      S
      
        %
      
      
        ’;

(
      
      
        15
      
      
        )    查询员工姓名的第2个字母为“M”的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       ename 
      
        like
      
      
        '
      
      
        _M%
      
      
        '
      
      
        ;

(
      
      
        16
      
      
        )    查询所有员工姓名的前3个字符。


      
      
        select
      
       substr(ename,
      
        1
      
      ,
      
        3
      
      ) 
      
        from
      
      
         emp ;

(
      
      
        17
      
      
        )    查询所有员工的姓名,如果包含字母“s”,则用“S”替换。


      
      
        select
      
      
        replace
      
      (ename,
      
        '
      
      
        s
      
      
        '
      
      ,
      
        '
      
      
        S
      
      
        '
      
      ) 
      
        from
      
      
         emp ;

(
      
      
        18
      
      
        )    查询员工的姓名和入职日期,并按入职日期从先到后进行排列。


      
      
        select
      
       ename,hiredate 
      
        from
      
       emp 
      
        order
      
      
        by
      
       hiredate 
      
        asc
      
      
         ;

(
      
      
        19
      
      
        )    显示所有的姓名、工种、工资和奖金,按工种降序排列,若工种相同则按工资升序排列。


      
      
        select
      
       ename,job,sal,comm 
      
        from
      
       emp 
      
        order
      
      
        by
      
       job 
      
        desc
      
      ,sal 
      
        asc
      
      
         ;

(
      
      
        20
      
      
        )    显示所有员工的姓名、入职的年份和月份,若入职日期所在的月份排序,若月份相同则按入职的年份排序。


      
      
        select
      
       ename,to_char(hiredate,
      
        '
      
      
        yyyy
      
      
        '
      
      )
      
        ||
      
      
        '
      
      
        -
      
      
        '
      
      
        ||
      
      to_char(hiredate,
      
        '
      
      
        mm
      
      
        '
      
      ) 
      
        from
      
       emp 
      
        order
      
      
        by
      
       to_char(hiredate,
      
        '
      
      
        mm
      
      
        '
      
      ),to_char(hiredate,
      
        '
      
      
        yyyy
      
      
        '
      
      
        );

(
      
      
        21
      
      
        )    查询在2月份入职的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       to_char(hiredate,
      
        '
      
      
        mm
      
      
        '
      
      ) 
      
        =
      
      
        2
      
      
         ;

(
      
      
        22
      
      )    查询所有员工入职以来的工作期限,用“
      
        **
      
        **
      
        **
      
      
        日”的形式表示。


      
      
        select
      
       ename,
      
        floor
      
      ((sysdate
      
        -
      
      hiredate)
      
        /
      
      
        365
      
      )
      
        ||
      
      
        '
      
      
      
        '
      
      
        ||
      
      
        floor
      
      (mod((sysdate
      
        -
      
      hiredate),
      
        365
      
      )
      
        /
      
      
        30
      
      )
      
        ||
      
      
        '
      
      
      
        '
      
      
        ||
      
      cell(mod(mod((sysdate
      
        -
      
      hiredate),
      
        365
      
      ),
      
        30
      
      ))
      
        ||
      
      
        '
      
      
      
        '
      
      
        from
      
      
         emp ;

(
      
      
        23
      
      
        )    查询至少有一个员工的部门信息。


      
      
        select
      
      
        *
      
      
        from
      
       dept 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       mgr 
      
        is
      
      
        not
      
      
        null
      
      
        ) ;

(
      
      
        24
      
      
        )    查询工资比SMITH员工工资高的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       sal 
      
        >
      
       (
      
        select
      
       sal 
      
        from
      
       emp 
      
        where
      
       ename 
      
        like
      
      
        '
      
      
        SMITH
      
      
        '
      
      
        ) ;

(
      
      
        25
      
      
        )    查询所有员工的姓名及其直接上级的姓名。


      
      
        select
      
       staname,ename supname 
      
        from
      
       (
      
        select
      
       ename staname,mgr 
      
        from
      
       emp) t 
      
        join
      
       emp 
      
        on
      
       t.mgr
      
        =
      
      
        emp.empno ;

(
      
      
        26
      
      
        )    查询入职日期早于其直接上级领导的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       empno 
      
        in
      
       (
      
        select
      
       staempno 
      
        from
      
       (
      
        select
      
       empno staempno,hiredate stahiredate,mgr 
      
        from
      
       emp) t 
      
        join
      
       emp 
      
        on
      
       t.mgr
      
        =
      
      emp.empno 
      
        and
      
       stahiredate 
      
        <
      
      
         hiredate) ;

(
      
      
        27
      
      
        )    查询所有部门及其员工信息,包括那些没有员工的部门。


      
      
        select
      
      
        *
      
      
        from
      
       dept 
      
        left
      
      
        join
      
       emp 
      
        on
      
       emp.deptno
      
        =
      
      dept.deptno 
      
        order
      
      
        by
      
      
         dept.deptno ;

(
      
      
        28
      
      
        )    查询所有员工及其部门信息,包括那些还不属于任何部门的员工。



(
      
      
        29
      
      
        )    查询所有工种为CLERK的员工的姓名及其部门名称。


      
      
        select
      
       ename,dname 
      
        from
      
       emp 
      
        join
      
       dept 
      
        on
      
       job 
      
        like
      
      
        '
      
      
        CLERK
      
      
        '
      
      
        and
      
       emp.deptno
      
        =
      
      
        dept.deptno ;

(
      
      
        30
      
      
        )    查询最低工资大于2500的各种工作。


      
      
        select
      
       job 
      
        from
      
       (
      
        select
      
      
        min
      
      (sal) min_sal,job 
      
        from
      
       emp 
      
        group
      
      
        by
      
       job) 
      
        where
      
       min_sal 
      
        >
      
      
        2500
      
      
         ;

(
      
      
        31
      
      
        )    查询最低工资低于2000的部门及其员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
       deptno 
      
        from
      
       (
      
        select
      
      
        min
      
      (sal) min_sal,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) 
      
        where
      
       min_sal 
      
        <
      
      
        '
      
      
        2000
      
      
        '
      
      
        ) ;

(
      
      
        32
      
      
        )    查询在SALES部门工作的员工的姓名信息。


      
      
        select
      
       ename 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        =
      
       (
      
        select
      
       deptno 
      
        from
      
       dept 
      
        where
      
       dname 
      
        like
      
      
        '
      
      
        SALES
      
      
        '
      
      
        );

(
      
      
        33
      
      
        )    查询工资高于公司平均工资的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       sal 
      
        >
      
       (
      
        select
      
      
        avg
      
      (sal) 
      
        from
      
      
         emp) ;

(
      
      
        34
      
      
        )    查询与SMITH员工从事相同工作的所有员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       job 
      
        in
      
       (
      
        select
      
       job 
      
        from
      
       emp 
      
        where
      
       ename 
      
        like
      
      
        '
      
      
        SMITH
      
      
        '
      
      ) 
      
        and
      
       ename 
      
        not
      
      
        like
      
      
        '
      
      
        SMITH
      
      
        '
      
      
         ;

(
      
      
        35
      
      
        )    列出工资等于30号部门中某个员工工资的所有员工的姓名和工资。


      
      
        select
      
       ename,sal 
      
        from
      
       emp 
      
        where
      
       sal 
      
        =any
      
       (
      
        select
      
       sal 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        =
      
      
        30
      
      
        ) ;

(
      
      
        36
      
      
        )    查询工资高于30号部门中工作的所有员工的工资的员工姓名和工资。


      
      
        select
      
       ename,sal 
      
        from
      
       emp 
      
        where
      
       sal 
      
        >all
      
       (
      
        select
      
       sal 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        =
      
      
        30
      
      
        ) ;

(
      
      
        37
      
      
        )    查询每个部门中的员工数量、平均工资和平均工作年限。


      
      
        select
      
       dname,
      
        count
      
      ,avg_sal,avg_date 
      
        from
      
       dept 
      
        join
      
       (
      
        select
      
      
        count
      
      (
      
        *
      
      ) 
      
        count
      
      ,
      
        avg
      
      (sal) avg_sal,
      
        avg
      
      ((sysdate
      
        -
      
      hiredate)
      
        /
      
      
        365
      
      ) avg_date,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) t 
      
        on
      
       dept.deptno 
      
        =
      
      
         t.deptno ;

(
      
      
        38
      
      
        )    查询从事同一种工作但不属于同一部门的员工信息。


      
      
        select
      
      
        distinct
      
       t1.empno,t1.ename,t1.deptno 
      
        from
      
       emp t1 
      
        join
      
       emp t2 
      
        on
      
       t1.job 
      
        like
      
       t2.job 
      
        and
      
       t1.deptno 
      
        <>
      
      
         t2.deptno ;

(
      
      
        39
      
      
        )    查询各个部门的详细信息以及部门人数、部门平均工资。


      
      
        Select
      
       dept.
      
        *
      
      ,person_num,avg_sal 
      
        from
      
       dept,(
      
        select
      
      
        count
      
      (
      
        *
      
      ) person_num,
      
        avg
      
      (sal) avg_sal,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) t 
      
        where
      
       dept.deptno 
      
        =
      
      
         t.deptno ;

(
      
      
        40
      
      
        )    查询各种工作的最低工资。


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

(
      
      
        41
      
      
        )    查询各个部门中的不同工种的最高工资。


      
      
        select
      
      
        max
      
      (sal),job,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno,job 
      
        order
      
      
        by
      
      
         deptno,job ;

(
      
      
        42
      
      
        )    查询10号部门员工以及领导的信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       empno 
      
        in
      
       (
      
        select
      
       mgr 
      
        from
      
       emp 
      
        where
      
       deptno
      
        =
      
      
        10
      
      ) 
      
        or
      
       deptno 
      
        =
      
      
        10
      
      
         ;

(
      
      
        43
      
      
        )    查询各个部门的人数及平均工资。


      
      
        select
      
       deptno,
      
        count
      
      (
      
        *
      
      ),
      
        avg
      
      (sal) 
      
        from
      
       emp 
      
        group
      
      
        by
      
      
         deptno ;

(
      
      
        44
      
      
        )    查询工资为某个部门平均工资的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       sal 
      
        in
      
       (
      
        select
      
      
        avg
      
      (sal) avg_sal 
      
        from
      
       emp 
      
        group
      
      
        by
      
      
         deptno) ;

(
      
      
        45
      
      
        )    查询工资高于本部门平均工资的员工的信息。


      
      
        select
      
       emp.
      
        *
      
      
        from
      
       emp 
      
        join
      
       (
      
        select
      
       deptno,
      
        avg
      
      (sal) avg_sal 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) t 
      
        on
      
       emp.deptno
      
        =
      
      t.deptno 
      
        and
      
       sal
      
        >
      
      
        avg_sal ;

(
      
      
        46
      
      
        )    查询工资高于本部门平均工资的员工的信息及其部门的平均工资。


      
      
        select
      
       emp.
      
        *
      
      ,avg_sal 
      
        from
      
       emp 
      
        join
      
       (
      
        select
      
       deptno,
      
        avg
      
      (sal) avg_sal 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) t 
      
        on
      
       emp.deptno
      
        =
      
      t.deptno 
      
        and
      
       sal
      
        >
      
      
        avg_sal ;

(
      
      
        47
      
      
        )    查询工资高于20号部门某个员工工资的员工的信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       sal 
      
        >any
      
      (
      
        select
      
       sal 
      
        from
      
       emp 
      
        where
      
       deptno
      
        =
      
      
        20
      
      
        );

(
      
      
        48
      
      
        )    统计各个工种的人数与平均工资。


      
      
        select
      
       job,
      
        count
      
      (
      
        *
      
      ),
      
        avg
      
      (sal) 
      
        from
      
       emp 
      
        group
      
      
        by
      
      
         job ;

(
      
      
        49
      
      
        )    统计每个部门中各个工种的人数与平均工资。


      
      
        select
      
       deptno,job,
      
        count
      
      (
      
        *
      
      ),
      
        avg
      
      (sal) 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno,job 
      
        order
      
      
        by
      
      
         deptno,job;

(
      
      
        50
      
      
        )    查询工资、奖金与10 号部门某个员工工资、奖金都相同的员工的信息。


      
      
        select
      
       emp.
      
        *
      
      
        from
      
       emp 
      
        join
      
       (
      
        select
      
       sal,comm 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        =
      
      
        10
      
      ) t 
      
        on
      
       emp.sal
      
        =
      
      t.sal 
      
        and
      
       nvl(emp.comm,
      
        0
      
      )
      
        =
      
      nvl(t.comm,
      
        0
      
      ) 
      
        and
      
       emp.deptno 
      
        !=
      
      
        10
      
      
        ;

(
      
      
        51
      
      
        )    查询部门人数大于5的部门的员工的信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
       deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno 
      
        having
      
      
        count
      
      (
      
        *
      
      )
      
        >
      
      
        5
      
      
        );

(
      
      
        52
      
      
        )    查询所有员工工资都大于1000的部门的信息。


      
      
        select
      
      
        *
      
      
        from
      
       dept 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        not
      
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       sal 
      
        <
      
      
        1000
      
      
        )) ;

(
      
      
        53
      
      
        )    查询所有员工工资都大于1000的部门的信息及其员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        join
      
       dept 
      
        on
      
       dept.deptno 
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        not
      
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       sal 
      
        <
      
      
        1000
      
      )) 
      
        and
      
       dept.deptno
      
        =
      
      
        emp.deptno;

(
      
      
        54
      
      )    查询所有员工工资都在900
      
        ~
      
      
        3000之间的部门的信息。


      
      
        select
      
      
        *
      
      
        from
      
       dept 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        not
      
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       sal 
      
        not
      
      
        between
      
      
        900
      
      
        and
      
      
        3000
      
      
        )) ;

(
      
      
        55
      
      )    查询所有工资都在900
      
        ~
      
      
        3000之间的员工所在部门的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       deptno 
      
        not
      
      
        in
      
       (
      
        select
      
      
        distinct
      
       deptno 
      
        from
      
       emp 
      
        where
      
       sal 
      
        not
      
      
        between
      
      
        900
      
      
        and
      
      
        3000
      
      
        )) ;

(
      
      
        56
      
      
        )    查询每个员工的领导所在部门的信息。


      
      
        select
      
      
        *
      
      
        from
      
       (
      
        select
      
       e1.empno,e1.ename,e1.mgr mno,e2.ename mname,e2.deptno 
      
        from
      
       emp e1 
      
        join
      
       emp e2 
      
        on
      
       e1.mgr
      
        =
      
      e2.empno) t 
      
        join
      
       dept 
      
        on
      
       t.deptno
      
        =
      
      
        dept.deptno ;

(
      
      
        57
      
      
        )    查询人数最多的部门信息。


      
      
        select
      
      
        *
      
      
        from
      
       dept 
      
        where
      
       deptno 
      
        in
      
       (
      
        select
      
       deptno 
      
        from
      
       (
      
        select
      
      
        count
      
      (
      
        *
      
      ) 
      
        count
      
      ,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) 
      
        where
      
      
        count
      
      
        in
      
       (
      
        select
      
      
        max
      
      (
      
        count
      
      ) 
      
        from
      
       (
      
        select
      
      
        count
      
      (
      
        *
      
      ) 
      
        count
      
      ,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
      
         deptno)));

(
      
      
        58
      
      
        )    查询30号部门中工资排序前3名的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       empno 
      
        in
      
       (
      
        select
      
       empno 
      
        from
      
       (
      
        select
      
       empno,sal 
      
        from
      
       emp 
      
        where
      
       deptno
      
        =
      
      
        30
      
      
        order
      
      
        by
      
       sal 
      
        desc
      
      ) 
      
        where
      
       rownum 
      
        <
      
      
        4
      
      
        ) ;

(
      
      
        59
      
      )    查询所有员工中工资排在5
      
        ~
      
      
        10名之间的员工信息。


      
      
        select
      
      
        *
      
      
        from
      
       emp 
      
        where
      
       empno 
      
        in
      
       (
      
        select
      
       empno 
      
        from
      
       (
      
        select
      
       empno,rownum num 
      
        from
      
       (
      
        select
      
       empno,sal 
      
        from
      
       emp 
      
        order
      
      
        by
      
       sal 
      
        desc
      
      )) 
      
        where
      
       num 
      
        between
      
      
        5
      
      
        and
      
      
        10
      
      
         ) ;




      
      
        select
      
       empno 
      
        from
      
       (
      
        select
      
       empno,sal 
      
        from
      
       emp 
      
        order
      
      
        by
      
       sal 
      
        desc
      
      ) 
      
        where
      
       rownum 
      
        <=
      
      
        10
      
       minus 
      
        select
      
       empno 
      
        from
      
       (
      
        select
      
       empno,sal 
      
        from
      
       emp 
      
        order
      
      
        by
      
       sal 
      
        desc
      
      ) 
      
        where
      
       rownum 
      
        <
      
      
        5
      
      
         ;

(
      
      
        60
      
      
        )    查询SMITH员工及所有其直接、间接下属员工的信息。



(
      
      
        61
      
      
        )    查询SOCTT员工及其直接、间接上级员工的信息。



(
      
      
        62
      
      
        )    以树状结构查询所有员工与领导之间的层次关系。



(
      
      
        63
      
      
        )    向emp表中插入一条记录,员工号为1357,员工名字为oracle,工资为2050元,部门号为20,入职日期为2002年5月10日。

insertinto emp(empno,ename,sal,deptno,hiredate) 
      
      
        values
      
       (
      
        1357
      
      ,
      
        '
      
      
        oracle
      
      
        '
      
      ,
      
        2050
      
      ,
      
        20
      
      ,to_date(
      
        '
      
      
        2002年5月10日
      
      
        '
      
      ,
      
        '
      
      
        yyyy"年"mm"月"dd"日"
      
      
        '
      
      
        )) ;

(
      
      
        64
      
      
        )    向emp表中插入一条记录,员工名字为FAN,员工号为8000,其他信息与SMITH员工的信息相同。



(
      
      
        65
      
      
        )    将各部门员工的工资修改为该员工所在部门平均工资加1000。


      
      
        update
      
       emp t1 
      
        set
      
       sal 
      
        =
      
       (
      
        select
      
       new_sal 
      
        from
      
       (
      
        select
      
      
        avg
      
      (sal)
      
        +
      
      
        1000
      
       new_sal,deptno 
      
        from
      
       emp 
      
        group
      
      
        by
      
       deptno) t2 wher e t1.deptno 
      
        =
      
       t2.deptno ) ;
    

解锁用户、设置密码

使用sqlplus程序登录

SQL*Plus: Release 11.2.0.2.0 Production on 星期四 11月 27 15:58:01 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

SQL> connect sys as sysdba
输入口令:
已连接。
SQL> alter user HR account unlock;

用户已更改。

SQL> alter user HR identified by 123456;

用户已更改。

SQL>

 

Oracle Database 11g Express Edition学习笔记


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论