oracle基础笔记

前端之家收集整理的这篇文章主要介绍了oracle基础笔记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1@H_404_3@. 表空间
    -- 创建普通表空间
    create@H_404_3@ tablespace my_tbsp
    datafile 'E:/app/Administrator/product/11.2.0/dbhome_1/oradata/sample/my_tbsp.dbf'@H_404_3@
    size 20@H_404_3@M
    autoextend on@H_404_3@  
    next 50@H_404_3@m maxsize 20480@H_404_3@m  
    extent management local;

    -- 创建临时表空间
    create@H_404_3@ temporary tablespace my_temp
    tempfile 'E:/app/Administrator/product/11.2.0/dbhome_1/oradata/sample/my_temp.dbf'@H_404_3@
    size 20@H_404_3@M
    autoextend on@H_404_3@  
    next 50@H_404_3@m maxsize 20480@H_404_3@m  
    extent management local;

    -- 查看所有的表空间
    select@H_404_3@ * from@H_404_3@ user_tablespaces;

    -- 删除表空间
    drop tablespace my_tbsp;
    drop tablespace my_temp;

2@H_404_3@. 用户
   -- 创建用户
   create@H_404_3@ user zhangsan
   identified by@H_404_3@ abc123
   default@H_404_3@ tablespace my_tbsp
   temporary tablespace my_temp;
   -- 修改用户密码
   alter user lisi identified by@H_404_3@ abcdefg;
   -- 删除用户
   drop user lisi;
   -- 删除用户(级联删除用户的数据)
   drop user lisi cascade;

   -- 查看用户
   select@H_404_3@ * from@H_404_3@ user_users;

4@H_404_3@. 权限和角色
   -- 授予权限
   grant create@H_404_3@ session to@H_404_3@ zhangsan;
   grant create@H_404_3@ user to@H_404_3@ zhangsan;
   grant create@H_404_3@ table to@H_404_3@ zhangsan;
   -- 撤销权限
   revoke create@H_404_3@ user from@H_404_3@ zhangsan;

   -- 角色: connect,resource,dba
   grant connect,resource to@H_404_3@ lisi;
   -- 撤销角色
   revoke resource from@H_404_3@ lisi;

5@H_404_3@. 数据库语言
   DDL: 数据库模式定义语言(Data Definition Language)
        create@H_404_3@,alter,drop,truncate
   DML: 数据操纵语言(Data Manipulation Language)
        insert,update,delete
   DQL: 数据查询语言(Data QueryLanguage)
        select@H_404_3@
   TCL: 事务控制语言(Transaction Control Language)
        commit,rollback,savepoint
   DCL: 数据控制语言(Data Control Language)
        grant,revoke

6@H_404_3@. 数据库类型
   6.1@H_404_3@ 字符型
       char: 定长字符,如果添加的值不足则会补齐空格,最多2000@H_404_3@个字节
       varchar2: 可变长字符,最多4000@H_404_3@个字节
       long: 可变长字符,最多2@H_404_3@G
   6.2@H_404_3@ 数值型
       number(8@H_404_3@,2@H_404_3@) 8@H_404_3@: 最多8@H_404_3@位,2@H_404_3@:接受最多两位小数(如果有小数,整数范围就要减去小数位)
                   整数位只能最多6@H_404_3@位,小数位最多2@H_404_3@位
   6.4@H_404_3@ 日期时间
       date: 存储日期和时间部分,精确到整个的秒
       timestamp: 存储日期、时间和时区信息,秒值精确到小数点后6@H_404_3@位

   6.5@H_404_3@ RAW
       raw: 存储2@H_404_3@进制数据,最多2000@H_404_3@字节
       long raw: 存储2@H_404_3@进制数据,最多2@H_404_3@G

   6.6@H_404_3@ LOB
       BLOB: 2@H_404_3@进制大字段,最多4@H_404_3@G
       CLOB: 字符字符大字段,最多4@H_404_3@G
       NCLOB: Unicode字符大字段,最多4@H_404_3@G
       BFILE: 外部文件大字段

   6.7@H_404_3@ 伪列
       rowid: 是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用 ROWID 伪列快速地定位表中的一行
       rownum 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数


