oracle学习第二天(函数,CURD)

来源:互联网 发布:如何在手机淘宝付钱 编辑:程序博客网 时间:2024/04/27 05:16
oracle学习第二天(函数,CURD)

版本:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
用户名:scott
密码:tiger
C:\Users\Administrator>sqlplus scott/tiger

SQL*Plus: Release 10.2.0.1.0 - Production on

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


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
使用到的表:scott用户拥有的表
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
SQL>
查询所有员工的信息,要求显示所在部门的名称(而不是编号)
 1  select empno,ename,job,(select d.dname from dept d where d.deptno=e.deptno) as 所在部门
 2* from emp e
 3  /

    EMPNO ENAME      JOB       所在部门
--------- ---------- --------- --------------
     7369 SMITH      CLERK     RESEARCH
     7499 ALLEN      SALESMAN  SALES
     7521 WARD       SALESMAN  SALES
     7566 JONES      MANAGER   RESEARCH
     7654 MARTIN     SALESMAN  SALES
     7698 BLAKE      MANAGER   SALES
     7782 CLARK      MANAGER   ACCOUNTING
     7788 SCOTT      ANALYST   RESEARCH
     7839 KING       PRESIDENT ACCOUNTING
     7844 TURNER     SALESMAN  SALES
     7876 ADAMS      CLERK     RESEARCH
     7900 JAMES      CLERK     SALES
     7902 FORD       ANALYST   RESEARCH
     7934 MILLER     CLERK     ACCOUNTING

已选择14行。

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

格式中有其他字符时要使用双引号引起来:
SQL> select to_char(sysdate, 'yyyy"年"mm"月"dd"日" hh"时"mi"分"ss"秒"') from dual;

