oracle学习全套笔记 11g

每一个知识点的掌握程度:
    1,重点:表示须要掌握,会写出来
    2,理解:改代码
    3,了解:不须要掌握

一个好的技术只能决定你的开始,而不能决定你的之后。
一个好的职场人员:技术,项目管理,CMM,心理学,会计,金融。
    对于如今的软件开发,最重要的是构建商用体系,无纸化办公,OA,ERP,CRM

ruby
编程习惯:必定要有良好的编程习惯

1,oracle简介
    oracle是如今全世界最大的数据库提供商,编程语言提供商,应用软件提供商
    oracle由Ellison创办
    oracle 8i/9i/10i i:internet觉得着oracle开始向网络发展
    oracle 10g/11g g表明网络计算
2,oracle安装(重点)
    1,关闭防火墙,断开网络
    2,启动安装程序
    3,选择企业版
    4,修改全局数据库名:soukenan
    5,选中 建立带数据库样本的数据库
        若是没有选中,就不会有大数据用户出现
    6,设置口令 oracle oracle
    7,启动安装程序,自行安装,不要进行任何操做
    8,用户介绍:oracle经常使用一下四个用户:
        在安装完成以后设置
        1,超级管理员 sys/change_on_install
        2,普通管理员 system/manager
        3,普通用户    scott/tiger  默认是被锁定的
        4,大数据用户 sh/sh
    9,退出
注意:
    10,把全部的oracle服务修改成手动启动
    11,重要的服务
        监听服务: 。。。Listener : 若是有程序要操做数据库,或者是一些远程的客户端要链接数据库
        数据库的实例服务 OracleServiceSID 全局数据库名

3,oracle卸载步骤
    1,直接运行卸载程序
    2,删除硬盘上的残留文件
    3,删除注册表中全部与oracle有关的配置项
4,监听问题:
    1,注册表项被删除(注册表优化)
    2,计算机名改变( 10g 和它之前的版本)
5,sqlplus
    1,dos风格: sqlplus.exe
    2,windows风格:sqlplusw.exe(能够进行数据显示的调整)
6,sqlplusw
        select * from emp;
    1.set linesize 300 设置没行的字符数
    2.set pagesize 30 设置每页显示的数据个数
        select * from emp;
    3,在sqlplusw中 方向键只能控制屏幕的移动,没有办法控制光标
    4,             ed a 建立a.sql来编辑sql
        @a  执行a.sql
        @d:\demo.txt 若是这个文件是demo.sql能够这样写
        @d:\demo  === @d:demo
7,select * from tab ; 查看全部的表
8,show user 查看当前的登陆用户
9,切换用户
    conn 用户名/密码  [as sysdba]
10,每一张表都与其属于的用户,因此代表完整是
    用户名 表名
11,select * from scott.emp ;
12,使用超级管理员能够关闭数据库
    shutdown immediate;
    这个时候,用户没法链接sqlplusw
    此时能够先用/nolog登录,以后用管理员登录,启动数据库
    执行下列语句
    C:>SQLPLUS /nolog
    startup
13, 在sqlplusw中使用windows系统命令,须要在前面加上 host
     host notepad;
14. 在scott用户下四个表,查看表结构
    desc emp;
    1,部门表 dept
        deptno number(2)  两位数字
        dname varchar2(14)
        loc       varchar2(13)
    2,雇员表 emp
        empno number(4)
        ename
        job
        mgr
        hirdate
        sal      number(7,2) 基本工资
        comm            奖金
        deptno number(2)
    3,工资等级表 salgrade
        grade
        losal
        hisal
    4,工资表bonus
        ename
        job
        sal
        comm
15,简单查询
    select * from emp;
16,sql分类
    dml 数据操做语言  用于检索或者修改数据
    ddl 数据定义语言  用户修改数据的结构
    dcl 数据控制语言 用户定义数据库用户的权限