7@H_404_3@. 表
   7.1@H_404_3@ 创建表
       create@H_404_3@ table t_user (
            id varchar2(36@H_404_3@) primary key,id_card char(18@H_404_3@) not@H_404_3@ null unique,name varchar2(20@H_404_3@) default@H_404_3@ 'hehehe'@H_404_3@,price number(4@H_404_3@,2@H_404_3@) default@H_404_3@ 3.1415@H_404_3@,birthday date default@H_404_3@ sysdate
       );
       create@H_404_3@ table t_department(
              id varchar2(36@H_404_3@) primary key,name varchar2(40@H_404_3@)
       );

       alter table t_user add@H_404_3@ depart_id varchar2(36@H_404_3@);

       primary key 主键(唯一,不为空)
       not@H_404_3@ null 不能为空
       unique 唯一
       default@H_404_3@ 设置默认值
       sysdate 表示系统当前时间
       ** oracle中没有自增长(auto increment),oracle中需要依赖sequence@H_404_3@来实现自增长
   7.2@H_404_3@ 删除表
       drop table t_user;
   7.3@H_404_3@ 修改表结构
       -- 添加列
       alter table t_user add@H_404_3@ gender varchar2(6@H_404_3@) default@H_404_3@ '男'@H_404_3@;
       -- 删除列
       alter table t_user drop column price;
       -- 修改列
       alter table t_user modify gender char(6@H_404_3@) default@H_404_3@ 'female'@H_404_3@;


   7.4@H_404_3@ 外键约束

       -- 创建外键约束
       alter table t_user 
       add@H_404_3@ constraint fk_user_department
       foreign key(depart_id)
       references t_department(id);
       -- 删除外键约束
       alter table t_user drop constraint fk_user_department; 


----------
1@H_404_3@. DDL清空表
   truncate table bonus; 
2@H_404_3@. DML
   2.1@H_404_3@. 添加数据
   insert into@H_404_3@
        insert into@H_404_3@ dept(deptno,dname) 
        values(60@H_404_3@,'财务部'@H_404_3@);
        insert into@H_404_3@ dept(deptno,dname) values(50@H_404_3@,'技术部'@H_404_3@);
        commit;
        -- 新增所有列数据
        insert into@H_404_3@ dept values(70@H_404_3@,'财务部'@H_404_3@,'财务'@H_404_3@);
   2.2@H_404_3@. 修改数据
   update
        update dept
        set@H_404_3@
               loc = '深圳'@H_404_3@
        where@H_404_3@
               deptno = 50@H_404_3@;
   2.3@H_404_3@. 删除数据
   delete
        delete from@H_404_3@ dept where@H_404_3@ deptno = 50@H_404_3@ or@H_404_3@ deptno = 60@H_404_3@;
      -- 删除所有
        delete from@H_404_3@ dept;
     ** delete 和 truncate 清空表时有什么区别?
        delete删除的数据会保存到回滚段,可以被回滚,效率低.
        truncate直接删除数据不可以回滚,效率高.
        清空表通常使用truncate.

3@H_404_3@. 事务
    事务指一组针对数据库操作的命令集合,事务是一个原子操作,不可拆分,必须同时成功或者是同时失败.
   四大特性
   3.1@H_404_3@ 原子性: 事务时一个原子才做,事务中的操作同时成功或者同时失败
   3.2@H_404_3@ 一致性: 事务操作之前和之后的数据要保持一致
   3.3@H_404_3@ 隔离性: 事务之间互不影响,互相并不知道其他事务的存在
   3.4@H_404_3@ 持久性: 事务操作之后,数据应当永久保存

4@H_404_3@. create@H_404_3@ as@H_404_3@(根据查询结果创建表,并将查询到的数据添加到表中)
   create@H_404_3@ table t_employee
   as@H_404_3@
   select@H_404_3@ ename,job,sal from@H_404_3@ emp where@H_404_3@ deptno = 10@H_404_3@;

5@H_404_3@. insert [as@H_404_3@](将全部查询到的数据添加到指定表中,不要as@H_404_3@关键字)
   insert into@H_404_3@ bonus select@H_404_3@ * from@H_404_3@ t_temp;

   如何快速去除表中的重复数据
   -- copy@H_404_3@一个临时表
   create@H_404_3@ table t_temp as@H_404_3@ select@H_404_3@ distinct@H_404_3@ * from@H_404_3@ bonus;
   -- 清空原表
   truncate table bonus;
   -- 将临时数据导入原表
   insert into@H_404_3@ bonus select@H_404_3@ * from@H_404_3@ t_temp;
   commit;
   drop table t_temp;

