oracle 學習 筆記 隨筆

一、配置數據名稱的時候 有個SID 這個是ServiceID,服務ID,網絡鏈接使用的。建議數據名稱與SID一致。
   安裝oracle時候字符集選擇utf-8,示例方案打鉤。
   爲全部帳戶使用相同口令。設置口可能不符合要求不要緊。//OracleServiceORCL和OracleOraDb11g_home1TNSListener 設置爲手動,每次都須要啓動的服務。
二、SYS:超級管理員  system:普通管理員 scott:普通用戶  sh:
三、sqlplus命令,做爲oracle客戶端使用。sqlplus命令是有不少的。
四、select *from emp;發現命令行輸出很難看,標題出現換行的狀況。能夠設置每行顯示的數據長度:SET LINESIZE,設置分頁 set pagesize 100 (這個就屬於格式化操做,這個格式化沒什麼意義。) ,以上兩個頁面是總體頁面的格式化操做,也能夠對某一列設置操做(col job for a8)。
五、使用ed命令:ed hello  若是hello不帶後綴則默認打開 hello.sql,若是沒有則會建立(建立的位置在c盤用戶目錄下)。執行使用@hello程序員

六、顯示當前用戶 show user;不用用戶的切換:conn scott[/密碼], 若是是切換到sys超級管理員 須要使用as sysdba,conn sys/密碼 as sysdba,在sys下訪問emp表提示沒有試圖或表錯誤,由於emp是scott的表,可使用select *from scott.emp;
七、sqlplus 也能夠無用戶訪問 使用 sqlplus /nolog,使用這個後 show user 顯示爲空。
八、cmd 複製文件 使用copy 文件路徑 被複制的文件路徑。若是要在sqlplus裏使用copy 必需要加上host :host copy 文件路徑 被複制的文件路徑。//sql


數據表結構:
    sql:結構化的查詢語言。
    DML:數據操做語言  :數據更新查詢操做 (select,from,insert。。。。等),開發中主要以DML爲主
    DDL:數據定義語言  :數據表,約束,索引,等。//數據庫設計的時候使用。
    DCL:數據庫控制語言:數據庫權限操做。
在scott用戶下使用select *from tab 
    BONUS                                                        TABLE//工資表,此表如今沒有任何數據,下面表都有數據。
    DEPT                                                         TABLE//部門表
    EMP                                                          TABLE//僱員表
    SALGRADE                                                     TABLE//工資等級表
九、select *from //這裏的順序是 先from 在select。
    select sla*12 from emp//支持表達式
    select empno||1 from emp// ||字符鏈接
        select empno||emname from emp 和 select empno||'hello' from emp;//程序中雙引號,數據庫中字符串所有使用單引號
十、distinct:若是後面接了多個行這是對多個列的組合刪選。
十一、select * from where (from先執行,where第二,select最後執行),不等於符號 != 和 <>
    使用<* and >* 使用between and 區別:前者使用了關係和邏輯運算符,後者只是用了邏輯運算符,因此後者性能更高。
    between and 取日期區間的時候 日期使用的是字符串 例如:where between '01-1月 -81' and '01-1月 -91'
    where ename=null //關係數據庫中 null不是空也不是0,無法判斷,要使用 is null 關係表示。null不是0,null是特殊的運算符,必須用 is null判斷。
    IN操做符:根據一個指定的範用圍查詢,in操做符 能夠用or or 來實現,可是性能in更高,由於in是執行一次操做而or or 是有幾個or就執行幾回判斷。in中的條件能夠有空,不影響返回值,可是not in裏若是有空則無數據返回。
    like;「_」:任意一位    「%」:任意多位 ,like不分數據類,任何數據類型都支持like,例如: int like '%1%'  date like'%2%'
    :'_A%'  表示第二位是A字符後面任意。
十二、order by:order by是在select後面執行,因此可使用select 列定義的別名,這也是where後面不可使用的緣由,由於where在select以前執行
1三、oracle有一個虛擬表爲了作函數測試的,dual表 select lower('Hello') from dual;//upper();大寫
1四、select *from emp where empID=‘&inputName’//這裏輸入變量值
    select *from emp where eName=upper('&inputname')
1五、單行函數:lower,upper,initcap,length,replace(對象,被替換對象,替換的值),substr(),函數能夠嵌套使用,由於各個函數返回也是字符串,注意substr下標是從1開始,。
    負數索引設計:只有oracle中才有,例如像截取name的後三位字符,substr(name,-3),也能夠寫成 substr(name,length(name)-2).
    數值函數:針對數字進行處理,round(),trunc(),mod()。
        round(數值)//返回四捨五入值
        round(數值,2)//返回四捨五入值
        round(數值,-2)//返回四捨五入值
        trunc()與round差很少參數,直接去掉小數點後面的。若是數據後還有參數,小數後在取位數,若是這個參數是負數,則跟round差很少意思。
    日期函數(oracle本身特點):僞列,不在表的列中確能使用查詢語句的列值獲取。有sysdate,systimestramp。
    日期+數字:若干天以後
    日期-數字:若干天以前
    日期-日期:兩個時間的天數  //沒有日期+日期:由於太大。。。
    由於使用日期減去日期返回的數值沒有什麼意義,因此纔有日期函數的出現。
    計算兩個日期間所經歷的月數的總和:months_between(),add_months(日期,月數),last_day(日期)//日期本月的最後一天日期,next_day(sysdate,'星期二')//    
