黑马程序员技术交流社区

标题: 【石家庄校区】就业班_JavaEE_day32_35_Oracle [打印本页]

作者: 风中的消逝    时间: 2018-6-16 11:42
标题: 【石家庄校区】就业班_JavaEE_day32_35_Oracle
本帖最后由 小石姐姐 于 2018-6-21 16:11 编辑

就业班_JavaEE_day32_35_Oracle


一  分布式和集群的区别:
         分布式指的是将一个应用拆分成多个模块,每个模块部署在一台机器上对外提供服务。
         集群指的是将一个应用复制多份 部署在多台机器上,每台机器上的应用程序一样。
         
二  Oracle体系结构
        1 一个数据库;
        2 多个实例  通常是一个实例;
        3 一个实例下可以创建多个用户 。 1个用户相当于一个应用。 这里的用户相当于mysql中的数据库;
        4 一个用户只能设置一个default tablespace,但是通过resource角色授予unlimited tablespace权限,用户将可以使用任意表空间。
                比如创建表的时候,不指定tablespace默认将该表放在default tablespace里面。如果加入tablespace参数 ,就存放在指定的表空间;
        5 表空间是oracle独有的逻辑概念  , 一个表空间可以包含多个实际的物理数据文件。
        6 用户创建的表对象是随机存储在一个或者多个数据文件上;


三  一个新应用在oracle的创建过程:
        1 需求分析
        2 数据库设计
        3 创建多个表空间
        4 创建用户并授权
        5 创建表
        
        创建表语法:
        CREATE TABLE 表名称(
         字段名 类型(长度) 约束,  
         ...
         字段名 类型(长度)
        );
        修改表语法,主要关注添加字段和修改类型长度:
        ALTER TABLE 表名称 ADD(
         列名 1 类型 [DEFAULT 默认值]
        );
        ALTER TABLE 表名称 MODIFY(
         列名 1 类型 [DEFAULT 默认值]
        )
        
        truncate 与 delete 实现数据删的区别
        1. delete 删除的数据可以 rollback
        2. delete 删除可能产生碎片,并且不释放空间
        3. truncate 是先摧毁表结构,再重构表
        truncate属于ddl delete属于dml
        
        


四   JDBC连接Oracle的4个jdbc工具类迭代
        jdbcutils1    driverclass url username password 写在Java类中
        jdbcutils2    driverclass url username password 写在配置文件中
        jdbcutils3    driverclass url username password 写在配置文件中,并通过连接池来管理连接
        jdbcutils4    通过threadlocal加入事务管理