6@H_404_3@. 简单查询 select@H_404_3@
   6.1@H_404_3@ 单表查询
        select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ sal >= (select@H_404_3@ max(sal) from@H_404_3@ emp)
       -- * 查询所有列
       select@H_404_3@ * from@H_404_3@ emp;
       -- 查询指定列
       select@H_404_3@ ename,sal from@H_404_3@ emp;
       -- 去重复
       select@H_404_3@ distinct@H_404_3@  job,mgr from@H_404_3@ emp;
       -- 起别名
       select@H_404_3@ 
          e.ename 姓名,e.sal 工资 
       from@H_404_3@ 
          emp e
       -- 单条件
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ sal < 3000@H_404_3@
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ comm is@H_404_3@ not@H_404_3@ null
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ comm is@H_404_3@ null
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename = 'SCOTT'@H_404_3@
       ** 
          =:  等于
          <> != ^=:  不等于(通常用<>)
          in@H_404_3@: 多值匹配(匹配in@H_404_3@中的列表值) select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ empno in@H_404_3@ (7369@H_404_3@,7788@H_404_3@,7934@H_404_3@)
          not@H_404_3@ in@H_404_3@:
          between and@H_404_3@: select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ sal between 1100@H_404_3@ and@H_404_3@ 2000@H_404_3@ (相当于 sal >= 1100@H_404_3@ and@H_404_3@ sal <= 2000@H_404_3@)
          not@H_404_3@ between:
          is@H_404_3@ null:
          is@H_404_3@ not@H_404_3@ null:
          like: 模式匹配,只能用于字符串(%表示任意个任意字符,_表示一个任意字符)
                select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename like 'MAR%'@H_404_3@
                select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename like '%S'@H_404_3@
                select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename like '%A%'@H_404_3@
                select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename like 'A____'@H_404_3@
           not@H_404_3@ like:

       -- 多条件(and@H_404_3@)
       select@H_404_3@ 
          * 
       from@H_404_3@ 
          emp 
       where@H_404_3@ 
          comm is@H_404_3@ not@H_404_3@ null 
          and@H_404_3@ 
          comm > 0@H_404_3@
       -- 排序
       select@H_404_3@ * from@H_404_3@ emp order@H_404_3@ by@H_404_3@ sal asc@H_404_3@  -- 升序
       select@H_404_3@ * from@H_404_3@ emp order@H_404_3@ by@H_404_3@ sal desc@H_404_3@ -- 降序
       -- 多列组合排序
       select@H_404_3@ * 
       from@H_404_3@ emp 
       order@H_404_3@ by@H_404_3@ 
             sal desc@H_404_3@,comm desc@H_404_3@

       -- 分组查询
          select@H_404_3@
             job,sum(sal),max(sal),min(sal),avg(sal),count(empno),count(comm)
          from@H_404_3@
             emp
          group@H_404_3@ by@H_404_3@
             job
          having
             avg(sal) > 1500@H_404_3@
       -- 聚合函数
          sum()   求和(对当前组的所有值进行求和)
          max()   取最大值
          min()   取最小值
          avg()   取平均值
          count() 求有效值数,通常用于求记录数
      -- 在oracle中用count查询记录数时,通常使用一个常量值,如:1@H_404_3@ 而不是用*或者是列值,效率高
        select@H_404_3@ job,count(1@H_404_3@)
        from@H_404_3@ emp
        group@H_404_3@ by@H_404_3@ job

7@H_404_3@. 日期时间处理
        create@H_404_3@ table t_user (
               id varchar2(50@H_404_3@) primary key,name varchar2(20@H_404_3@),birthday date
        )
       to_date(将字符串转日期)
       insert into@H_404_3@ t_user values('10001'@H_404_3@,'zhangsan'@H_404_3@,sysdate);
       insert into@H_404_3@ t_user values('10002'@H_404_3@,to_date('1992-09-15'@H_404_3@,'YYYY-MM-DD'@H_404_3@));
       insert into@H_404_3@ t_user values('10003'@H_404_3@,to_date('1992-09-15 18:30:20'@H_404_3@,'YYYY-MM-DD HH24:MI:SS'@H_404_3@));

       to_char(将日期转字符串)
       select@H_404_3@ id,name,to_char(birthday,'YYYY/MM/DD HH24:MI:SS'@H_404_3@) from@H_404_3@ t_user
