oracle筆記系列(一)

oracle數據庫
前言   oracle sql
第一章 Selecting Rows
第二章 Sorting & Limiting Selected Rows
第三章 Single Row Functions
第四章 Displaying Data from Multiple Tables
第五章 Group Function
第六章 Subqueries
第七章 Specifying Variables at Runtime
第八章 Overview of Data Modeling and Database Design
第九章 Creating Tables
第十章 Oracle Data Dictionary
第十一章 Manipulating Data(DML)
第十二章 Altering Tables and Constraints
第十三章 Creating Sequences
第十四章 Creating View
第十五章 Creating Indexes
第十六章 Controlling User Access

why?
數據庫的概念:
    數據庫是按照數據結構組織,存儲和管理數據的倉庫。
    數據庫,簡單來說是本身可視爲電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
    它將數據以一定方式儲存在一起、能爲多個用戶共享、具有儘可能小的冗餘度的特點、是與應用程序彼此獨立的數據集合。

  ①保存數據  : file是輕量級保存數據;數據庫是重量級保存數據,需要安裝軟件。
  ②管理數據,有效增刪改查(CRUD)
  ③在項目開發中,運行在項目的後臺。

 項目分前臺和後臺。前臺做界面。
 大型數據庫:oracle,db2 銀行系統(數據量大,安全性高,需要付費)
 中型數據庫:sql server,mysql 網站開發(數據量大,安全性相對不高,免費的)
 小型數據庫: access,sqlite(數據量小,安全性低,免費的)


數據模型是數據庫中數據的存儲方式,是數據庫系統的基礎
數據模型經歷了:
    1.層次模型:層次模型是數據庫系統最早使用的一種模型,它的數據結構是一棵“有向樹”

    2.網狀模型:網狀模型以網狀結構表示實體與實體之間的聯繫。網中的每一個結點代表一個記錄類型,聯繫用鏈接指針來實現。網狀模型可以表示多個從屬關係的聯繫, 也可以表示數據間的交叉關係,即數據間的橫向關係與縱向關係,它是層次模型的擴展。網狀模型可以方便地表示各種類型的聯繫,但結構複雜,實現的算法難以規範化
    
    3.關係型:在關係模型中基本數據結構就是二維表,不用像層次或網狀那樣的鏈接指針。記錄之間的聯繫是通過不同關係中同名屬性來體現的
    優勢:    ①數據結構單一   ②關係規範化,並建立在嚴格的理論基礎上   ③概念簡單,操作方便。
    組成:    ①單一的數據結構---關係     ②關係操作集合      ③關係的數據完整性,準確性和一致性。

what?
存放數據,有效的管理數據。

關鍵名詞:
數據(記錄):每行代表一條數據
字段:每列代表表中保存哪些內容


主鍵:primary key(PK)用來唯一標識表中的數據。  ①主鍵不能爲空           ②主鍵的值必須唯一
外鍵:foreign key(FK)維護表與表之間的關係。       ①外鍵的值可以爲空    ②外鍵的值不爲空,其值必須在所依賴的表中依賴的字段值存在。
序列(Sequence):生成主鍵的值。Oracle數據庫特有
索引(Index):提高檢索效率
同義詞(Synonym):給對象重新取名字
存儲單位():PL/SQL(將一條SQL或者多條SQL語句連接起來)



1.一個認知
    Oracle是關係型數據庫。
    Oracle是一家提供產品和服務的廠商。
    甲骨文公司:是全球第一大數據庫廠商,是全球第二大軟件廠商,超越了IBM公司。全球第二大ERP廠商
    ERP:企業資源管理,最大ERP的廠商是德國SAP

    瞭解oracle數據庫發展歷史(文檔)


2.二個概念
    數據庫:數據存儲的倉庫
    關係型數據庫:數據庫中保存的對象之間可以存在一定的關聯關係,並非完全獨立。主要反映到以後學習的主外鍵.
    

    瞭解數據庫發展歷史(文檔)


3.三個名詞
    sql:結構化的查詢語句,操作oracle數據庫的語言
    sqlplus:oracle軟件自帶的可以輸入sql,且將sql執行結果顯示的終端

    pl/sql:程序化的sql語句,在sql語句的基礎上加入一定的邏輯操作,如if for...,使之成爲一個sql塊,完成一定的功能


