zoukankan      html  css  js  c++  java
  • Oracle常见名词解析

    创建用户
    概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。
    create user 用户名 identified by 密码; (oracle有个毛病,密码必须以字母开头,如果不以字母开头,它不会创建用户)
    给用户修改密码
    概述:如果给自己修改密码可以直接使用
    password 用户名
    如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限
    SQL> alter user 用户名 identified by 新密码
    删除用户
    概述:一般以dba的身份去删除某个用户,如果用其它用户去删除用户则需要具有drop user的权限。
    比如 drop user 用户名 【cascade】
    在删除用户时,注意:
    如果要删除的用户,已经创建了表,那么就需要在删除的时候带一个参数cascade;

    数据类型
    字符类
    char    定长 最大2000个字符。
    例子:char(10)  ‘小韩’前四个字符放‘小韩’,后添6个空格补全 如‘小韩’
    varchar2(20)  变长  最大4000个字符。
    例子:varchar2(10) ‘小韩’ oracle分配四个字符。这样可以节省空间。
    clob(character large object) 字符型大对象 最大4G
    char 查询的速度极快浪费空间,查询比较多的数据用。
    varchar 节省空间
    数字型
    number范围 -10的38次方 到 10的38次方
    可以表示整数,也可以表示小数
    number(5,2)
    表示一位小数有5位有效数,2位小数
    范围:-999.99到999.99
    number(5)
    表示一个5位整数
    范围99999到-99999

    日期类型
    date 包含年月日和时分秒   oracle默认格式  1-1月-1999
    timestamp 这是oracle9i对date数据类型的扩展。可以精确到毫秒。
    图片
    blob 二进制数据 可以存放图片/声音  4G   一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。

    修改表
     添加一个字段

    SQL>ALTER TABLE student add (classId NUMBER(2));
    修改一个字段的长度
    SQL>ALTER TABLE student MODIFY (xm VARCHAR2(30));
    修改字段的类型/或是名字(不能有数据) 不建议做
    SQL>ALTER TABLE student modify (xm CHAR(30));
    删除一个字段  不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)
    SQL>ALTER TABLE student DROP COLUMN sal;
    添加数据
    所有字段都插入数据n
    INSERT INTO student VALUES ('A001', '张三', '男', '01-5月-05', 10);
    oracle中默认的日期格式‘dd-mon-yy’ dd日子(天) mon 月份  yy  2位的年  ‘09-6月-99’ 1999年6月9日
    修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)
    ALTER SESSION SET NLS_DATE_FORMAT ='yyyy-mm-dd';

    DELETE FROM student;
    删除所有记录,表结构还在,写日志,可以恢复的,速度慢。
    Delete 的数据可以恢复。
    savepoint a; --创建保存点
    DELETE FROM student;
    rollback to a;  --恢复到保存点
    一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。
    DROP TABLE student; --删除表的结构和数据;
    delete from student WHERE xh = 'A001'; --删除一条记录;
    truncate TABLE student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

     

    如果列里面有一个分组函数,其它的都必须是分组函数,

    group by 和 having子句n
    group by用于对查询的结果分组统计,
    having子句用于限制分组显示结果。
    1 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中)
    2 如果在select语句中同时包含有group by, having, order by 那么它们的顺序是group by, having, order by
    3 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则就会出错。
    (如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合)
    自连接

    在这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。  
    合并查询
    有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus
    多用于数据量比较大的数据局库,运行速度快。
    1). union
    该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。
    2).union all
    该操作符与union相似,但是它不会取消重复行,而且不会排序。
    3). intersect
      使用该操作符用于取得两个结果集的交集。
    4). minus
    使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。
    创建数据库有两种方法:
    1). 通过oracle提供的向导工具。√
       database Configuration Assistant  【数据库配置助手】
    2).我们可以用手工步骤直接创建。

    事务
    事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败。
    如:网上转账就是典型的要用事务来处理,用于保证数据的一致性。
    dml 数据操作语言
    银行转账、QQ申请、车票购买
     事务和锁n
    当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表的结构。这里对我们的用户来来讲是非常重要的。
    .....其它进程排序,知道1号进程完成,锁打开,2号进程进入。依次进行,如果有进程级别较高的,可以插队。
     提交事务
    当执行用commit语句可以提交事务。当执行了commit语句之后,会确认事务的变化、结束事务。删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到事务变化后的新数据。
    保存点就是为回退做的。保存点的个数没有限制
     回退事务
    在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存点是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点,
     事务的几个重要操作n
    1.设置保存点 savepoint a
    2.取消部分事务 rollback to a
    3.取消全部事务 rollback
    注意:这个回退事务,必须是没有commit前使用的;如果事务提交了,那么无论你刚才做了多少个保存点,都统统没有。
    如果没有手动执行commit,而是exit了,那么会自动提交

    只读事务n
    只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
     设置只读事务n
    set transaction read only;

    表空间
    表空间用于从逻辑上组织数据库的数据。数据库逻辑上是由一个或是多个表空间组成的。通过表空间可以达到以下作用:
    1. 控制数据库占用的磁盘空间
    2. dba可以将不同数据类型部署到不同的位置,这样有利于提高i/o性能,同时利于备份和恢复等管理操作。

    约束

    维护数据的完整性
    数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则,在oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。
    约束用于确保数据库数据满足特定的商业规则。在oracle中,约束包括:not null、 unique, primary key, foreign key,和check五种。

    索引
    索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o次数,从而提高数据访问性能。索引有很多种我们主要介绍常用的几种:
    为什么添加了索引后,会加快查询速度呢?
    创建索引
     单列索引
    单列索引是基于单个列所建立的索引,比如:
    create index 索引名 on 表名(列名);
     复合索引
    复合索引是基于两列或是多列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同,比如:
    create index emp_idx1 on emp (ename, job);
    create index emp_idx1 on emp (job, ename);
    使用原则
    1. 在大表上建立索引才有意义
    2. 在where子句或是连接条件上经常引用的列上建立索引
    3. 索引的层次不要超过4层
    这里能不能给学生演示这个效果呢?
    如何构建一个大表呢?
    索引的缺点
    索引有一些先天不足:
    1. 建立索引,系统要占用大约为表1.2倍的硬盘和内存空间来保存索引。
    2. 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。
    实践表明,不恰当的索引不但于事无补,反而会降低系统性能。因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间。
    比如在如下字段建立索引应该是不恰当的:
    1. 很少或从不引用的字段;
    2. 逻辑型的字段,如男或女(是或否)等。
    综上所述,提高查询效率是以消耗一定的系统资源为代价的,索引不能盲目的建立,这是考验一个DBA是否优秀的很重要的指标。
    权限
    权限是指执行特定类型sql命令或是访问其它方案对象的权利,包括系统权限和对象权限两种。

    角色
    角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理,

    过程
    过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out), 通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在sqlplus中可以使用create procedure命令来建立过程。
    create procedure sp_pro3(spName varchar2, newSal number) is
    --不要写成number(3,2),表明类型就可以了,不需要大小。就好像Java写方法时的参数一样

    Sql代码

    1. begin  
    2.   --执行部分,根据用户名去修改工资   
    3. update emp set sal=newSal where ename=spName;   
    4. end;   
    5. /  begin  --执行部分,根据用户名去修改工资

    update emp set sal=newSal where ename=spName;

    end;

    /

        public static void main(String[] args){

           

            try{

                //1.加载驱动

                Class.forName("oracle.jdbc.driver.OracleDriver");

                //2.得到连接

                Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");

     

                //3.创建CallableStatement

                CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");

                //4.给?赋值

                cs.setString(1,"SMITH");

                cs.setInt(2,10);

                //5.执行

                cs.execute();

                //关闭

                cs.close();

                ct.close();

            } catch(Exception e){

                e.printStackTrace();

            }

        }

    }


     
    函数
      函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句。而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例:

    Sql代码

    1. --输入雇员的姓名,返回该雇员的年薪   
    2. create function annual_incomec(name varchar2)   
    3. return number is  
    4. annual_salazy number(7,2);   
    5. begin  
    6.     --执行部分   
    7.     select sal*12+nvl(comm, 0) into annual_salazy from emp where ename=name;   
    8.     return annual_salazy;   
    9. end;   
    10. /  

    --输入雇员的姓名,返回该雇员的年薪

    create function annual_incomec(name varchar2)

    return number is

    annual_salazy number(7,2);

    begin

        --执行部分

        select sal*12+nvl(comm, 0) into annual_salazy from emp where ename=name;

        return annual_salazy;

    end;

    /

    如果函数创建过程有编译错误,可以使用show error;命令显示错误
    在sqlplus中调用函数

    Sql代码

    1. SQL> var income number   
    2. SQL> call annual_incomec('scott') into: income;   
    3. SQL> print income  

    SQL> var income number

    SQL> call annual_incomec('scott') into: income;

    SQL> print income


    同样我们可以在java程序中调用该函数
    select annual_income('SCOTT') from dual;
    这样可以通过rs.getInt(l)得到返回的结果。
    触发器
      触发器是指隐含的执行的存储过程。当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块。可以使用create trigger来建立触发器。
    特别说明:
    我们会在后面详细为大家介绍触发器的使用,因为触发器是非常有用的,可维护数据库的安全和一致性。

    declare

      c_tax_rate number(3,2):=0.03;

      --用户名

      v_ename varchar2(5);

      v_sal number(7,2);

      v_tax_sal number(7,2);

    begin

    --执行

        select ename,sal into v_ename,v_sal from emp where empno=&no;

    --计算所得税

        v_tax_sal := v_sal*c_tax_rate;

    --输出

        dbms_output.put_line('姓名是:'||v_ename||'工资:'||v_sal||' 交税:'||v_tax_sal);

    end;

    /

    视图
    视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图不是真实存在磁盘上的)
    视图与表的区别
     视图与表的区别n
    1.表需要占用磁盘空间,视图不需要
    2.视图不能添加索引(所以查询速度略微慢点)
    3.使用视图可以简化,复杂查询
    比如:学生选课系统
    4.视图的使用利于提高安全性
    比如:不同用户查看不同视图
    创建/修改视图
     创建视图n
    create view 视图名 as select 语句 [with read only]
     创建或修改视图n
    create or replace view 视图名 as select 语句 [with read only]
     删除视图n
    drop view 视图名
    当表结构过于复杂,请使用视图吧!
    --创建视图,把emp表的sal<1000的雇员映射到该视图(view)

    Sql代码

    1. create view myview as select * from emp where sal<1000; create view myview as select * from emp where sal<1000;
      --为简化操作,用一个视图解决 显示雇员编号,姓名和部门名称

    Sql代码

    1. create view myview2 as select emp.empno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;  

    create view myview2 as select emp.empno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;

    视图之间也可以做联合查询

  • 相关阅读:
    Linux下对拍(A+B问题)
    洛谷 P1043 数字游戏 区间DP
    6.22 集训--DP复习一
    洛谷 P1220 关路灯 区间DP
    A*算法求K短路模板 POJ 2449
    点分治模板 POJ 1741
    HDU
    棋子游戏 51Nod
    数论习题总结
    CodeForces
  • 原文地址:https://www.cnblogs.com/greatfish/p/6043295.html
Copyright © 2011-2022 走看看