五  Oracle查询【重点】
        单表查询
        伪列  rowid  rownum  
        rowid 表示记录的物理地址  用rowid查询比主键Id查询更快。直接定位物理地址。
        rownum  用于分页
        五个分组函数 count sum avg max min


        连接查询
        oracle的左外连接特殊写法  在oracle中外连接一般用oracle的特殊写法。
        select
        from a , b
        where a.id = b.id(+)      与 from 后面的a 和 b 没有关系,主要看where中的 = 。
        左外连接: 以左边的表为基准,右边表能匹配上的进行显示,不能匹配上的补NULL。


        子查询 从内向外看
        三种子查询  
        select 后面     select后面的子查询 select xxx from tab 只能有一个字段。  因为select后面的子查询相当于替换select查询中一个字段。     
        from 后面   
        where 后面
        where后面的子查询用exits 替换 in:
        exits的用法扩展:
        select *    from T_OWNERS t
        where exists (select id,name   from t_address ad    where ad.id = t.addressid    and ad.name like '%花园%');
        当子查询中前后表用到了关联,则只查询出满足关联条件的前表中的记录。
        select  *    from T_OWNERS t  where exists (select id  ,name from t_address ad  );
        当子查询中前后表没有关联关系,则根据后表中是否有记录返回,来查询前表中的所有记录。


        分页查询rownum 不能使用 > ; >= ;=
        原因: rownum在表扫描时产生,每次从1开始计数。
        所以当扫描到第一行时,rownum>10 不满足,会将记录丢失,一直扫描下去都会丢掉记录。所以最后查询不出记录。
        带排序的分页查询。 先查询出来数据 最后再加rownum进行排序  eg:
        select * from  
        (select rownum r,t.* from     (select * from T_ACCOUNT order by usenum desc) t        where rownum<=20 )
        where r>10


        单行函数
        字符函数
        substr(从什么位置开始截取,截取的长度)   位置从1开始。有点类似于el表达式中的fn:substr
        需要区分java中substring( begin,end) 从begin开始 到end结束 不包括end  位置从0开始。   
        || 字符串拼接
        length(str) 字符串长度
        数值函数
        round()  四舍五入
        日期函数
        add_months(sysdate,+/- 1) 加减月份
        last_day(sysdate)  所在月最后一天
        trunc(sysdate) 截取日期  去掉小时分钟秒
        trunc(sysdate,'yyyy')  2018-01-01
        trunc(sysdate,'mm')  2018-06-01
        转换函数
        to_char
        to_date
        null判断
        nvl(maxnum,9999);  当maxnum为null时,显示为9999.   当要显示字符串时,将不适用。则可以使用nvl2.
        nvl2(maxnum ,to_char(maxnum),‘不限’)   将maxnum类型转换为字符串。
        条件取值
        case when  then    sql标准的写法
        case when xx =1 then xxx when xx =2 then yyy  else zzzz end
        decode 是oracle 特有的。 相当于java中的switch分支判断
        decode(比较值,条件1,值1,条件2,值2 ,缺省值)


        行列转换
        case when    xxx   then  xxx  else   end   


        分析函数 三种排名方式
        rank() over( order by  xxx )         值相同,排名相同,排名跳跃
        dense_rank() over()   值相同,排名相同,排名不跳跃
        row_number() over()   无论值是否相同,按顺序排名
        row_number() over() 可以用来实现分页。
        eg:
        select * from  
        (select row_number() over(order by usenum desc ) rownumber,usenum from T_ACCOUNT)
        where rownumber>10 and rownumber<=20


        集合运算
        并集   union  不包含重复记录 /  union all  包含重复记录
        交集   intersect   取相同的记录
        差集   minus   相当于a-b  


六  视图 简化开发
        虚拟表 封装sql
        简单视图
                语法:
                create 【or replace】【force】 view viewname as   --force表示允许创建带错误的视图,如果sql中的表不存在,也可以创建成功。
                sql语句
                【with check option】 --表示该视图不能修改sql语句中的条件字段
                【with read only 】    --表示该视图只能读 不能修改
                eg:
                create or replace view v_address  as
                select * from address where areaid =2
                with check option ;
                update v_address set areaid = 3   。这条update语句不能执行,因为修改了sql中的条件字段areadid
               
        复杂视图
        多表关联视图中的【键保留表】 是指: 视图中保留了主键的表 。 多表关联视图只能更新键保留表中的数据,其它表的数据不能修改。


七  物化视图 提高查询性能
        真实表 封装sql
        语法:
        CREATE METERIALIZED VIEW view_name
        [BUILD IMMEDIATE | BUILD DEFERRED ]     【BUILD IMMEDIATE】 表示立即插入表数据,默认为该方式。【BUILD DEFERRED】表示延迟插入表数据。
        REFRESH [FAST|COMPLETE|FORCE]   【fast】 表示增量刷新  【complete】 表示全量刷新  【force】智能判断选择增量或者全量 。默认为该方式。
        [
        ON [COMMIT |DEMAND ]   【commit】表示基表数据有变动,自动刷新视图。 【demand】表示手动刷新视图  默认是手动刷新视图
        ]
        AS
        sql语句
        
        创建增量刷新物化视图需要先创建物化视图日志
        create materialized view log on t_address with rowid;


