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
  
       

本文出自 “Kenan_ITBlog” 博客,請務必保留此出處http://soukenan.blog.51cto.com/5130995/1130972

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章