17.简单查询
    select [distinct] * from emp [别名]
    1,select emp.ename from emp;
    2,select job from emp;
    3.select distinct job from emp;
    4,select ename,job,sal*12 from emp; (四则运算   
    5,select ename,job,sal*12 income from emp; 起别名
    6,select ename,job,(sal+300)*12 income from emp; 使用()改变运算等级
    7,字符链接
        select eno || ename from emp;
        select eno || ':' || ename from emp;
    8,必定要记住:
        别名上的内容不能用' 括起来,而只有select子句以后的内容才用 '括起来
18,限定查询
    1, select * from emp where sal>1500;
    2, 在oracle中是区分大小写的
        select * from emp where job='clerk';
        ==>
        select * from emp where job='CLERK';
    3,
        select * from emp where sal between 1500 and 3000;
            ==>
        select * from emp where sal>=1500 and sal<=3000;
    4,
        select * from emp where (job='CLERK' or job='SALESMAN') and sal > 2000;
    5,     between and 还能够限制日期范围
    6,查询出全部领取奖金的员工
        select * from emp where not comm is null
    7,in操做
        select * from emp where empno = 7369 or empno = 7766;
        select * from emp where empno in (7369,7766);
    8,关于 not in 和 in 问题
        in 的范围中有 null 没有问题
        not in 的范围有null  不会返回任何结果 , not in 的范围里存在了 null 则表示就是查询所有数据
    9. like  _匹配单个字符 % 匹配多个字符
        select * from emp where ename like 'A%';
        select * from emp where ename like '_A%';
        select * from emp where ename like '%A%';
        select * from emp where ename not like '%A%';
    like不必定只能用在字符串上
        select * from emp where hiredate like '%9%' or sal like '5%';
    关于like子句的使用注意
        like '%%'  查询所有
19,数据的排序
    数据默认按照编号排序: asc 正序:默认,不写就是升序  desc 降序
    1,select * from emp order by sal desc;
    2,select * from emp order by sal asc;
    3,select * from emp
        order by sal , hirdate ;
    单行函数
20,字符函数
    1,
        upper
        lower   
        initcap  首字母大写
        length
        replace
        substr
    2,
        1,select upper('hello') from dual;
        2,select lower('hello') from dual;
        3,select initcap(ename) from emp;
        4,select * from emp
            where length(ename) = 5;
        5,select replace(ename,'A','*') from emp;
        6.select ename,substr(ename,3) from emp;
            select ename,substr(ename,3,7) from emp;
            设置负数,表示从后面截取
            select ename,substr(ename,-3) from emp;
            面试题:
                请问substr函数截取的时候下标是从0仍是从1开始?
            在oracle数据库中,substr函数从0仍是1开始都是同样的
21,数字函数
    1,round  (数字|列,[保留小数的位数]) 四舍五入
    2,trunc   (数字|列,[保留小数的位数]) 舍弃指定位置的内容
    3,mod(数字1,数字2)  取余数
    例子:
    1,select round(903.54) from dual;
    2,select round(-903.54) from dual;
    3,select round(903.54,-1) from dual;
    4,select round(903.54,1) from dual;
    5,select trunc(903.54) from dual;
    6,select trunc(-903.54) from dual;
    7,select trunc(903.54,-1) from dual;
    8,select trunc(903.54,1) from dual;
    9,select mod(10,3) from dual;
22,日期函数
    1,如何取得当前日期
        select sysdate from dual;
    2,     日期+ 数字 表示多少天以后的日期
            select sysdate+300 from emp;
        日期-数字表示多少天以前的日期
            select sysdate - 300 from emp;
        日期-日期 表示两个日期之间的天数 确定是大日期-小日期
            select sysdate-hirdate from emp;
    3,     last_day (日期)             日期的月份的最后一天
        select last_day(sysdate) from dual;
        next_day(日期,星期数) 求出下一个指定星期X的日期
        select next_day(sysdate,'星期一') from dual;
        add_months(日期,数字)   求出若干月以后的日期
        select add_months(sysdate,4) from dual;
        months_between(日期1,日期2) 两个日期经历的月份
        select months_between(sysdate,hirdate) from emp;
        select trunc( months_between(sysdate,hirdate)) from emp;
23,转换函数  核心
    to_char  to_date to_number
    to_char
        标记: yyyy年 mm月 dd日 hh时 hh24 24小时 mi分 ss秒
    1,select to_char (sysdate,'yyyy mm dd') from dual;
    2,  select to_char(sysdate , 'yyyy') from dual;
    3,  select to_char(sysdate,'fmyyyy mm dd') from dual; fm用来去除o
    4,  select to_char(sysdate,'yyyy mm dd  hh24:mi:ss');
    s,  select to_char(23424234234234,'L999,999,999,999,999') from dual;
        L表示运行环境所在的地的货币单位
    6,select to_date('2012-3-4','yyyy-mm-dd') from dual;
    7, select to_number('1') from dual;
    select to _number('1') + to_number('2') from dual;
    select '1'+'2' from dual;
24,通用函数 核心
    nvl
    1,select (sal+comm) *12 from emp;
    select (sal+nvl(comm))*12 from emp;
    decode 多值判断
    1, select ename,
        decode(job, 'CLERK','办事员' ,'SALESMAN','销售人员 ')
        from emp;
25.大数据用户主要是为了作讲解中的测试使用
26,多表查询
    1,查询记录数
        select count(*) from emp;
    2,select * from emp,dept;
    3,select * from emp,dept where
        emp.deptno = dept.deptno
         select * from emp e,dept d where
        e.deptno = d.deptno ;
        这个查询从根本上尚未消除笛卡儿积
        这个会进行逐条进行比较
        在大数据的时候这个效率会很是低
    4,
         select  e.ename,e.job,l.empno
        from emp e,emp l
            where e.mgr = l.empno;
    5, select e.empno,e.ename,e.sal,d.dname,s.grade
        from emp e,dept d,sal s
        where e.deptno = d.deptno and
            e.sal >= s.losal and
            e.sal <= s.hisal;
27,左右链接
    1,select * from emp e,dept d
        where e.deptno = d.deptno ;
    +放在左边表示是左链接
    +放在右边表示是右链接
28, SQL:1999语法
    1,交叉链接(cross join) 用于产生笛卡儿积
        select * from emp cross join dept;
    2,天然链接 natural join 自动找到匹配的关联字段,消除笛卡儿积
        select * from emp natural join dept;
    3,join -- using   
        select * from emp join dept using (deptno);
    4,join -- on
        select * from emp join dept on (emp.deptno = dept.deptno);
    5, left outer join -- on     左链接
        right outer join -- on  右链接
        full outer join -- on    全链接  ,把两张表中没有的数据所有显示
29,统计函数和分组查询
    1,count
    2,avg
    3,sum
    4,max
    5,min
    select count(empno),sum(sal),avg(sal) from emp;
    select max(sal),min(sal) from emp;
    若是一个空表:count返回0
        其余分组函数返回null,没有记录
    分组查询
        当有数据有重复的时候分组才有意义
    1,
        select max(sal),deptno from emp group by deptno;
        各个语句的顺序
            select
            from
            where
            group by
            order by
     2,平均工资最高的工资
        select max(avg(sal)) from emp group by job;
    3,多字段分组
        select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal))
            from dept d,emp e
            where d.deptno = e.deptno(+)
            group by d.dname,d.deptno;
    4,having   放在group by以后 和where不一样的是 having子句中可使用分组函数
        select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal),0)
            from dept d,emp e
            where d.deptno = e.deptno(+)
            group by d.dname,d.deptno
            having avg (e.sal) > 2000;