4.四種約束:
    ①實體性完整性約束:針對主鍵,主鍵的值必須非空唯一。
    ②參照性完整性約束:針對外鍵,外鍵的值可以爲空,如果外鍵的值不爲空,它的值必須在它依賴的表中依賴的字段值中存在    
    ③列級約束:它的值必須匹配它所定義的數據類型    

    ④用戶自定義約束:check,如gender (男,女)   


5.五種分類:針對sql命令
    sql的五大分類:
    1)Data retrieval:數據查詢
      select
    2)DML:數據操縱語言(行級操作語言):操作的是表格當中一條一條的數據
      insert  update  delete
    3)DDL:數據定義語言(表級操作語言):操作的內容爲表格(對象)
      create  alter  drop  truncate  rename
    4)transaction control:事務控制    
      commit rollback savepoint
    5)DCL:數據控制語言
      grant revoke
    
delete,truncate區別:
    delete:  刪除表中的一條或者多條記錄,該操作需要提交事務
    truncate:清空表格,該操作不需要提交事務

6.六種對象:數據庫中的對象
    table:表格,由行和列組成,列又稱字段,每一行內容爲表格的一條完整的數據。
    view:  視圖,一張表或者多張表的部分或者完整的映射,好比表格照鏡子,鏡子裏面的虛像就是view
除去常見的table和view兩種對象以外,oracle數據庫還支持如下四種對象
    sequence:序列
    index:索引,提高數據的訪問效率
    synonym:同義詞,爲對象取別名,方便對象的操作
    program unit:程序單元,pl/sql操作的對象

準備:
1.安裝oracle數據庫
    1.1 最好默認安裝到C盤
    1.2 安裝過程中有一步讓輸入一個密碼,建議使用oracle作爲密碼,方便記憶
    1.3 安裝完成之後,打開系統服務,查看服務是否已經正常啓動,具體情況參照文檔:oracle系統服務.txt
    1.4 打開cmd,輸入sqlplus,然後回車查看是否能執行該命令
    1.5 如果不能執行,則需要把安裝目錄裏面的BIN裏面配置到系統環境變了path中,然後重新打開一個cmd窗口即可

    卸載具體參照文檔

2.登錄oracle自帶的管理系統,新建一個屬於自己的賬號.參照文檔:oracle系統服務.txt

3.用戶創建好之後,使用sqlplus命令登錄到oracle數據庫中,然後把之後要使用到的表及其數據導入到數據庫中.參照文檔:導入數據.txt

4.瞭解導入的三張表以及相互關係
    s_emp        員工表
    s_dept        部門表
    s_region    地區表

5.之後登錄或者操作數據庫,就可以使用這個新創建的用戶了


====================================================================

第一章:select語句,數據查詢操作
1.使用select語句查詢某張表的所有數據內容
    語法:
    select [distinct] *{col_name1,col_name2,..}
    from tb_name;
    注意:語法中出現的中括號[],表示該部分可有可無
    *:表示所有列,僅僅作爲測試和學習使用,在企業用語中不出現,因爲效率低下且可讀性差
    col_name1:列名,將需要查閱的數據字段列舉出來,可以查看多列值,列名之間用,進行分割即可
    s_emp :員工信息表
    s_dept:員工部門表
需求:查看s_dept表中的所有記錄
    select   *   from   s_dept;

    select id,name,region_id
    from s_dept;
    
    
練習:查看s_dept表中的所有記錄的id和name
    select id,name
    from s_dept;


練習:查看所有員工的id,名字(last_name)和薪資(salary)
    select id,last_name,salary
    from s_emp; 
    
2.select語句可以對指定的列的所有值進行算術運算。

    語法:  select col_name 運算符 數字    from tb_name;

需求:查看每個員工的員工id,名字和年薪。
    select id,last_name,salary*12
    from s_emp;
注意:select語句永遠不對原始數據進行修改。
練習:查看每個員工的員工id,名字和月薪漲100以後的年薪
    select id,last_name,(salary+100)*12
    from s_emp;

    
3.給查詢的列取別名

    語法: select  old_column  [as]  new_column_name    from tb_name;

需求:查看員工的員工id,名字和年薪,年薪列名爲annual
    select id,last_name,salary*12 as annual
    from s_emp;
    
4.使用||可以使得多列的值或者列和特殊的字符串合併到一個列進行顯示
    語法: select  col_name || 'spe_char' || col_name    from tb_name
    'spe_char':如果一個列的值要跟特殊的字符串連接顯示,使用該語法。
需求:查看員工的員工id,全名
    select id,first_name||last_name
    from s_emp;