8@H_404_3@. 虚表dual
   select@H_404_3@ sysdate from@H_404_3@ dual;
   select@H_404_3@ 20@H_404_3@+30@H_404_3@ from@H_404_3@ dual;


----------
1@H_404_3@. 集合操作
  1.1@H_404_3@ union@H_404_3@(合并查询结果,并集,会去重复)
    select@H_404_3@ ename,sal,deptno from@H_404_3@ emp where@H_404_3@ sal > 2000@H_404_3@
    union@H_404_3@
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ deptno = 20@H_404_3@

  1.2@H_404_3@ union@H_404_3@ all(并集,不会去重复)
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ sal > 2000@H_404_3@
    union@H_404_3@ all
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ deptno = 20@H_404_3@

  1.3@H_404_3@ intersect(求交集)
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ sal > 2000@H_404_3@
    intersect
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ deptno = 20@H_404_3@

  1.3@H_404_3@ minus(返回从第一个查询结果中排除第二个查询中出现的行。)
    select@H_404_3@ ename,deptno from@H_404_3@ emp where@H_404_3@ sal > 2000@H_404_3@
    minus
    selec ename,deptno from@H_404_3@ emp where@H_404_3@ deptno = 20@H_404_3@

2@H_404_3@. 连接操作
   在oracle中使用||来连接两个字符串
   select@H_404_3@ ename || '('@H_404_3@ || sal || ')'@H_404_3@ es from@H_404_3@ emp;
   操作符优先级: 
           ()
            大于
          运算符(+-*/) 
            大于
          连接符(||) 
            大于
          比较运算(=,!=,<>,^=,>,<,>=,<=,is@H_404_3@ null,like,is@H_404_3@ not@H_404_3@ null,not@H_404_3@ like,between .. and@H_404_3@,not@H_404_3@ between .. and@H_404_3@)
            大于
           not@H_404_3@ 
            大于
           and@H_404_3@
            大于
            or@H_404_3@
3@H_404_3@. 常用函数
   3.1@H_404_3@ 日期函数
       add_months
       last_day
       months_between
       next_day
       round
       trunc: 从指定位置处截断 select@H_404_3@ trunc(sysdate,'yyyy'@H_404_3@) from@H_404_3@ dual
       extract

   3.2@H_404_3@ 字符函数
       3.2@H_404_3@.1@H_404_3@ TRIM
           select@H_404_3@ ltrim('abababababbbbbbbabababab'@H_404_3@,'ab'@H_404_3@) from@H_404_3@ dual;
           select@H_404_3@ rtrim('ababababccccababab'@H_404_3@,'ab'@H_404_3@) from@H_404_3@ dual;
           select@H_404_3@ rtrim(ltrim( 'abababcccccababab'@H_404_3@,'ab'@H_404_3@),'ab'@H_404_3@) from@H_404_3@ dual;

       3.2@H_404_3@.2@H_404_3@ translate & replace
           -- 字符一对一替换
           select@H_404_3@ translate('hehehehehehehhe'@H_404_3@,'h'@H_404_3@,'lol'@H_404_3@) from@H_404_3@ dual;
           -- 整串替换
           select@H_404_3@ replace('hehehhehehehehhehehe'@H_404_3@,'he'@H_404_3@,'lol'@H_404_3@) from@H_404_3@ dual;
       3.2@H_404_3@.3@H_404_3@ instr: 相当于indexOf,从1@H_404_3@开始
       3.2@H_404_3@.4@H_404_3@ substr
       3.2@H_404_3@.5@H_404_3@ Concat@H_404_3@ 
       3.2@H_404_3@.6@H_404_3@ upper lower
       3.2@H_404_3@.7@H_404_3@ initcap 首字母大写
       3.2@H_404_3@.8@H_404_3@ length: select@H_404_3@ length('heheh'@H_404_3@) from@H_404_3@ dual;
       3.2@H_404_3@.9@H_404_3@ decode: 条件匹配函数,相当于switch
             select@H_404_3@
                     ename,decode(job,'ANALYST'@H_404_3@,'分析师'@H_404_3@,'CLERK'@H_404_3@,'职员'@H_404_3@,'SALESMAN'@H_404_3@,'销售员'@H_404_3@,job
                            )
             from@H_404_3@ emp

   3.3@H_404_3@ 数字函数
      ...
   3.4@H_404_3@ 转换函数
       to_char
       to_date
       to_number
   3.5@H_404_3@ 其他函数
       nvl: 如果值为null则显示为指定值
          select@H_404_3@ ename,nvl(comm,0@H_404_3@) from@H_404_3@ emp
       nvl2: 如果值不为空则取第二个参数,如果为空则取第三个参数
          select@H_404_3@ ename,comm,nvl2(comm,100@H_404_3@,0@H_404_3@) from@H_404_3@ emp
       nullif: 如果两个值相同,则为null,否则取第一个参数
          select@H_404_3@ nullif('aa'@H_404_3@,'aa'@H_404_3@) from@H_404_3@ dual

   3.6@H_404_3@ 分析函数
       row_number: 连续排位
           select@H_404_3@ 
                  ename,row_number() over(order@H_404_3@ by@H_404_3@ sal desc@H_404_3@,comm asc@H_404_3@)
           from@H_404_3@ emp

      rank: 等值同名,会跳跃
         select@H_404_3@ 
                ename,rank() over(order@H_404_3@ by@H_404_3@ sal desc@H_404_3@)
         from@H_404_3@ emp

     dense_rank: 等值同名,不会跳跃
         select@H_404_3@ 
                ename,dense_rank() over(order@H_404_3@ by@H_404_3@ sal desc@H_404_3@)
         from@H_404_3@ emp