30,子查询  能够替代多表查询   
    通常出如今where和from子句中
    1,select * from emp where sal >
        ( select sal from emp where ename = 'SMITH' ) ;
    2,where 返回单行多列的状况
    select * from emp
        where ( job,sal ) = (
        select job,sal from emp where ename = 'ALLEN'
        );
    3,where 中 子查询返回多行单列的状况 in ( not in 在子查询中,若是有一个null  不会返回任何结果)
    select * from emp
        where sal in(
        select sal from emp where job = 'MANAGER'
        );
    any操做   任意一个匹配上便可
    select * from emp
        where sal = any(
        select sal from emp where job = 'MANAGER'
        );
    select * from emp
        where sal > any(
        select sal from emp where job = 'MANAGER'
        );     比子查询中返回的最小的大
    select * from emp
        where sal < any(
        select sal from emp where job = 'MANAGER'
        ); 比子查询中返回记录的最大的小
    select * from emp
        where sal > all(
        select sal from emp where job = 'MANAGER'
        );
    select * from emp
        where sal < all(
        select sal from emp where job = 'MANAGER'
        );
    4,出如今from中:
    多表查询
    select d.deptno,d.dname,count(e.empno),avg(e.sal)
        from emp e,dept d
        where e.deptno(+) = d.deptno
        group by d.deptno,d.dname;
    子查询:效率更高
    select d.deptno,d.dname,cempno,asal from(
    select deptno,count(e.empno) cempno,avg(e.sal)  asal
        from emp e group by e.deptno
        ) temp,dept d where temp.deptno(+) = d.deptno;