1六、轉換函數 to_char(),能夠將日期類型進行格式化輸出,to_char(sysdate,'yyyy-mm-dd')//oracle中這個格式化不區分大小寫。其實這個是沒什麼用的,只是在輸出的時候能夠格式化因此能夠經過這個函數得到日期的單獨年,月,日(to_char(sysdate,'yyyy'))。to_char(372787874837483,'9999,999,99,99')//對數字的轉換,9是表明數字不是意義上的9數字to_char(372787874837483,'L9999,999,99,99')//這裏返回本地貨幣格式。
to_date('1999-01-18','yyyy-mm-dd')//字符串轉日期函數,基本用不到
to_number(字符串)//字符串轉化爲數字  select to_number('1')+to_number('2') from dual 等價於: select ‘1’+‘2’from dual//oracle有一個在可行的範圍內自動轉換的功能。
1七、通用函數(oracle本身特點)
    Oracle裏提供有兩個簡單的數據處理函數 :nvl():nvl(comm,0), decode()
    一、處理Null:select ename,(sale+comm)*12 from emp//當sale或者comm裏面有一個null的值時候 (sale+comm)這個返回0,使用nvl(comm,0),表示comm爲空的時候使用默認值0,這是oracle的特點函數其餘數據庫沒,謹慎使用。
    二、decode()//  decode(列名,'匹配內容1','顯示內容1','匹配內容2','顯示內容2','默認值使用')//使用性別的顯示時候,0替換成女,1替換男場景使用。數據庫

1八、多表查詢:
    若是後面沒有條件,量表查詢出現的結果是量表的數量積(笛卡爾積),事實上笛卡爾積是一直是存在的,即便使用關聯關係消除了一些笛卡爾積,可是仍是存在,它對珍格格程序的影響是巨大的。
    oracle中有一個sh用戶,這個用戶下的數據表都是大數據的。
    
1九、消除笛爾積的方式有 內聯 和 外聯,where屬於內聯,外聯分爲左外 右外 全外鏈接(量表之和的數據顯示出來)。
20、數據集合操做:
    union, union all,intersect,minus。
    union:集合合併在一塊兒取消重複元素。select *from emp union select *from emp where deptNo=10
    union all:取並集,與上面相反。
    intersect:交集
    minus:減集  //若是前表的數據小於後表則沒有數據返回,由於集合中不存在負數。
    在集合操做之中有一件很是重要注意的事項,因爲集合表要求這若干個查詢結果所返回的數據結構必須相同,意思就是或者相同的表,並且查詢的列必須一致。網絡

2一、統計函數的使用:經常使用的:count(),sun(),min(),avg(),max()。
    當表中沒有數據的時候 只有count會返回數據即0,其餘幾個統計函數都沒有返回值。
    count(*),count(列) count(distinct 列)
2二、分組統計:group by後select後面要麼使用分組函數和group by的列,若是一條sql語句中沒有使用group by則select後面只能出現分組函數。若是出現嵌套的分組函數則該select後面不能出現任何列,原理同樣,由於group by後返回的是行列的集合也就是一個表,此時該表查詢是沒有使用group by語句的而嵌套後說明select後面使用統計函數,若是使用統計函數則不可以使用其餘列。
2三、oracle中的2個僞列:rownum,rowid
    rownum:select *from emp where rownum=1 // rownum只能獲取第一個 他不能獲取一個範圍的值,例如想獲取6-10行 不能夠用 rownum between 6 and 10,可是可使用rownum<6
若是要獲取6-10行,則這個是典型的一個分頁案例,可使用子查詢的方式,select *from (select rownum from emp rownum<currentPage*linePage) temp where temp.rownum>(currentPage-1)*linePage //linePage是一頁顯示的數據數量。
    rowid:rowId是oracle爲每一個數據分配的一個物理路徑標識,相似一個索引,格式都是每一個區域的地址標識。oracle裏能夠有重複且如出一轍的數據,可是該數據的rowid確定是不一樣的,因此若是要刪除重複幾條數據,只保留一條最早插入的數據(理論上物流地址的插入都是自增的,由於永遠不知道有多少數據插入,天然不多是自減的方法) 則可以下實現:delete from emp where rowid not in(select min(rowid) from emp e where e.id=xx group by e.id)    
2四、having:使用having的地方必定是有group by,由於having就是配合group by 使用的,having後面出現的是統計函數,由於where後面是無法使用統計函數的,這個跟sql的執行順序有關。where是在select後面的列以前執行,因此where後面沒法使用group by,可是having是在select後面的列以後的因此可使用 統計函數,而且在使用後select後面還可使用其餘列。
2五、數據數據類型:
    number:通常存儲數據類型,若是不想區分數據就使用這個,可是oracle充分考慮程序員的習慣還推出一個int,這個就是保存整數的數據,number(m,n)//n:小數位的長度,m-n爲整數位的長度
    varchar2:oracle是這個通常表明字符串,通常小於200的長度都用這個,其餘數據庫通常就叫varchar
    clob:大型文字信息 最大4G
    blob:保存圖片,音樂,電影等 最大4G
    date:日期類型,通常數據庫可能date只是日期,而datetime纔是日期時間。
2六、建立表oracle案例:
    create table member(
    m_id number,
    m_name varchar2(20) default '無名氏',
    m_date date default sysdate
    )
    注意:設置默認值,若是在默認值上插入null,則以插入時候的數據爲準,建立表的最後一個不用逗號。數據結構

相關文章
相關標籤/搜索