4@H_404_3@. 子查询
    -- 条件时使用子查询
    select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ deptno in@H_404_3@ (select@H_404_3@ deptno from@H_404_3@ dept where@H_404_3@ dname in@H_404_3@ ('SALES'@H_404_3@,'RESEARCH'@H_404_3@))
    -- 子查询为临时表
    select@H_404_3@ 
          * 
    from@H_404_3@ 
         (select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ sal > 2000@H_404_3@) t_temp
    where@H_404_3@
         t_temp.deptno = 20@H_404_3@

    -- 查询列上使用子查询
    select@H_404_3@
       ename,(select@H_404_3@ dname from@H_404_3@ dept d where@H_404_3@ d.deptno = e.deptno) dname
    from@H_404_3@ 
       emp e

5@H_404_3@. 连接查询
    *****select@H_404_3@ e1.ename,e2.ename from@H_404_3@ emp e1,emp e2 where@H_404_3@ e1.mgr = e2.empno(+); 左连接
    select@H_404_3@ e1.ename,emp e2,dept d where@H_404_3@ e1.mgr = e2.empno(+) and@H_404_3@ e1.DEPTNO = d.DEPTNO and@H_404_3@ e1.ename='SCOTT'@H_404_3@;
    *****select@H_404_3@ e1.ename,e2.ename from@H_404_3@ emp e1 left join@H_404_3@ emp e2 on@H_404_3@ e1.mgr = e2.empno;
   5.1@H_404_3@ 左外连接,以左边表为基准,左边表所有数据都需要被显示
     select@H_404_3@
         e.ename,d.dname
     from@H_404_3@
         emp e left join@H_404_3@ dept d
         on@H_404_3@
         e.deptno = d.deptno
   5.2@H_404_3@ 右外连接,以右边表为基准,右边表所有数据都要被显示
    select@H_404_3@
         e.ename,d.dname
     from@H_404_3@
         emp e right join@H_404_3@ dept d
         on@H_404_3@
         e.deptno = d.deptno
   5.3@H_404_3@ 全连接,两边表的数据都要显示
     select@H_404_3@
         e.ename,d.dname
     from@H_404_3@
         emp e full join@H_404_3@ dept d
         on@H_404_3@
         e.deptno = d.deptno
   5.4@H_404_3@ 内连接,只显示两边对应的数据
     内连接1@H_404_3@:
     select@H_404_3@
         e.ename,d.dname
     from@H_404_3@
         emp e inner join@H_404_3@ dept d
         on@H_404_3@
         e.deptno = d.deptno
     内连接2@H_404_3@(多表联查):
     select@H_404_3@
         e.ename,d.dname
     from@H_404_3@
         emp e,dept d
     where@H_404_3@
         e.deptno = d.deptno

   5.5@H_404_3@ 自关联
        select@H_404_3@
           e.ename name,m.ename mgr
        from@H_404_3@
               emp e,emp m
        where@H_404_3@
               m.empno = e.mgr

    select@H_404_3@
               e.ename name,m.ename mgr
        from@H_404_3@
               emp e left outer join@H_404_3@ emp m
               on@H_404_3@ m.empno = e.mgr