八  序列
        简单序列 create sequence  xxxx       nextval  currval
        复杂序列 create sequence xxx increment by x start with  x minvalue x  maxvalue y cycle cache
    循环索引时计算公式:
    ceil( (maxvlue-minvalue)/increment by ) >= cache    cache默认是20
        
九   同义词 别名
    create synonym 别名 for 对象;
    私有 只有创建用户能使用
        公共 所有用户都能使用


十  索引  提高查询性能
        简单索引 create index ind_xxxx on 表名(列名);
        唯一索引
        create unique inde inx_yyyy on 表名(列名)
        构建索引的列唯一不重复时
        复合索引
        create index owners_index_ah on T_OWNERS(addressid,housenumber);
        在sql查询语句中使用时,要注意 addressid 和 housenumber 的顺序要与索引一致。
        反向键索引
        create index ind_xxxx on 表名(列名) reverse;
        当要构建索引的列是连续值使用。不使用反向键则构建歪脖子树,效率低。
        位图索引   create bitmap index ind_xxxx on 表名(列名);
        适合创建在低基数列上。比如性别,民族。
        
十一   PLSQL
         变量申明
         三种方式  v_name varchar2(30) ; v_name t_address.name%type; v_address  t_address%type;
         变量赋值
         三种方式 v_name:='xxx' ; select name into v_name from t_address where id=1; select * into v_address from t_address where id=1;
         需要注意 select into 只能是一行记录。
         异常
         exception
         when  异常类型 then
         xxx;
         分支
                 第一种:
                 if 条件 then
                 xxx;
                 end if;
                 第二种:
                 if 条件 then
                 xxx;
                 else
                 yyy;
                 end if;
                 第三种:
                 if 条件  then
                 xxx;
                 elsif 条件 then
                 yyy;
                 else
                 zzz;
                 end if;
         循环
                不带条件循环
                loop
                        xxxx;
                        exit when 条件;
                end loop;
                带条件循环
                while 条件
                loop
                        xxxx;
                end loop;
                for循环
                for 变量 in 起始值 .. 截止值
                loop
                xxxx;
                end loop;
         游标
                不带参数游标
                declare
                cursor 游标名称  is sql查询语句;
                begin
                        open 游标名称;
                                loop
                                        fetch 游标名称  into 变量; //提取游标
                                        exit when 游标名称%notfound;
                                        xxxx;
                                end loop;
                        close  游标名称;
                end;
                带参数游标
                declare
                cursor 游标名称(参数名称 参数类型)  is sql查询语句; --sql语句中可以直接使用参数
                begin
                        open 游标名称(参数名称);   --open操作时才查询数据库
                                loop
                                        fetch 游标名称  into 变量; //提取游标
                                        exit when 游标名称%notfound;
                                        xxxx;
                                end loop;
                        close  游标名称;
                end;
                for循环简写游标
                declare
                cursor 游标名称  is sql查询语句;
                begin
                        for xxx in 游标名称
                        loop
                        xxxx;
                        end loop;
                end;
               
十二  存储函数
        有return返回值  一般在sql中调用
        create or replace function fn_xxxx(参数名称 参数类型) -- 参数类型不用写长度
        return varchar2    --返回值类型也不用写长度
        is
        变量申明;
        begin
                xxxx;
                return xxx;
        end;
        
十三  存储过程
        无return返回值  但有out类型参数 并可以有多个。 一般通过程序调用  callablestatement  { call p_xxxxx(?,?) }
        create or replace procedure p_xxxx (参数名称 参数类型 )   --参数类型不用写长度
        is
        变量申明;
        begin
                xxxx;   --注意dml操作后需要commit;
        end;
        
十四  触发器
   前置/后置; 行级/语句级   通常写的后置行级触发器
   前置表示操作执行前触发器先执行;后置表示操作执行完成后触发器执行;
   行级表示触发器作用于每一行;语句级表示触发器作用于一块语句;
   create or replace trigger tri_xxxx
   after
   update of name on t_owners
   for each row
   declare
   xxx;
   begin
   yyy;
   end;
   针对行级触发器 有:new  和 :old  






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2