練習:查看員工的員工id,全名和職位名稱,全名和職位名稱合併成一列顯示,且格式爲:姓 名,職位名稱
    select id,first_name||' '||last_name||','||title as name

    from s_emp;  

    
5.對null值得替換運算      nvl()函數
    語法:select  nvl(col_name,change_value)    from tb_name;
需求:查看所有員工的員工id,名字和提成,如果提成爲空,顯示成0
    select id,last_name,nvl(commission_pct,0) commission_pct
    from s_emp;
    
    
6.使用distinct關鍵詞,可以將顯示中重複的記錄只顯示一條
    語法:
    select distinct col_name,col_name...
    from tb_name;

    注意1:distinct關鍵詞只能放在select關鍵詞後面
    如:select id,distinct title
        from s_emp;
    該語句語法錯!!!!!
    注意2:如果distinct關鍵詞後面如果出現多列,表示多列聯合去重,即多列的值都相同的時候纔會認爲是重複的記錄。
    test表:
    id    id2
    1    2
    1    3
    2    4
    3    4
    3    4
    select distinct id,id2
    from test;
    顯示結果爲:
    id    id2
    1    2
    1    3
    2    4
    3    4
需求:查看所有員工的職位名稱和部門id,同職位同部門的只顯示一次
    select distinct title,dept_id

    from s_emp;

   
7.sqlplus命令
   sqlplus 登錄之後,可以使用buff(緩存)來存儲/執行/修改要執行的sql語句
   這裏的buff的特點:
      1.buff中只能存儲一條sql語句(但是這條sql語句可能有很多行)
      2.每次放入新的sql語句,會把之前的覆蓋掉
      3.每次執行sql語句,都會把這個sql語句放到buff裏面

    l   查看緩存中的sql語句
    a   在[定位]的那一行後面追加新的內容
    i   在[定位]的那一行下面插入新的一行
    c   替換[定位]的那一行中的某些字符串
        c/老的字符串/新的字符串
    del 刪除[定位]的那一行內容
    n   後面加內容可以重寫這一行
    !   後面接終端命令 !clear:清屏 windows中使用$符號 例如:$cls
    /   執行緩存sql命令

    clear buffer:清空當前緩存的命令

        
    save  test.sql  buff中的sql語句保存在test.sql文件中
    get   test.sql  把test.sql中的內容在加載到buff中,但是沒有運行
    start test.sql  把test.sql中的內容在加載到buff中並且執行
    @test.sql       把test.sql中的內容在加載到buff中並且執行
    edit file_name  使用系統默認編輯器去編輯文件

    spool file_name 將接下來的sql語句以及sql的運行結果保存到文件中
        sql1
        result1
        sql2
        result2
        ...
    spool off  關閉spool功能
    exit:退出
    
    
    
8.select id,last_name,first_name, salary, dept_id
  from s_emp
  Where rownum <=10;

  結果不好看,通過column使我們的顯示界面好看。

    COLUMN last_name FORMAT a15;
    可以簡寫爲:
    col last_name for a15;
    COLUMN first_name FORMAT a15;

    Column 沒有改變數據表裏數據,它只是改變顯示。Column不是SQL命令,而是sqlplus命令。除了剛纔這個作用之外,我們下面來看看它還有什麼作用。

    COLUMN last_name HEADING 'Employee|Name' FORMAT A15
    . 給last_name取別名爲Employee|Name , 豎槓代表換行。
    . A15表示十五個字節長,一短橫槓就是一個字節長

    COLUMN salary JUSTIFY LEFT FORMAT $99,999.00
    . salary JUSTIFY LEFT : 僅僅改變列名顯示爲左齊
    . FORMAT $99,999.00: 控制顯示格式爲前面加 $ 符, “,”爲分隔符, 0或9代表數字(通配符),0表示替換對齊數值,位數不足會補足,可以混合使用。

    COLUMN start_date FORMAT A8 NULL 'Not hired'
    . 如果start_date值爲空的話,顯示爲’Not hired’;
    . Format後不能直接跟null, 要先a8或a10;
    . NULL 'Not hired'和nvl類似

    column 顯示所有對列格式的設置情況
    column last_name 顯示對last_name列顯示設置的情況
    column last_name clear 刪除對last_name列格式設置的情況
    Clear column 清除所有column的格式設置
    
    Column columName
    可以顯示該列的格式設置,這裏的列並不特定於某個表.

    注意:
    1234   column 99.99  -- > ###### //出錯的時候不能顯示,只是顯示####