6@H_404_3@. exists: 当子查询查询到数据时,外层sql的当前数据将被查询出来
    select@H_404_3@ * from@H_404_3@ emp e where@H_404_3@ sal > 1000@H_404_3@ and@H_404_3@ exists(select@H_404_3@ 1@H_404_3@ from@H_404_3@ dept d where@H_404_3@ d.deptno = e.deptno and@H_404_3@ d.dname='ACCOUNTING'@H_404_3@ )

   not@H_404_3@ exists:
    select@H_404_3@ * from@H_404_3@ emp e where@H_404_3@ sal > 1000@H_404_3@ and@H_404_3@ not@H_404_3@ exists(select@H_404_3@ 1@H_404_3@ from@H_404_3@ dept d where@H_404_3@ d.deptno = e.deptno and@H_404_3@ d.dname='ACCOUNTING'@H_404_3@ )

7@H_404_3@. case@H_404_3@ ... when ... then@H_404_3@ ... end@H_404_3@; 
   用法一:
   select@H_404_3@
        ename,(case@H_404_3@ job
          when 'CTO'@H_404_3@ then@H_404_3@ '首席技术官'@H_404_3@
          when 'MANAGER'@H_404_3@ then@H_404_3@ '网管'@H_404_3@
          when 'SBO'@H_404_3@ then@H_404_3@ '呵呵'@H_404_3@
          else@H_404_3@ '其他'@H_404_3@
        end@H_404_3@) job
   from@H_404_3@
        emp

   用法二:
   select@H_404_3@
        ename,(case@H_404_3@ 
            when (sal > 5000@H_404_3@ and@H_404_3@ comm is@H_404_3@ not@H_404_3@ null) then@H_404_3@ '土豪'@H_404_3@
            when sal > 3000@H_404_3@ then@H_404_3@ '高富帅'@H_404_3@
            when sal > 2000@H_404_3@ then@H_404_3@ '中产阶级'@H_404_3@
            when sal > 1000@H_404_3@ then@H_404_3@ '贫下中农'@H_404_3@
            else@H_404_3@ '低调'@H_404_3@
        end@H_404_3@) pt
   from@H_404_3@
        emp

  行变列
  select@H_404_3@ * from@H_404_3@ t_score
  select@H_404_3@
         name,sum((case@H_404_3@ course when '语文'@H_404_3@ then@H_404_3@ score else@H_404_3@ 0@H_404_3@ end@H_404_3@ )) 语文,sum((case@H_404_3@ course when '数学'@H_404_3@ then@H_404_3@ score else@H_404_3@ 0@H_404_3@ end@H_404_3@ )) 数学,sum((case@H_404_3@ course when '英语'@H_404_3@ then@H_404_3@ score else@H_404_3@ 0@H_404_3@ end@H_404_3@ )) 英语
   from@H_404_3@ t_score
   group@H_404_3@ by@H_404_3@ name


----------
1@H_404_3@. 同义词
   为现有对象创建一个别名(简化sql,隐藏对象原有名称)
   私有
   create@H_404_3@ synonym sy_xxx for@H_404_3@ emp;
   需要权限
   grant create@H_404_3@ synonym to@H_404_3@ scott;
   其他用户使用需要权限
   grant select@H_404_3@ on@H_404_3@ emp to@H_404_3@ zhangsan;

   公有
   create@H_404_3@ public@H_404_3@ synonym sy_xxx for@H_404_3@ emp;

   删除
   drop synonym sy_xxx;
   drop public@H_404_3@ synonym emp_syn; 
    一般resource角色中没有创建同义词的权限,需要重新赋权限。