31,数据的更新操做 update insert delete
    复制数据库表
    create table myemp as select * from emp;
    1,.insert into myemp
        (empno,ename,hiredate)
        values (2323,'kenan',sysdate);
    2, update myemp set ename = 'lele' where empno = 2323;
    3,数据删除
        delete from myemp where empno = 2323 ;
32,事务处理
    全部的事务处理操做对应一个session
    rollback 事务回滚
    commit 提交事务
   
某一个session在更新数据库表的时候,这个表处于锁定状态
    其余session是没法更新的,必须等待以前的session提交后才能够。
   
写完sql  必需要提交 ,不然不会提交到数据库
33,数据伪列
    数据伪列指的是不须要用户处理,oracle自定维护的数据列
    rownum,rowid
    1,select rownum,empno,ename from emp;
        rownum:行号
    2, 查询 6-10条数据  来用来子查询
        select * from
        (
        select rownum rn,empno,ename from emp where rownum <=10
        )where rn>=6;
        以来上面能够实现分页
34,rowid 了解:表示每一行数据保存的物理地址的编号
    select rowid,empno,ename from emp;
    rowid不会重复
35,面试题:删除数据库表中重复的记录 dept
    select min(rowid)
        from dept group by dname,loc
            以上数据是不能删除的
    delete from dept
        where rowid not in (
        select min(rowid)
        from dept group by dname,loc);
36,练习题
    列出至少有一个员工的全部部门的编号,名称
    并统计出这些部门的平均工资,最低工资和最高工资
    select d.deptno,d.dname,temp.avgsal,temp.maxsal,temp.minsal
        from dept d,(
            select deptno,avg(sal) avgsal,max(sal) maxsal,min(sal) minsal
                from emp group by deptno) temp
                where d.deptno = temp.deptno;
    列出薪金比SMITH 或 ALLEN多的员工的编号姓名,部门名称,其领导姓名
    select e.empno,e.ename,d.dname,m.ename
    from emp e ,dept d,emp m
    where e.sal > all (
        select sal
        from emp
        where ename in ('SMITH','ALLEN'))
        and e.deptno = d.deptno
        and e.mgr = m.empno;
    select e.empno,e.ename,d.dname,m.ename
    from emp e join dept d on (e.deptno = d.deptno) join emp m on( e.mgr = m.empno )
    where e.sal > all (
        select sal
        from emp
        where ename in ('SMITH','ALLEN'));
    列出全部员工的编号,姓名及其直接上级的编号姓名,显示结果按照领导的年工资的降序排列
    select e.empno,e.ename,m.empno,m.ename,(m.sal+nvl(m.comm,0))*12
    from emp e,emp m
    where e.mgr = m.empno
    order by (m.sal+nvl(m.comm,0))*12 desc;
37,
经常使用的数据字段
    字符串 varchar2(n)
    数字   number(n)
    小数   number(n,m)
    日期   date
    大文本 CLOB   能够存储海量文字(4G)
    大对象 BLOB   存放二进制数据
38,建立表
    create table table_name(
        column type default_value,
        column type default_value,
        column type default_value
    );
    create table member(
        name varchar2(50),
        age number(3),
        birthday date default sysdate,
        content clob
    );
    insert into member values('kenan',3,sysdate,'kekekekekek');