第二章:排序和限制查詢
1.排序:所謂排序,就是根據某個字段的值按照升序或者降序的情況將記錄查詢出來
    語法:
    select col_name,...
    from tb_name
    order by col_name [asc|desc],...
    注意:1.排序使用order by字句,該子句只對查詢記錄顯示調整,並不改變查詢結果,所以執行權最低,即最後執行。
    2.排序關鍵詞:
        asc:升序(默認,默認的意思是不加關鍵詞的時候默認爲生序排序)
        desc:降序
    3.如果有多個列排序,後面的列排序的前提是前面的列排好序以後有重複(相同)的值。

    例子:
    id    id2
    1    2
    2    3
    3    4
    4    1
    4    2

    語句:
    select id,id2
    from test
    order by id,id2 desc;
    
    結果:
    id    id2
    1    2
    2    3
    3    4
    4    2
    4    1
    注意:先排第一列,如果第一列有重複的值再排第二列,以此類推
需求:查看員工的id,名字和薪資,按照薪資的降序排序顯示。



2.限制查詢,即指定查詢條件進行查詢
    語法:
    select col_name,...
    from tb_name
    where col_name 比較操作表達式
    邏輯操作符
          col_name 比較操作表達式
    ...
    注意:
    1.限制查詢條件,使用where子句
    2.條件可以多個,使用邏輯操作符和()進行條件的邏輯整合
    3.where子句的優先級別最高
    4.比較操作表達式由操作符和值組成
        常見的操作:
        1》邏輯比較操作符
        =  >  <  >=  <=  !=
        2》不等於:三個都表示不等於的意思(經常用的是!=)
        !=   <>   ^=

需求:查看員工工資小於1000的員工id和名字
    select id,last_name,salary
    from s_emp
    where salary<1000;

        2》sql比較操作符
        between and:在什麼範圍之內
需求:查看員工工資在700 到 1500之間的員工id,和名字
    select id,last_name,salary
    from s_emp
    where salary between 700 and 1500;
        
        in(list):在一個列表中
需求:查看員工號1,3,5,7,9員工的工資
    select id,last_name,salary
    from s_emp
    where id in (1,3,5,7,9);
        
        like:模糊查詢,即值不是精確值時使用
        通配符,即可以代替任何內容的符號
        % :通配0到多個字符
        _ : 當且僅當通配一個字符

        轉義字符:

        默認爲\,可以指定 指定的時候用escape 符號指明即可,轉義字符只能轉義後面的一個字符


需求:查看員工名字以C字母開頭的員工的id,工資。
    select id,salary,last_name
    from s_emp

    where last_name like 'C%';


練習:查看員工名字長度不小於5,且第四個字母爲n字母的員工id和工資
    select id,salary,last_name
    from s_emp
    where last_name like '___n_%';
    
需求:查看員工名字中包換一個_的員工id和工資
    select id,salary,last_name
    from s_emp
    where last_name like '%\_%';

    select id,last_name,salary
    from s_emp
    where last_name like '%\_%' escape '\';


        is null:對null值操作特定義的操作符,不能使用=
需求:查看員工提成爲爲空的員工的id和名字
    select id,last_name,commission_pct
    from s_emp
    where commission_pct is null;

    3.邏輯操作符
    當條件有多個的時候使用
        and:且邏輯
        or:或邏輯
    注意:and邏輯比or邏輯要高
    not:非邏輯
需求:查看員工部門id爲41且職位名稱爲Stock Clerk(存庫管理員)的員工id和名字

 select id,last_name,title,dept_id
 from s_emp
 where dept_id = 41
    and title  = 'Stock Clerk';

    select id,last_name,dept_id,title
    from s_emp
    where dept_id = 41
    and  title = 'Stock Clerk';

練習:查看員工部門爲41 或者 44號部門 且工資大於1000的員工id和名字
    select id,last_name,dept_id,salary
    from s_emp
    where (dept_id =41  or dept_id =44)
    and  salary>1000;

    select id,last_name,dept_id,title
    from s_emp
    where salary > 1000
    and (dept_id = 41  or  dept_id = 44);
    
  查看員工部門爲41且工資大於1000 或者 44號部門的員工id和名字
    select id,last_name,dept_id,title
    from s_emp
    where salary > 1000
    and dept_id = 41
    or  dept_id = 44;

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