2@H_404_3@. 序列
   drop sequence@H_404_3@ seq_test;
   -- 创建序列
   create@H_404_3@ sequence@H_404_3@ seq_test
   start with@H_404_3@ 10@H_404_3@
   increment by@H_404_3@ 100000000@H_404_3@
   --maxvalue 99@H_404_3@   
   nomaxvalue
   -- minvalue 0@H_404_3@    
   nominvalue
   -- cycle         
   nocycle
   cache 20@H_404_3@     -- nocache
   ;

   -- seq_test.nextval(取出并生成下一个值)
   select@H_404_3@ seq_test.nextval from@H_404_3@ dual;
   -- seq_test.currval(取出当前值,不生成下一个值)
   select@H_404_3@ seq_test.currval from@H_404_3@ dual;

   create@H_404_3@ table t_employee(
          id number(8@H_404_3@) primary key,name varchar2(20@H_404_3@)
   );

   -- 添加数据时使用
   insert into@H_404_3@ t_employee(id,name) values(seq_test.nextval,'小明'@H_404_3@);
   select@H_404_3@ * from@H_404_3@ t_employee;
   -- 修改序列
   alter sequence@H_404_3@ seq_test 
   increment by@H_404_3@ 1@H_404_3@ 
   maxvalue 200000000000000000@H_404_3@ 
   nominvalue 
   nocycle 
   nocache;
   -- 删除序列
   drop sequence@H_404_3@ seq_test;

3@H_404_3@. 视图(存储查询语句并起别名,将复杂sql简化)
   create@H_404_3@ or@H_404_3@ replace force view v_e as@H_404_3@
    select@H_404_3@
        e1.empno,e1.ename,e2.ename mgr,d.dname
      from@H_404_3@
         emp e1,dept d
      where@H_404_3@
         e2.empno = e1.mgr
         and@H_404_3@
         d.deptno = e1.deptno;

    -- 查询使用视图
    select@H_404_3@ * from@H_404_3@ v_e t;

4@H_404_3@. 索引
   在逻辑和物理上都独立于表一种映射结构.
   提高sql执行效率,减少磁盘I/O
   4.1@H_404_3@ 一般索引(当查询条件中出现索引列时,会使用该索引)
       create@H_404_3@ index@H_404_3@ idx_ename on@H_404_3@ emp(ename);

   4.2@H_404_3@ 组合索引(如果条件少于索引列数,将不会被使用)
       create@H_404_3@ index@H_404_3@ idx_name_job on@H_404_3@ emp(ename,job);
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ ename = 'SCOTT'@H_404_3@ and@H_404_3@ job = 'SALESMAN'@H_404_3@

   4.3@H_404_3@ 函数索引(在列上使用函数时将使用该索引)
       create@H_404_3@ index@H_404_3@ indx_lower_ename on@H_404_3@ emp(lower(ename));
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ lower(ename) = 'scott'@H_404_3@;

   4.4@H_404_3@ 唯一索引(要求被索引列必须值唯一,主键自带唯一索引)
       create@H_404_3@ unique index@H_404_3@ idx_unique_dname on@H_404_3@ dept(dname);
       insert into@H_404_3@ dept(deptno,dname,loc) values(50@H_404_3@,'xiaoshou'@H_404_3@,'沙坪坝'@H_404_3@);
       select@H_404_3@ * from@H_404_3@ dept where@H_404_3@ dname = 'xiaoshou'@H_404_3@

   4.5@H_404_3@ 位图索引(适合用于低基数列,不直接索引rowid,索引列值到rowid的映射)
       create@H_404_3@ bitmap index@H_404_3@ idx_bmjob on@H_404_3@ emp(job);
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ job = 'CLERK'@H_404_3@

   4.6@H_404_3@ 反向键索引(反转索引列的每个字节,适合用在连续增长列上)
       create@H_404_3@ index@H_404_3@ idx_reverse_mgr on@H_404_3@ emp(mgr) reverse@H_404_3@;
       select@H_404_3@ * from@H_404_3@ emp where@H_404_3@ mgr = '7788'@H_404_3@;

   4.7@H_404_3@ 索引组织表 
       create@H_404_3@ table t_user (
              id varchar2(50@H_404_3@) primary key,name varchar2(20@H_404_3@)
       ) organization index@H_404_3@;

   合理创建索引才能给查询带来好处,如果索引不合理反而会使效率降低
   在索引列上使用like,不等于(<>),is@H_404_3@ null/is@H_404_3@ not@H_404_3@ null,使用函数(如果该列创建了对应的函数索引除外),比较类型不匹配都不会使用到索引.
@H_133_1403@

猜你在找的Oracle相关文章