39表的复制:仅oracle支持如下语法 了解
    create table copy_table_name as child_select;
create table emp20 as select * from emp where deptno = 20;
create table emp20 as select * from emp where 1 = 2 ;
40,表的重命名:oracle支持如下语法 了解
    rename emp20 to emp30;
41,删除表数据能够进行数据的回滚
    若是但愿完全清空表示表数据,没法回滚
        truncate table emp30;
42,表的删除
    drop table emp30;
    表删除后,会进入一个回收站中(闪回技术)
    查看回收站
        show recyclebin;
    恢复表
        flashback table emp30 to before drop;
    删除回收站中的数据
        purge table emp30;
    purge recyclebin;  清空回收站
    若是但愿删除不进入回收站
        deop table table_name purge;
43,修改表结构
    create table member(
        mid number,
        name varchar(45)
    );
    alter table member add(
        age number default 0);  //有默认值的话会为全部的已有列设置默认
    alter table member modify(
        name varchar2(2));
    世界上性能最高的数据库是 IMB DB2 有一个平台的限制
    跨平台的数据库 oracle性能最高
    在 IMB DB2数据库之中时不容许修改表结构的
44,约束:保证表中的数据的合法性
    非空约束 not null
    检查约束
    外键约束
    1, create table temp(
        id number not null);
    2,惟一约束
        create table temp(
            email varchar(34) unique;
        );
   
    3,主键约束
        create table temp(
            id number(3)primary key
            );
    4,检查约束check CK 
        create table temp(
            name varchar2(43),
            age number(3),
            constraint ck_temp_age check(age between 1 and 20),
            constraint ck_temp_name check(name in ('kenan','na'))
            );
45,外键约束
    drop table member purge ;
    drop table book purge ;
     create table member(
        id number primary key,
        name varchar2(34)
     );
     create table book(
        id number primary key,
        mid number,
        title varchar2(20),
        constraint fk_book_member foreign key (mid) references member(id)
                on delete cascade
     );
     1,外键约束  级联删除 ondelete cascade
     2,删除数据的时候,将相关的子记录设为null
            on delete set null
     3,不关心字表是否存在,直接强制删除父表
        drop table member cascade constraint purge;
     4,合理作法:
            先删除字表,而后删除父表
     5,修改约束 用 alter指令
        alter table table_name add constraint 约束名 约束类型
        alter table table_name drop constraint 约束名
46,查询约束
    oracle全部的对象保存在数据字典中,
    而约束也是同样保存在数据字典中。
    1, select* from user_constraints;
        ower: 全部者  查询约束
    2,查询约束对应的字段
        select * from user_cons_columns;
    3,格式化显示的列的长度 col ower(列) for A14;
47,集合操做
    union  相同的部分不显示
        create table emp20 as select * from emp where deptno = 20;
        select * from emp
        union
        select * from emp20;
    union all  相同的部分显示
        select * from emp
        union all
        select * from emp20;
    intersect  返回相同的部分
        select * from emp
        intersect
        select * from emp20;
    minus  返回不一样部分 减去
        select * from emp
        minus
        select * from emp20;
48,序列:自动增加列
    1,建立序列
        create sequence myseq;
    2,select myseq.nextval from dual;
        select myseq.currval from dual;
    3,使用序列
        insert into temp values(myseq.nextval);
49,视图
    1,建立视图
        create[ or replace ] view view_name
            as 子查询;
    2,查询视图
        select * from view_name;
    3, 建立视图的其余选项
        1,with check option
            限制修改视图条件
        2,with read only
            限制修改视图
50,同义词 了解
    select sysdate from dual;
    通过查询dual表格属于 sys
    为何在 scott中能够直接访问 dual
    这个是由于同义词
    create synonym myemp for scott.emp;
    conn sys/change_on_install as sysdba;
    create public synonym myemp for scott.emp;