TO_CHAR(SYSDATE,'YYYY"年"MM
---------------------------
2013年11月02日 06时33分01秒
------------------------------------------------------------------
 
  1* select * from emp where hiredate>to_date('19810601','yyyymmdd')
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择9行。
===================字符函数==============================
字符函数:
        lower    全部转为小写
        upper    全部转为大写
        initcap    首字母转为大写
        -------
        concat    连接两个字符串
        substr    在字符串str中从第m个位置开始取n个字符(位置从1开始)
        length    求长度
        instr    从字符串strA中找出str所在的位置(返回第找到的1个,位置从1开始)
        lpad    把字符串str补齐到n个长度,不足就在左边加指定字符c;
                如果str.length>n就取str的前n个字符
        rpad    把字符串str补齐到n个长度,不足就在右边加指定字符c;
                如果str.length>n就取str的前n个字符(也是从前面取)
        trim    从str的两端去掉字符,要是指定的字符时才去掉,使用方式特殊:
                例:trim('a' from 'aaITCASTaa') 结果为 'ITCAST'
                    trim('C' from 'aaITCASTaa') 结果为 'aaITCASTaa'
                注意:前面只能指定一个字符。
        replace    例:replace('aaITCASTaa', 'a', '=') 结果为 '==ITCAST=='
转换成小写
SQL> select lower('ABCddd') from dual;

LOWER(
------
abcddd

已选择 1 行。
转换成小写
SQL> select upper('aac')
  2  from dual;

UPP
---
AAC

已选择 1 行。
连接串
SQL> select concat(concat('aa','bb'),'cc') from dual;

CONCAT
------
aabbcc

已选择 1 行。

SQL>
SQL>
substr( str, startPosition, count )
    从第几个开始,需要截取几个字符,第1个位置是1。
    如果第3个参数不指定(即不指定截取几个字符),就表示到最后。


SQL> select instr('Hello World!', 'llo') from dual;

INSTR('HELLOWORLD!','LLO')
--------------------------
                         3

lpad与rpad函数

SQL> select lpad('ith', 5, '**') from dual;

LPAD(
-----
**ith

SQL> select lpad('smith', 3, '*') from dual;

LPA
---
smi

SQL> select rpad('smith', 3, '*') from dual;

RPA
---
smi


======================================

SQL> select trim(' ' from '  ITCAST  ') from dual;

TRIM('
------
ITCAST



SQL> select trim('a' from 'aaa  ITCAST  aa') from dual;

TRIM('A'FR
----------
  ITCAST



  1  select
  2     trim( ' ' from trim('a' from 'aaa  ITCAST  aa') )
  3* from dual
SQL> /

TRIM('
------
ITCAST


SQL> select replace('hellword world!', 'o', 'X') from dual;

REPLACE('HELLWO
---------------
hellwXrd wXrld!


===============数字函数=======================
数字函数:
        round    四舍五入,例 round('45.923', 2) 表示保存两位小数,保留的位数可以指定正、零、负数。
        trunc    截断,舍掉后面的数,保留的位数可以指定正、零、负数。
        mod        求余,如 mod(12, 5) 结果为2


12 % 5 = 2

SQL> select mod(12, 5) from dual;

 MOD(12,5)
----------
         2

SQL> select mod(15, 5) from dual;

 MOD(15,5)
----------
         0

====================日期函数============================
日期函数:
        日期可以相减,但不能相加,因为没有意义。
            select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;
            select ename,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期, (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
        add_months
        next_day    从某个日期算起,下一个出现该星期几的日期是哪天: select next_day(sysdate,'星期三') from dual;
        last_day    当月的最后一天
        round    四舍五入
        trunc   抹去尾部

SQL> select round(32.392, 2) from dual;

ROUND(32.392,2)
---------------
          32.39


SQL> select round(32.92, 0) from dual;

ROUND(32.92,0)
--------------
            33

SQL> select round(10532.92, -1) from dual;

ROUND(10532.92,-1)
------------------
             10530

SQL> select round(10532.92, -2) from dual;

ROUND(10532.92,-2)
------------------
             10500


=================================


SQL> select trunc(32.392, 1) from dual;

TRUNC(32.392,1)
---------------
           32.3


SQL> select trunc(10532.92, 0) from dual;

TRUNC(10532.92,0)
-----------------
            10532


SQL> select trunc(10532.92, -1) from dual;

TRUNC(10532.92,-1)
------------------
             10530

=======================

日期的数学运算

SQL> select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;

昨天           今天           明天
-------------- -------------- --------------
01-11月-13     02-11月-13     03-11月-13

已选择 1 行。

利用日期函数计算工龄
SQL>  select empno, ename, sal, hiredate, round(sysdate-hiredate) || '天' as 工龄 from emp
  2  /

     EMPNO ENAME             SAL HIREDATE       工龄
---------- ---------- ---------- -------------- ------------------------------------------
      7369 SMITH             800 17-12月-80     12009天
      7499 ALLEN            1600 20-2月 -81     11944天
      7521 WARD             1250 22-2月 -81     11942天
      7566 JONES            2975 02-4月 -81     11903天
      7654 MARTIN           1250 28-9月 -81     11724天
      7698 BLAKE            2850 01-5月 -81     11874天
      7782 CLARK            2450 09-6月 -81     11835天
      7788 SCOTT            3000 19-4月 -87     9695天
      7839 KING             5000 17-11月-81     11674天
      7844 TURNER           1500 08-9月 -81     11744天
      7876 ADAMS            1100 23-5月 -87     9661天
      7900 JAMES             950 03-12月-81     11658天
      7902 FORD             3000 03-12月-81     11658天
      7934 MILLER           1300 23-1月 -82     11607天

已选择14行。

可以用数字除24来向日期中加上或减去小时

格化式显示日期
SQL> select to_char(sysdate - 1, 'yyyy-mm-dd hh:mi:ss') from dual;

TO_CHAR(SYSDATE-1,'
-------------------
2013-11-01 06:46:17


当前日期减一个小时
SQL> select to_char(sysdate - 1/24, 'yyyy-mm-dd hh:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2013-11-02 05:46:55

当前日期减一分钟
SQL> select to_char(sysdate - 1/24/60, 'yyyy-mm-dd hh:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2013-11-02 06:46:41

======================================
日期函数:

找某月最后一天。


SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA
--------------
30-11月-13

========================================

在指定日期上加上n个月时间:
SQL> select add_months(sysdate, 1) from dual;

ADD_MONTHS(SYS
--------------
02-12月-13

====================================

计算两个日期相差的月数


SQL> select months_between(sysdate, '12-8月-2013') from dual;

MONTHS_BETWEEN(SYSDATE,'12-8月-2013')
-------------------------------------
                           2.70274492

SQL>  select months_between(sysdate, '2-12月-2013') from dual;

MONTHS_BETWEEN(SYSDATE,'2-12月-2013')
-------------------------------------
                                   -1
--------------------------------------------------------

日期的四舍五入与截断
round四舍五入
当前日期进行四舍五入
SQL>  select round(sysdate, 'month') from dual;

ROUND(SYSDATE,
--------------
01-11月-13
当前日期加20天再进入四舍五入

SQL> select round(sysdate + 20, 'month') from dual;

ROUND(SYSDATE+
--------------
01-12月-13

====================================

找某月第一天(就是m月1日)。
    方式一:通过求前一个月的最后一天再加上1
       
          SQL> select last_day(add_months(sysdate, -1)) + 1 from dual;
          LAST_DAY(ADD_M   
          --------------
          01-11月-13
       
     方式二:通过截断函数
        SQL> select trunc(sysdate, 'month') from dual;

               TRUNC(SYSDATE,
               --------------
               01-11月-13

=====================================

next_day(),从指定日期开始,第一次出现指定星期几的日期是多少。

下一个星期四是什么时候:    今天11月2日,下一个星期四为11月7日
SQL>  select next_day(sysdate, '星期四') from dual;

NEXT_DAY(SYSDA
--------------
07-11月-13
下一个星期一是什么时候:    今天11月2日,下一个星期一为11月4日
SQL> select next_day(sysdate, '星期一') from dual;

NEXT_DAY(SYSDA
--------------
04-11月-13

=================格化式数字===========================
显示工资为本地货币¥ RBM人民币
SQL> select empno, lower(ename), to_char(sal, 'L999999') from emp;

     EMPNO LOWER(ENAM TO_CHAR(SAL,'L999
---------- ---------- -----------------
      7369 smith                  ¥800
      7499 allen                 ¥1600
      7521 ward                  ¥1250

显示工资为本地货币$ 美元
SQL> select empno, lower(ename), to_char(sal, '$999999') from emp;

     EMPNO LOWER(ENAM TO_CHAR(
---------- ---------- --------
      7369 smith          $800
      7499 allen         $1600
      7521 ward          $1250

自动配置宽度,不足前面补0,并以$美元形式显示
SQL> select empno, lower(ename), to_char(sal, '$00000') from emp;

     EMPNO LOWER(ENAM TO_CHAR
---------- ---------- -------
      7369 smith       $00800
      7499 allen       $01600
      7521 ward        $01250


SQL> select empno, lower(ename), to_char(sal, '$999,999.99') from emp;

     EMPNO LOWER(ENAM TO_CHAR(SAL,
---------- ---------- ------------
      7369 smith           $800.00
      7499 allen         $1,600.00
      7521 ward          $1,250.00
================转换函数================================
转换函数:
        隐式数据类型转换 与 显式数据类型转换
        to_char(date, format)
        to_date(string [,format])
        to_char(number, format)
        to_number(string [,format]) 如: to_number('22') 或 to_number('$22', '$99')
隐式转换
SQL> select '3' - 2 from dual;

     '3'-2
----------
         1
隐式转换出现错误
SQL> select '$3' - 2 from dual;
select '$3' - 2 from dual
       *
第 1 行出现错误:
ORA-01722: 无效数字

显式转换,即强制转换
SQL> select to_number('$3','$999') - 2 from dual;

TO_NUMBER('$3','$999')-2
------------------------
                       1


===============空值处理函数======================

空值处理函数:
NVL (expr1, expr2)
可以使用的数据类型有日期、字符、数字
NVL2 (expr1, expr2, expr3)
expr1不为NULL,返回expr2;为NULL,就返回expr3( expr1 != null ? expr2 : expr3 )

SQL> select nvl(null, 5) from dual;

NVL(NULL,5)
-----------
          5


SQL> select nvl2(null, 5, 10) from dual;

NVL2(NULL,5,10)
---------------
             10


SQL> select nvl2('  ', 5, 10) from dual;

NVL2('',5,10)
-------------
            5


===================条件表达式====================
条件表达式:
        用于实现 IF-THEN-ELSE 逻辑。
        CASE 表达式:SQL99的语法,比较繁琐。
        DECODE 函数:Oracle自己的语法,类似Java,比较简洁。
        例:
            根据员工的职位涨工资:总裁1000 经理800 其他400
            PRESIDENT
            MANAGER

CASE的使用方式一:
   
SQL> select
  2             empno,
  3             lower(ename),
  4             job,
  5             sal 原来的工资,
  6             ( CASE job WHEN 'PRESIDENT' THEN sal + 1000 WHEN 'MANAGER' THEN sal+800 ELSE sal +400 END ) 涨后的工资
  7     from
  8             emp;

     EMPNO LOWER(ENAM JOB       原来的工资 涨后的工资
---------- ---------- --------- ---------- ----------
      7369 smith      CLERK            800       1200
      7499 allen      SALESMAN        1600       2000
      7521 ward       SALESMAN        1250       1650
      7566 jones      MANAGER         2975       3775
      7654 martin     SALESMAN        1250       1650
      7698 blake      MANAGER         2850       3650
      7782 clark      MANAGER         2450       3250
      7788 scott      ANALYST         3000       3400
      7839 king       PRESIDENT       5000       6000
      7844 turner     SALESMAN        1500       1900
      7876 adams      CLERK           1100       1500
      7900 james      CLERK            950       1350
      7902 ford       ANALYST         3000       3400
      7934 miller     CLERK           1300       1700

已选择14行。

CASE的使用方式二:
    SQL> select
  2             empno,
  3             lower(ename),
  4             job,
  5             sal 原来的工资,
  6             ( CASE WHEN job='PRESIDENT' THEN sal + 1000 WHEN job='MANAGER' THEN sal+800 ELSE sal +400 END ) 涨后的工资
  7     from
  8             emp;

     EMPNO LOWER(ENAM JOB       原来的工资 涨后的工资
---------- ---------- --------- ---------- ----------
      7369 smith      CLERK            800       1200
      7499 allen      SALESMAN        1600       2000
      7521 ward       SALESMAN        1250       1650
      7566 jones      MANAGER         2975       3775
      7654 martin     SALESMAN        1250       1650
      7698 blake      MANAGER         2850       3650
      7782 clark      MANAGER         2450       3250
      7788 scott      ANALYST         3000       3400
      7839 king       PRESIDENT       5000       6000
      7844 turner     SALESMAN        1500       1900
      7876 adams      CLERK           1100       1500
      7900 james      CLERK            950       1350
      7902 ford       ANALYST         3000       3400
      7934 miller     CLERK           1300       1700

已选择14行。

使用DECODE函数:


decode( 变量, 值1, 则a, 值2, 则b, ... default)
              ^^^^^^^^  ^^^^^^^^      ^^^^^^^
有默认值(default)
SQL>    select
  2             empno,
  3             lower(ename),
  4             job,
  5             sal 原来的工资,
  6             ( DECODE(job, 'PRESIDENT', sal + 1000,
  7                                       'MANAGER', sal+800,
  8                                       sal +400)
  9             ) 涨后的工资
 10     from
 11             emp;

     EMPNO LOWER(ENAM JOB       原来的工资 涨后的工资
---------- ---------- --------- ---------- ----------
      7369 smith      CLERK            800       1200
      7499 allen      SALESMAN        1600       2000
      7521 ward       SALESMAN        1250       1650
      7566 jones      MANAGER         2975       3775
      7654 martin     SALESMAN        1250       1650
      7698 blake      MANAGER         2850       3650
      7782 clark      MANAGER         2450       3250
      7788 scott      ANALYST         3000       3400
      7839 king       PRESIDENT       5000       6000
      7844 turner     SALESMAN        1500       1900
      7876 adams      CLERK           1100       1500
      7900 james      CLERK            950       1350
      7902 ford       ANALYST         3000       3400
      7934 miller     CLERK           1300       1700

已选择14行。
不使用默认值:
  1     select
  2             empno,
  3             lower(ename),
  4             job,
  5             sal 原来的工资,
  6             ( DECODE(job, 'PRESIDENT', sal + 1000,
  7                                       'MANAGER', sal+800
  8             )
  9             ) 涨后的工资
 10     from
 11*            emp
SQL> /

     EMPNO LOWER(ENAM JOB       原来的工资 涨后的工资
---------- ---------- --------- ---------- ----------
      7369 smith      CLERK            800
      7499 allen      SALESMAN        1600
      7521 ward       SALESMAN        1250
      7566 jones      MANAGER         2975       3775
      7654 martin     SALESMAN        1250
      7698 blake      MANAGER         2850       3650
      7782 clark      MANAGER         2450       3250
      7788 scott      ANALYST         3000
      7839 king       PRESIDENT       5000       6000
      7844 turner     SALESMAN        1500
      7876 adams      CLERK           1100
      7900 james      CLERK            950
      7902 ford       ANALYST         3000
      7934 miller     CLERK           1300

已选择14行。


=================集合运算==================
集合运算
    查询属于部门10与部门20的所有员工信息,还可以这样查
        select * from emp where deptno=10
        加上(这里写集合运算符)
        select * from emp where deptno=20;
    这就是集合运算。

    并集:
        UNION        集合a + b的结果,没有重复记录。
        UNION ALL    集合a + b的结果,保留所有重复的记录。(用的比较少)
        例:查询属于部门10与部门20的所有员工信息。
        例:查询工资在500~1500或在1000~2000范围的员工信息(这是两个工资级别)。
    交集
        Intersect    既属于集合a又属于集合b的记录。
        例:查询工资在500~1500又在1000~2000范围的员工信息(这是两个工资级别)。
    差集
        Minus        集合a - b的结果,即从a中去除所有属于集合b的元素,注意a-b与b-a的结果是不一样的。
        例:查询属于500~1500但不属于1000~2000范围的员工信息。
集合
unio 交集,不包括重复行,这里只有8行

 1  select empno,ename,sal from emp where sal between 500 and 1500
 2  union
 3  select empno,ename,sal from emp where sal between 1000 and 2000
 4* order by empno
QL> /

    EMPNO ENAME             SAL
--------- ---------- ----------
     7369 SMITH             800
     7499 ALLEN            1600
     7521 WARD             1250
     7654 MARTIN           1250
     7844 TURNER           1500
     7876 ADAMS            1100
     7900 JAMES             950
     7934 MILLER           1300

已选择8行。

union all:交集,包含重复行,这里有13行

  1  select empno,ename,sal from emp where sal between 500 and 1500
  2  union all
  3  select empno,ename,sal from emp where sal between 1000 and 2000
  4* order by empno
SQL> /

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7521 WARD             1250
      7654 MARTIN           1250
      7654 MARTIN           1250
      7844 TURNER           1500
      7844 TURNER           1500
      7876 ADAMS            1100
      7876 ADAMS            1100
      7900 JAMES             950
      7934 MILLER           1300
      7934 MILLER           1300

已选择13行。
交集: intersect两个集合中相同的部分
  1  select empno,ename,sal from emp where sal between 500 and 1500
  2  intersect
  3  select empno,ename,sal from emp where sal between 1000 and 2000
  4* order by empno
SQL> /

     EMPNO ENAME             SAL
---------- ---------- ----------
      7521 WARD             1250
      7654 MARTIN           1250
      7844 TURNER           1500
      7876 ADAMS            1100
      7934 MILLER           1300

差集:Minus集合a - b的结果,即从a中去除所有属于集合b的元素,注意a-b与b-a的结果是不一样的。
结果一:a-b
  1  select empno,ename,sal from emp where sal between 500 and 1500
  2  minus
  3  select empno,ename,sal from emp where sal between 1000 and 2000
  4* order by empno
SQL> /

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800
      7900 JAMES             950
结果二:b-a
  1  select empno,ename,sal from emp where sal between 1000 and 2000
  2     minus
  3     select empno,ename,sal from emp where sal between 500 and 1500
  4*   order by empno
SQL> /

     EMPNO ENAME             SAL
---------- ---------- ----------
      7499 ALLEN            1600
统计每的入职员工的个数:


注意:
    1,Select语句中参数类型和个数要一致
        如果不一致,需要想办法补齐。
        例如要补个字符串,不能写个'a'、'b'等,要不影响结果,应补一个null,还要指定类型。
            如果是字符串,可以写 to_char(null);
            如果要补数字类型,则写 to_number(null)
例:
select语句中参数类型和个数不一致,也现错误:
  1  select empno,ename,sal, 薪水 from emp where sal between 500 and 1500
  2  union
  3* select deptno,dname from dept
SQL> /
select empno,ename,sal, 薪水 from emp where sal between 500 and 1500
                        *
第 1 行出现错误:
ORA-00904: "薪水": 标识符无效
这里参数不足,使用null进行补齐是可以的
  1  select empno,ename,sal 薪水 from emp where sal between 500 and 1500
  2  union
  3* select deptno,dname,null from dept
SQL> /

     EMPNO ENAME                薪水
---------- -------------- ----------
        10 ACCOUNTING
        20 RESEARCH
        30 SALES
        40 OPERATIONS
      7369 SMITH                 800
      7521 WARD                 1250
      7654 MARTIN               1250
      7844 TURNER               1500
      7876 ADAMS                1100
      7900 JAMES                 950
      7934 MILLER               1300

用null补齐参数并指定类型
SQL> edit
已写入 file afiedt.buf

  1  select empno,ename,sal 薪水 from emp where sal between 500 and 1500
  2  union
  3* select deptno,to_char(null),to_number(null) from dept
SQL> /

     EMPNO ENAME            薪水
---------- ---------- ----------
        10
        20
        30
        40
      7369 SMITH             800
      7521 WARD             1250
      7654 MARTIN           1250
      7844 TURNER           1500
      7876 ADAMS            1100
      7900 JAMES             950
      7934 MILLER           1300

已选择11行。

    2,结果集采用第一个select的表头作为表头。
        在第一个select上起别名才有用。
        在后面的select上起别名就没有用。
    3,如果有order by子句
        必须放到最后一句查询语句后。
======================多表查询============================================
多表查询
   
    类型:
        1. 等值连接
        2. 不等值连接
        3. 外连接
        4. 自连接
等值连接:d.deptno=e.deptno
例:查询所有员工的信息,要求显示所在部门的名称(而不是部门编号)
利用子查询实现
SQL> select
  2     empno,
  3     ename,
  4     sal,
  5     (select dname from dept d where d.deptno=e.deptno) as 所在的部门
  6  from
  7     emp e
  8  /

     EMPNO ENAME             SAL 所在的部门
---------- ---------- ---------- --------------
      7369 SMITH             800 RESEARCH
      7499 ALLEN            1600 SALES
      7521 WARD             1250 SALES
      7566 JONES            2975 RESEARCH
      7654 MARTIN           1250 SALES
      7698 BLAKE            2850 SALES
      7782 CLARK            2450 ACCOUNTING
      7788 SCOTT            3000 RESEARCH
      7839 KING             5000 ACCOUNTING
      7844 TURNER           1500 SALES
      7876 ADAMS            1100 RESEARCH
      7900 JAMES             950 SALES
      7902 FORD             3000 RESEARCH
      7934 MILLER           1300 ACCOUNTING

已选择14行。
利用等值连接多表查询实现:简单,条件带等号

SQL> select empno,ename,sal from emp e,dept d where e.deptno=d.deptno;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            1100
      7900 JAMES             950
      7902 FORD             3000
      7934 MILLER           1300

已选择14行。

SQL>
不等值连接:区域查询,不使用等号
查询当前用户所拥有的表
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
查询工资级别表
SQL> select * from salgrade;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999

SQL>
不等值区间:e.sal between s.losal and s.hisal
例:查询员工的工资级别:编号 姓名 月薪和级别

SQL> select e.empno,e.ename,e.sal,s.grade
  2          from emp e,salgrade s
  3          where e.sal between s.losal and s.hisal;

     EMPNO ENAME             SAL      GRADE
---------- ---------- ---------- ----------
      7369 SMITH             800          1
      7900 JAMES             950          1
      7876 ADAMS            1100          1
      7521 WARD             1250          2
      7654 MARTIN           1250          2
      7934 MILLER           1300          2
      7844 TURNER           1500          3
      7499 ALLEN            1600          3
      7782 CLARK            2450          4
      7698 BLAKE            2850          4
      7566 JONES            2975          4
      7788 SCOTT            3000          4
      7902 FORD             3000          4
      7839 KING             5000          5

已选择14行。
过渡用的例子
按照部门统计员工的人数,要求显示:部门号,部门名称,员工人数
SQL> select d.deptno,d.dname,count(e.empno) as 员工数
  2          from emp e,dept d
  3          where e.deptno=d.deptno
  4          group by d.deptno,d.dname;

    DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
        10 ACCOUNTING                  3
        20 RESEARCH                    5
        30 SALES                       6

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
============================连接查询=======================================

    期望效果:当连接条件不成立时,仍然希望在结果中包含某些不成立的记录。这就要用到外连接。

    外连接:
        左外连接:where e.deptno=d.deptno  当连接条件不成立时,等号左边所代表的表的信息仍然显示
        右外连接:where e.deptno=d.deptno  当连接条件不成立时,等号右边所代表的表的信息仍然显示

        左外连接的写法(条件右边加上(+)号): where e.deptno=d.deptno(+)
        右外连接的写法(条件左边加上(-)号): where e.deptno(+)=d.deptno
利用左外连接实现:按照部门统计员工的人数,要求显示:部门号,部门名称,员工人数
SQL> select d.deptno,d.dname,count(e.empno)
  2          from emp e,dept d
  3          where e.deptno(+)=d.deptno
  4          group by d.deptno,d.dname
  5          order by 1;

    DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
        10 ACCOUNTING                  3
        20 RESEARCH                    5
        30 SALES                       6
        40 OPERATIONS                  0


  1  select e.ename || ' 的老板是 ' || m.ename
  2  from emp e, emp m
  3* where e.mgr=m.empno
左连接和右连接比较:
先插入一条记录
insert into emp(emp,ename,sal) values(1,'aaa',5000)
左外连接:(有员工aa,没有部门40)

  1  select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e,dept d
  3* where e.deptno=d.deptno(+)
SQL> /

     EMPNO ENAME             SAL     DEPTNO DNAME
---------- ---------- ---------- ---------- --------------
         1 aaa              5000
      7369 SMITH             800         20 RESEARCH
      7499 ALLEN            1600         30 SALES
      7521 WARD             1250         30 SALES
      7566 JONES            2975         20 RESEARCH
      7654 MARTIN           1250         30 SALES
      7698 BLAKE            2850         30 SALES
      7782 CLARK            2450         10 ACCOUNTING
      7788 SCOTT            3000         20 RESEARCH
      7839 KING             5000         10 ACCOUNTING
      7844 TURNER           1500         30 SALES
      7876 ADAMS            1100         20 RESEARCH
      7900 JAMES             950         30 SALES
      7902 FORD             3000         20 RESEARCH
      7934 MILLER           1300         10 ACCOUNTING

已选择15行。
右外连接:(有部门40,没有员工aa)

  1  select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e,dept d
  3* where e.deptno(+)=d.deptno
SQL> /

     EMPNO ENAME             SAL     DEPTNO DNAME
---------- ---------- ---------- ---------- --------------
      7839 KING             5000         10 ACCOUNTING
      7934 MILLER           1300         10 ACCOUNTING
      7782 CLARK            2450         10 ACCOUNTING
      7369 SMITH             800         20 RESEARCH
      7902 FORD             3000         20 RESEARCH
      7876 ADAMS            1100         20 RESEARCH
      7788 SCOTT            3000         20 RESEARCH
      7566 JONES            2975         20 RESEARCH
      7900 JAMES             950         30 SALES
      7499 ALLEN            1600         30 SALES
      7698 BLAKE            2850         30 SALES
      7654 MARTIN           1250         30 SALES
      7844 TURNER           1500         30 SALES
      7521 WARD             1250         30 SALES
                                         40 OPERATIONS

已选择15行。
注意:左连接和右连接可以互换
自连接:利用表的别名,将同一张表视为多张表
        例:查询员工信息:xxx的老板是yyy

SQL> select e.ename || '的老板是'|| b.ename
  2          from emp e, emp b
  3          where e.mgr=b.empno;

E.ENAME||'的老板是'||B.ENAME
----------------------------
SMITH的老板是FORD
ALLEN的老板是BLAKE
WARD的老板是BLAKE
JONES的老板是KING
MARTIN的老板是BLAKE
BLAKE的老板是KING
CLARK的老板是KING
SCOTT的老板是JONES
TURNER的老板是BLAKE
ADAMS的老板是SCOTT
JAMES的老板是BLAKE
FORD的老板是JONES
MILLER的老板是CLARK

已选择13行。

查询员信息与所在的部门名称:

方式一:等值连接
       
SQL> select     e.ename, e.sal, d.dname
  2             from    emp e, dept d
  3             where   e.deptno=d.deptno
  4  ;

ENAME             SAL DNAME
---------- ---------- --------------
SMITH             800 RESEARCH
ALLEN            1600 SALES
WARD             1250 SALES
JONES            2975 RESEARCH
MARTIN           1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING             5000 ACCOUNTING
TURNER           1500 SALES
ADAMS            1100 RESEARCH
JAMES             950 SALES
FORD             3000 RESEARCH
MILLER           1300 ACCOUNTING

已选择14行。
方式二:使用内连接
只返回满足连接条件的数据(两边都有的才显示)。也可以省略inner关键字。
SQL> select     e.ename, e.sal, d.dname
  2             from       emp e
  3             inner join dept d
  4             on e.deptno=d.deptno;

ENAME             SAL DNAME
---------- ---------- --------------
SMITH             800 RESEARCH
ALLEN            1600 SALES
WARD             1250 SALES
JONES            2975 RESEARCH
MARTIN           1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING             5000 ACCOUNTING
TURNER           1500 SALES
ADAMS            1100 RESEARCH
JAMES             950 SALES
FORD             3000 RESEARCH
MILLER           1300 ACCOUNTING

右外连接:右边边有值才显示。可以省略outer关键字   
  1  select e.ename,e.sal,d.dname
  2  from emp e
  3  right outer join dept d
  4* on e.deptno=d.deptno
SQL> /

ENAME             SAL DNAME
---------- ---------- --------------
CLARK            2450 ACCOUNTING
KING             5000 ACCOUNTING
MILLER           1300 ACCOUNTING
JONES            2975 RESEARCH
FORD             3000 RESEARCH
ADAMS            1100 RESEARCH
SMITH             800 RESEARCH
SCOTT            3000 RESEARCH
WARD             1250 SALES
TURNER           1500 SALES
ALLEN            1600 SALES
JAMES             950 SALES
BLAKE            2850 SALES
MARTIN           1250 SALES
                      OPERATIONS
已选择15行。

左外连接,左边有值的才显示,只需将上面sql的right改成left,可以省略outer关键字   

  1  select e.ename,e.sal,d.dname
  2  from emp e
  3  left outer join dept d
  4* on e.deptno=d.deptno
SQL> /

ENAME             SAL DNAME
---------- ---------- --------------
SMITH             800 RESEARCH
ALLEN            1600 SALES
WARD             1250 SALES
JONES            2975 RESEARCH
MARTIN           1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING             5000 ACCOUNTING
TURNER           1500 SALES
ADAMS            1100 RESEARCH
JAMES             950 SALES
FORD             3000 RESEARCH
MILLER           1300 ACCOUNTING

已选择14行。
   
操作同一张表的情况:

SQL> select     e.ename, e.sal, m.ename, m.sal
  2             from       emp e
  3             join       emp m
  4             on e.mgr=m.empno;

ENAME             SAL ENAME             SAL
---------- ---------- ---------- ----------
SMITH             800 FORD             3000
ALLEN            1600 BLAKE            2850
WARD             1250 BLAKE            2850
JONES            2975 KING             5000
MARTIN           1250 BLAKE            2850
BLAKE            2850 KING             5000
CLARK            2450 KING             5000
SCOTT            3000 JONES            2975
TURNER           1500 BLAKE            2850
ADAMS            1100 SCOTT            3000
JAMES             950 BLAKE            2850
FORD             3000 JONES            2975
MILLER           1300 CLARK            2450

已选择13行。
   
满外联接:任一边有值就会显示。outer可以省略

SQL> select     e.ename, e.sal, d.deptno, d.dname
  2             from       emp e
  3             full outer join  dept d
  4             on e.deptno=d.deptno;

ENAME             SAL     DEPTNO DNAME
---------- ---------- ---------- --------------
SMITH             800         20 RESEARCH
ALLEN            1600         30 SALES
WARD             1250         30 SALES
JONES            2975         20 RESEARCH
MARTIN           1250         30 SALES
BLAKE            2850         30 SALES
CLARK            2450         10 ACCOUNTING
SCOTT            3000         20 RESEARCH
KING             5000         10 ACCOUNTING
TURNER           1500         30 SALES
ADAMS            1100         20 RESEARCH
JAMES             950         30 SALES
FORD             3000         20 RESEARCH
MILLER           1300         10 ACCOUNTING
                              40 OPERATIONS   
交叉连接:叉集,就是笛卡尔积(很少用到,没有连接条件,使用cross join)
-- 没有连接条件,有许多的重复行:如果e有m行,d有n行,则结果集有m*n行
SQL> select e.empno,e.ename,e.sal,d.*
  2  from emp e
  3  cross join dept d;

     EMPNO ENAME             SAL     DEPTNO DNAME          LOC
---------- ---------- ---------- ---------- -------------- ---------
      7369 SMITH             800         10 ACCOUNTING     NEW YORK
      7499 ALLEN            1600         10 ACCOUNTING     NEW YORK
      7521 WARD             1250         10 ACCOUNTING     NEW YORK
      7566 JONES            2975         10 ACCOUNTING     NEW YORK
      7654 MARTIN           1250         10 ACCOUNTING     NEW YORK
      7698 BLAKE            2850         10 ACCOUNTING     NEW YORK
      7782 CLARK            2450         10 ACCOUNTING     NEW YORK
      7788 SCOTT            3000         10 ACCOUNTING     NEW YORK
      7839 KING             5000         10 ACCOUNTING     NEW YORK
      7844 TURNER           1500         10 ACCOUNTING     NEW YORK
      7876 ADAMS            1100         10 ACCOUNTING     NEW YORK
      7900 JAMES             950         10 ACCOUNTING     NEW YORK
      7902 FORD             3000         10 ACCOUNTING     NEW YORK
      7934 MILLER           1300         10 ACCOUNTING     NEW YORK
      7369 SMITH             800         20 RESEARCH       DALLAS
      7499 ALLEN            1600         20 RESEARCH       DALLAS
      7521 WARD             1250         20 RESEARCH       DALLAS
      7566 JONES            2975         20 RESEARCH       DALLAS
      7654 MARTIN           1250         20 RESEARCH       DALLAS
      7698 BLAKE            2850         20 RESEARCH       DALLAS
      7782 CLARK            2450         20 RESEARCH       DALLAS
      7788 SCOTT            3000         20 RESEARCH       DALLAS
      7839 KING             5000         20 RESEARCH       DALLAS
      7844 TURNER           1500         20 RESEARCH       DALLAS
      7876 ADAMS            1100         20 RESEARCH       DALLAS
      7900 JAMES             950         20 RESEARCH       DALLAS
      7902 FORD             3000         20 RESEARCH       DALLAS
      7934 MILLER           1300         20 RESEARCH       DALLAS
      7369 SMITH             800         30 SALES          CHICAGO
      7499 ALLEN            1600         30 SALES          CHICAGO
      7521 WARD             1250         30 SALES          CHICAGO
      7566 JONES            2975         30 SALES          CHICAGO
      7654 MARTIN           1250         30 SALES          CHICAGO
      7698 BLAKE            2850         30 SALES          CHICAGO
      7782 CLARK            2450         30 SALES          CHICAGO
      7788 SCOTT            3000         30 SALES          CHICAGO
      7839 KING             5000         30 SALES          CHICAGO
      7844 TURNER           1500         30 SALES          CHICAGO
      7876 ADAMS            1100         30 SALES          CHICAGO
      7900 JAMES             950         30 SALES          CHICAGO
      7902 FORD             3000         30 SALES          CHICAGO
      7934 MILLER           1300         30 SALES          CHICAGO
      7369 SMITH             800         40 OPERATIONS     BOSTON
      7499 ALLEN            1600         40 OPERATIONS     BOSTON
      7521 WARD             1250         40 OPERATIONS     BOSTON
      7566 JONES            2975         40 OPERATIONS     BOSTON
      7654 MARTIN           1250         40 OPERATIONS     BOSTON
      7698 BLAKE            2850         40 OPERATIONS     BOSTON
      7782 CLARK            2450         40 OPERATIONS     BOSTON
      7788 SCOTT            3000         40 OPERATIONS     BOSTON
      7839 KING             5000         40 OPERATIONS     BOSTON
      7844 TURNER           1500         40 OPERATIONS     BOSTON
      7876 ADAMS            1100         40 OPERATIONS     BOSTON
      7900 JAMES             950         40 OPERATIONS     BOSTON
      7902 FORD             3000         40 OPERATIONS     BOSTON
      7934 MILLER           1300         40 OPERATIONS     BOSTON

已选择56行。

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> select count(*) from dept;

  COUNT(*)
----------
         4

SQL>

16*4=56行,这就是笛卡尔积
==========================DMI控制语言===========================================

处理数据(DML,增删改)
    DML,Data Manipulation Language,数据操作语言
   
    插入数据(Insert into):
        插入全部列
        插入部分列
        插入空值   
  1  insert into emp
  2* values(1,'aa','manager',null,sysdate,9500,10000,10)
SQL> /

已创建 1 行。

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
         1 aa         manager              03-11月-13           9500      10000         10
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择15行。
使用 & 变量(创建脚本)

SQL> insert into emp(empno,ename,sal) values(&empno,&ename,&sal);
输入 empno 的值:  2
输入 ename 的值:  bb
输入 sal 的值:  3500
原值    1: insert into emp(empno,ename,sal) values(&empno,&ename,&sal)
新值    1: insert into emp(empno,ename,sal) values(2,bb,3500)
insert into emp(empno,ename,sal) values(2,bb,3500)
                                          *
第 1 行出现错误:
ORA-00984: 列在此处不允许


SQL> /
输入 empno 的值:  2
输入 ename 的值:  'bb'
输入 sal 的值:  3500
原值    1: insert into emp(empno,ename,sal) values(&empno,&ename,&sal)
新值    1: insert into emp(empno,ename,sal) values(2,'bb',3500)

已创建 1 行。

SQL> ed
已写入 file afiedt.buf

  1* insert into emp(empno,ename,sal) values(&empno,'&ename',&sal)
SQL> /
输入 empno 的值:  3
输入 ename 的值:  cc
输入 sal 的值:  5000
原值    1: insert into emp(empno,ename,sal) values(&empno,'&ename',&sal)
新值    1: insert into emp(empno,ename,sal) values(3,'cc',5000)

已创建 1 行。

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
         1 aa         manager              03-11月-13           9500      10000         10
         2 bb                                                   3500
         3 cc                                                   5000
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择17行。
使用变量进行查询
SQL> select empno,ename,&column from emp;
输入 column 的值:  sal
原值    1: select empno,ename,&column from emp
新值    1: select empno,ename,sal from emp

     EMPNO ENAME             SAL
---------- ---------- ----------
         1 aa               9500
         2 bb               3500
         3 cc               5000
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            1100
      7900 JAMES             950
      7902 FORD             3000
      7934 MILLER           1300

已选择17行。

SQL>

SQL>

    从其它表中拷贝数据
        insert into mytable
        select mycolums from ...

    更新数据(Update)

    删除数据(Delete)

SQL> delete from emp where empno<10;

已删除3行。

SQL>
    删除所有的记录:
        Delete
        Truncate
       
建表:
通过子查询进行创建表,并插入数据
SQL> create table emp10 as select * from emp where deptno=10;

表已创建。

SQL> select * from emp10;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

SQL> desc emp10;
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------
 EMPNO                                                                                        NUMBER(4)
 ENAME                                                                                        VARCHAR2(10)
 JOB                                                                                          VARCHAR2(9)
 MGR                                                                                          NUMBER(4)
 HIREDATE                                                                                     DATE
 SAL                                                                                          NUMBER(7,2)
 COMM                                                                                         NUMBER(7,2)
 DEPTNO                                                                                       NUMBER(2)

通过子查询插入数据:
注意,新表的数据结构和子查询表的结构要一致

SQL> insert into emp10 select * from emp where deptno=20;

已创建5行。

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择14行。
有这样的需求,新建的一个web网站,上线了,已有500多人注册了,现发现表结构设计不合理,这样,我们可以利用子查询进行创建新表,并把相应的数据导进来
例:在新表的结构中插入子查询的指定列
这里新的列匹配的是其数据类型
SQL> insert into emp10(empno,ename,sal) select empno,ename,sal from emp where deptno=30;

已创建6行。

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择14行。
更新:部门编号为空的更新为30

SQL> update emp10 set deptno=30  where deptno is null;

已更新6行。
删除
删除没有奖金的员工
SQL> delete from emp10 where comm is null;

已删除14行。


SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择14行。
SQL>

    事务:oracle中sql需要使用事务才会生产,例如delete.... commit(提交事务)
        事务是由完成若干项工作的DML语句组成的
        保存点
        设置事务隔离级别:
            SQL99标准是有4个隔离级别,但Oracle只支持2个:
            SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

执行外部的sql脚本文件:
    SQL> @c:/testdelete.sql
            SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
不显示命令执行的反馈信息
    set feedback off    不显示
    set feedback on        显示
统计sql执行的所使用的时间
SQL> set timing on      统计
SP2-0158: 未知的 SET 选项 "统计"
SQL> set feedback off
SQL> show feedback
feedback OFF
SQL> set feedback on
SQL> show feedback
用于 1 或更多行的 FEEDBACK ON

统计sql执行所使用时间
    set timing on    统计
    set timing off    不统计
SQL> set timing on
SQL> show timing
timing ON
SQL> set timing off
SQL> show timing
timing OFF
SQL>
commit提交事务
rollback回滚事务
oracle自动开启事务
exit:隐式退出
数据库事务操作略