51,    索引 理解 dba
    select * from emp where sal > 1500 ;
    这里采用的是逐行判断的方式
    在oracle建立索引有如下两种方式:
        1,主键约束
        2,手工建立
            create index emp_sal on emp(sal);
            若是这个字段须要常常更新的话,那么这个索引也要所有更改,反而下降的性能
            因此索引通常创建在不常常修改的列中
52,用户管理 了解 dba的工做 dcl
    grant 受权 revoke 回收
    1,建立用户
        conn sys/change_on_install as sysdba;
        create user dog identified by wangwang;
        这个用户并不能登录,没有登录权限,没有建立session的权限
    2,受权
        grant create session to dog;
    3,登录 dog/wangwang
    4,没有建立表和序列的权限
        在oracle中 表空间保存在硬盘上,表数据保存在表空间上
    5,    grant create table to dog;
        //这里给了建立表的权限,并无操做表空间的权限,因此依然没法建立表
       
        为了解决用户的受权操做,在oracle之中提供了许多的角色,每个角色包含多个权限,而角色主要有两个: connect resource
    6,受权
        grant connect,resource to dog;
    7,修改用户的密码
        conn sys/change_on_install;
        alter user dog identified by miaomiao;
        管理员能够是密码失效,让用户登录的时候,修改密码:
        alter user dog password expire;
        锁定用户
        alter user dog account lock;
        解锁
        alter user dog account unlock;
    8,select * from scott.emp;
        这个新人没法访问别人的表
    9, 受权其余用户表的操做权限
        grant select on scott.emp to dog;
    10,回收权限
        revoke select on scott.emp from dog;
        invoke connect,resource,create table,create session from dog;
    11,删除用户
        drop user dog cascade;
53,数据库的备份
    数据库的导入和导出
    1,数据的导出
        1,exp
        2,输入用户名和密码
        3,回车
    2,数据的导入
        1,进入备份文件所在文件夹
        2,imp
        3,输入用户名和密码
        4,回车
       
        可是以上的状况适合于数据小的状况
54,数据的冷备份
        在数据操做之中,有可能用户不会进行事务的提交,
        那么这种状况下没法进行完整的备份操做,而所谓的冷备份
        指的就是在关闭数据库实例的状况下进行的数据备份操做的实现
                若是要进行冷备份,则须要备份数据库中的一些几个核心内容:
                    1,控制文件:数据库的实例服务的核心文件,经过 v$controlfile 找到
                    2,重作日志文件,能够进行数据的灾难性回复,经过 v$logfile 找到
                    3,数据文件,表空间文件  经过 v$datafile 和 v$tablespace 找到
                    4,核心操做的配置文件 pfile 经过 show parameter pfile 找到
                从实际的oracle的部署来说,全部的文件为了达到io的平衡操做,要分别保存在不一样的硬盘上
               
                查找文件
                1,使用sys登录
                2, 查找全部的控制文件目录
                select * from v$controlfile;
                3,备份重作日志文件
                    select * from v$logfile;
                4,查找表空间文件
                    select * from v$tablespace;
                    select * from v$datafile;
                5,找到pfile文件
                    show parameter pfile;
                6, 关闭数据库实例
                    shutdown immediate;
                7,将全部查找到的数据库备份到磁盘上
                8, 启动数据实例
                    startup
55,数据库设计范式:可让数据表更好的进行数据的保存,指的是数据库的设计原则。   
56,第一范式:
        数据库表中的数据列不可再分:
        所谓的不可分割就是全部的数据类型都使用数据库提供的数据类型
57,第二范式:
        数据表的非关键字段对任一候选关键字段的部分函数依赖
        两种方式理解:
                1,列之间不存在函数关系
                        sal number,yearsal number
                2,多对多关系设计,避免列重复,使用中间表实现
58,第三范式:
        用的是一对多的实现,避免列重复
59,power Designer
    1,创建数据库表结构
        使用物理数据模型
    2,生成数据库的建立脚本
        Ctrl+G Database-->Database Generation
    3,如何从数据库中倒入表结构
        配置数据源
            1, 管理工具--〉数据源
            2,系统dsn
            3,添加oracle
        倒入数据库数据
            4,power designer
                -->File
                -->Reverse Engineer
                -->Database
  
        面试