Oracle數據庫之第一篇

1 : Oracle 簡介 : 是美國ORACLE公司(甲骨文)提供的以分佈式數據庫爲核心的一組軟件產品,是目前最流行的客戶/服務器IP,端口,用戶名、密碼,點擊:鏈接
    (CLIENT/SERVER)或B/S體系結構的數據之一.
    
    2 : Oracle數據庫的體系結構:
        數據庫: database
            Oracle數據庫是數據的物理存儲.這就包括(數據文件ORA或者DBF,控制文件,聯機日誌,參數文件).其實Orcale數據庫的概念和其餘數據不同,這裏的數據庫是一個操做系統只有一個庫.能夠
            看作是Orcale就只有一個大數據庫.
        例如 :一個Oracle實例有一系列的後臺進程和內存結構組成.一個數據庫能夠有n個實例.
        
        數據文件(dbf) :
            數據文件是數據庫的物理存儲單位.數據庫的數據是存儲在表空間中的,真正是在某一個或者多個數據文件中.而一個表空間能夠由一個或多個數據文件組成,一個數據文件只能屬於一個表空間.
            一旦數據文件被加入到某個表空間後,就不能刪除這個文件,若是要刪除某個數據文件,只能刪除其所屬於的表空間才行.
        
        表空間 :
            表空間是Oracle對物理數據庫上相關數據文件(ORA或者DBF文件)的邏輯映射.一個數據庫再邏輯上被劃分紅一到若干個表空間,每一個表空間包含了在邏輯上相關聯的一組結構.每一個數據庫至少有一個表
            空間(稱之爲system表空間).
        
            每一個表空間由同一磁盤上的一個或多個文件組成,這些文件叫數據文件(datafile).一個數據文件只能屬於一個表空間.
        
        用戶 :
            用戶是在實例下創建的.不一樣實例中能夠建相同名字的用戶.表的數據,是用戶放入某一個表空間的,而這個表空間會隨機把這些表數據放到一個或者多個數據文件中.
                
            因爲oracle的數據庫不是普通的概念,oracle是有用戶和表空間對數據進行管理和存放的.可是表不是有表空間去查詢的,而是由用戶去查的.由於不一樣用戶能夠在同一個表空間創建同一個名字的表,表裏區分就是用戶了.
            
        
        Oracle 應用開發實戰
        1、Oracle 的基本概念和安裝
         Oracle 簡介
        ORACLE 數據庫系統是美國ORACLE 公司(甲骨文)提供的以分佈式數據庫爲核心的一
        組軟件產品,是目前最流行的客戶/服務器(CLIENT/SERVER)或B/S 體系結構的數據庫之一。
        好比SilverStream 就是基於數據庫的一種中間件。ORACLE 數據庫是目前世界上使用最爲廣
        泛的數據庫管理系統,做爲一個通用的數據庫系統,它具備完整的數據管理功能;做爲一個
        關係數據庫,它是一個完備關係的產品;做爲分佈式數據庫它實現了分佈式處理功能。但它
        的全部知識,只要在一種機型上學習了ORACLE 知識,便能在各類類型的機器上使用它。
         Oracle10g 的安裝
        1. 解壓oracle 數據庫安裝包,若是是win7 或者win8 系統右鍵點擊setup.exe 選擇兼容性,
        以xp 方式,而且以管理員方式運行,以及其餘全部用戶都按着此規則如圖
        
        2. 若是是xp 系統能夠直接並雙擊解壓目錄下的setup.exe,出現安裝界面,以下:
        3. 輸入口令和確認口令,如:baidu,點擊下一步,出現以下進度條,
        注:此口令便是管理員密碼。
        11
        4. 檢查先決條件,選中紅框所示的選擇框,以下圖:
        5. 點擊「下一步」,出現「概要」界面,點擊「安裝」。
        11
        6. 出現安裝進度條,等待安裝完成,以下圖:
        7. 安裝完成後,自動運行配置嚮導,以下圖,等待其完成:
        8. 完成後,出現「口令管理」界面,點擊「口令管理」,以下圖:
        11
        9. 將SCOTT 和HR 用戶的溝去掉(解鎖這兩個帳戶),以下圖所示,點擊「肯定」:
        10. 回到「口令管理」界面,點擊「肯定」,以下圖:
        11. 安裝結束,點擊「退出」。
        11
         虛擬網卡設置
        本機和虛擬機之間能相互訪問,它們的IP 段必須相同,可是本機將會鏈接不一樣的網絡
        環境(好比教室、宿舍、家庭),那麼本機的IP 段會產生變化就連不上虛擬機了,爲了避
        免這種狀況咱們讓本機和虛擬機之間用虛擬網卡的方式互相通訊,配置方式參考以下文檔:
         PLSQL Developer 客戶端工具的安裝
        1. 網絡的測試
        參考:
        11
        2. 安裝PLSQL Developer 客戶端
        3. 中文亂碼的處理
        2、Oracle 數據庫的體系結構
         數據庫:database
        Oracle 數據庫是數據的物理存儲。這就包括(數據文件ORA 或者DBF、
        控制文件、聯機日誌、參數文件)。其實Oracle 數據庫的概念和其它
        數據庫不同,這裏的數據庫是一個操做系統只有一個庫。能夠看做
        是Oracle 就只有一個大數據庫。
         實例:
        11
        一個Oracle 實例(Oracle Instance)有一系列的後臺進程(Backguound
        Processes)和內存結構(Memory Structures)組成。一個數據庫能夠有n
        個實例。
         數據文件(dbf):
        數據文件是數據庫的物理存儲單位。數據庫的數據是存儲在表空間中
        的,真正是在某一個或者多個數據文件中。而一個表空間能夠由一個
        或多個數據文件組成,一個數據文件只能屬於一個表空間。一旦數據
        文件被加入到某個表空間後,就不能刪除這個文件,若是要刪除某個
        數據文件,只能刪除其所屬於的表空間才行。
         表空間:
        表空間是Oracle 對物理數據庫上相關數據文件(ORA 或者DBF 文件)
        的邏輯映射。一個數據庫在邏輯上被劃分紅一到若干個表空間,每一個
        表空間包含了在邏輯上相關聯的一組結構。每一個數據庫至少有一個表
        空間(稱之爲system 表空間)。
        每一個表空間由同一磁盤上的一個或多個文件組成,這些文件叫數據文
        件(datafile)。一個數據文件只能屬於一個表空間。
         用戶:
        用戶是在實例下創建的。不一樣實例中能夠建相同名字的用戶。
        注: 表的數據,是有用戶放入某一個表空間的,而這個表空間會隨機把這
        些表數據放到一個或者多個數據文件中。
        因爲oracle 的數據庫不是普通的概念,oracle 是有用戶和表空間對
        數據進行管理和存放的。可是表不是有表空間去查詢的,而是由用戶
        去查的。由於不一樣用戶能夠在同一個表空間創建同一個名字的表!這
        裏區分就是用戶了!
        11
         SCOTT 用戶和HR 用戶
        Oracle 爲了讓學習者更好的進行學習,在安裝成功後,也建立了初始的用戶,其中SCOTT
        與HR 就是初始的普通用戶。這些用戶下面都默認存在了表結構,咱們重點掌握SCOTT 用戶
        下的全部表,以下所示:
        SCOTT 用戶下的表
        11
        HR 用戶下的表
        11
        3、基本查詢
         sql 簡介
        結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈɛs kjuː ˈɛl/ "S-Q-L"),結構
        化查詢語言是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數
        據庫系統;同時也是數據庫腳本文件的擴展名。結構化查詢語言是高級的非過程化編程語言,
        容許用戶在高層數據結構上工做。它不要求用戶指定對數據的存放方法,也不須要用戶瞭解
        具體的數據存放方式,因此具備徹底不一樣底層結構的不一樣數據庫系統, 可使用相同的結構
        化查詢語言做爲數據輸入與管理的接口。結構化查詢語言語句能夠嵌套,這使它具備極大的
        靈活性和強大的功能。
         DML(數據庫操做語言): 其語句包括動詞INSERT,UPDATE 和DELETE。它們分別用於添
        加,修改和刪除表中的行。也稱爲動做查詢語言。
         DDL(數據庫定義語言): 其語句包括動詞CREATE 和DROP。在數據庫中建立新表或刪除
        表(CREAT TABLE 或DROP TABLE);爲表加入索引等。DDL 包括許多與人數據庫目錄
        中得到數據有關的保留字。它也是動做查詢的一部分。
         DCL(數據庫控制語言):它的語句經過GRANT 或REVOKE 得到許可,肯定單個用戶和用戶
        組對數據庫對象的訪問。某些RDBMS 可用GRANT 或REVOKE 控制對錶單個列的訪
        問。
         Select 語句的語法格式和示例
        1. 查詢語法
        Select * |列名from 表名
        11
        2.別名用法
        在查詢的結果列中可使用別名
        Select 列名別名,列名別名,... from emp;
        別名中,有沒有雙引號的區別就在於別名中有沒有特殊的符號或者關鍵字。
        3.消除重複的數據
        Select distinct *|列名, ... from emp;
        使用distinct 能夠消除重複的行,若是查詢多列的必須保證多列都重複才能去掉重複
        4. 查詢中四則運算
        查詢每一個僱員的年薪
        select ename, sal*12 from emp;
        select ename, sal*12 income from emp;
        11
        Sql 中支持四則運算「+,-,*,/」
         什麼是空值?
         空值是無效的,未指定的,未知的或不可預知的值
         空值不是空格或者0 。
        注意:*、包含null 的表達式都爲null
        *、空值永遠不等於空值
        11
         鏈接符||
        字符串鏈接查詢
        Mysql 中實現方法:
        查詢僱員編號,姓名,工做
        編號是:7369 的僱員, 姓名是:smith,工做是:clerk
        字符串的鏈接使用‘||’
        4、條件查詢和排序
         使用where 語句對結果進行過濾
         比較運算符
        11
         其餘比較運算符
         邏輯運算符
         Where 語句示例
        1. 非空和空的限制
         示例:查詢每個月能獲得獎金的僱員
        分析:只要字段中存在內容表示不爲空,若是不存在內容就是null,
        語法:列名IS NOT NULL
        爲空列名IS NULL
        11
         範例:查詢工資大於1500 而且有獎金領取的僱員
        分析:多個查詢條件同時知足之間使用‘AND’
         範例:查詢工資大於1500 或者有獎金的僱員
        分析:多個查詢條件或知足,條件之間使用「OR」
         範例:查詢工資不大於1500 和沒有獎金的人
        語法:NOT(查詢條件)
        2.範圍限制
        範例:基本工資大於1500 可是小於3000 的所有僱員
        分析:sal>1500, sal<3000
        11
        Between and 等於sal > =1500 and sal <= 3000
        範例:查詢1981-1-1 到1981-12-31 號入職的僱員
        分析:between and 不只可使用在數值之間,也能夠用在日期的區間
        範例:查詢僱員名字叫smith 的僱員
        在oracle 中的查詢條件中查詢條件的值是區分大小寫的
        範例:查詢僱員編號是7369,7499,7521 的僱員編號的具體信息
        若是使用以前的作法可使用OR 關鍵字
        11
        實際上,此時指定了查詢範圍,那麼sql 可使用IN 關鍵字
        語法: 列名IN (值1,值2,....)
        列名NOT IN (值1, 值2,...)
        其中的值不只能夠是數值類型也能夠是字符串
        範例:查詢僱員姓名是’SMITH’,’ALLEN’,’WARD’的僱員具體信息
        3.模糊查詢
        在經常使用的站點中常常會有模糊查詢,即:輸入一個關鍵字,把符合的內容所有的查詢出
        來,在sql 中使用LIKE 語句完成。
        在LIKE 中主要使用如下兩種通配符
        「%」:能夠匹配任意長度的內容
        「_」:能夠匹配一個長度的內容
        範例:查詢出全部僱員姓名中第二個字符包含「M」的僱員
        在LIKE 中若是沒有關鍵字表示查詢所有
        11
        查詢名字中帶有「M」的僱員
        在oracle 中不等號的用法能夠有兩種形式「<>」和「!=」
        範例:查詢僱員編號不是7369 的僱員信息
        11
         使用order by 對結果排序
        1.排序的語法
        在sql 中可使用ORDER BY 對查詢結果進行排序
        語法:SELECT * |列名FROM 表名{WEHRE 查詢條件} ORDER BY 列名1 ASC|DESC,列名
        2...ASC|DESC
        範例:查詢僱員的工資從低到高
        分析:ORDER BY 列名默認的排序規則是升序排列,能夠不指定ASC,若是按着降序排列必
        須指定DESC
        11
        若是存在多個排序字段能夠用逗號分隔
        注意ORDER BY 語句要放在sql 的最後執行。
        2.排序中的空值問題
        當排序時有可能存在null 時就會產生問題,咱們能夠用nulls first , nulls last 來指定null 值
        顯示的位置。
        --查詢僱員的工資從低到高
        select * from emp order by sal nulls first;
        select * from emp order by sal desc nulls last ;
        11
        5、單行函數
         什麼是SQL 的函數?
         函數的類型
         單行函數
        11
         字符函數
        示例:
        接收字符輸入返回字符或者數值,dual 是僞表
        1. 字符串的鏈接可使用concat 可使用「||」建議使用「||」
        concat('hello', 'world')
        2. 字符串的截取,使用substr,第一個參數是源字符串,第二個參數是開始索引,第
        三個參數長度,開始的索引使用1 和0 效果相同
        substr('hello', 1,3)
        3. 獲取字符串的長度
        length('hello')
        4. 字符串替換,第一個參數是源字符串,第二個參數被替換的字符串,第三個是替換
        11
        字符串
        replace('hello', 'l','x')
         數值函數
         日期函數
         Oracle 中的日期:
        Oracle 中的日期型數據實際含有兩個值: 日期和時間。
        默認的日期格式是DD-MON-RR 。
         日期的數學運算
        在日期上加上或減去一個數字結果仍爲日期
        兩個日期相減返回日期之間相差的天數
        能夠用數字除24
         日期函數示例
        1. 範例:查詢僱員的進入公司的週數。
        分析:查詢僱員進入公司的天數(sysdate – 入職日期)/7 就是週數
        11
        2. 得到兩個時間段中的月數:MONTHS_BETWEEN()
        範例:查詢全部僱員進入公司的月數
        3. 得到幾個月後的日期:ADD_MONTHS()
        範例:求出三個月後的日期
         轉換函數
        11
         TO_CHAR 函數對日期的轉換
        日期的格式:
         TO_CHAR 函數對數字的轉換
        數字轉換的格式:
         TO_NUMBER 和TO_DATE 函數
        11
         示例:
        1. TO_CHAR:字符串轉換函數
        範例:查詢全部的僱員將將年月日分開,此時可使用TO_CHAR 函數來拆分
        拆分時須要使用通配符
        年:y, 年是四位使用yyyy
        月:m, 月是兩位使用mm
        日:d, 日是兩位使用dd
        在結果中10 如下的月前面被被補了前導零,可使用fm 去掉前導零
        2. TO_NUMBER:數值轉換函數
        TO_NUMBER 能夠把字符串轉換成數值
        3. TO_DATE:日期轉換函數
        TO_DATE 能夠把字符串的數據轉換成日期類型
        11
         通用函數
         什麼是通用函數?
        這些函數適用於任何數據類型,同時也適用於空值
         經常使用的通用函數
         通用函數示例
        1.空值處理nvl
        範例:查詢全部的僱員的年薪
        咱們發現不少員工的年薪是空的,緣由是不少員工的獎金是null,null 和任何數值計算都是
        null,這時咱們可使用nvl 來處理。
        11
         條件表達式
         什麼是條件表達式?
        在SQL 語句中使用IF-THEN-ELSE
         實現的方式:
        CASE 表達式:SQL99 的語法,相似Basic,比較繁瑣
        DECODE 函數:Oracle 本身的語法,相似Java,比較簡介
         CASE 表達式
         DECODE 函數
         條件表達式示例: 根據10 號部門員工的工資,顯示稅率
        6、多行函數
         什麼是多行函數?
        分組函數做用於一組數據,並對一組數據返回一個值。
        也叫:組函數、分組函數
        組函數會忽略空值;NVL 函數使分組函數沒法忽略空值
        11
         經常使用的多行函數
         多行函數示例
        1.統計記錄數count()
        範例:查詢出全部員工的記錄數
        不建議使用count(*),可使用一個具體的列以避免影響性能。
        2.最小值查詢min()
        範例:查詢出來員工最低工資
        3.最大值查詢max()
        範例:查詢出員工的最高工資
        11
        4.查詢平均值avg()
        範例:查詢出員工的平均工資
        5.求和函數sum()
        範例:查詢出20 號部門的員工的工資總和
         分組數據
        範例:查詢每一個部門的人數
        11
        範例:查詢出每一個部門的平均工資
        範例:查詢出來部門編號,和部門下的人數
        咱們發現報了一個ORA-00937 的錯誤
        注意:
        1. 若是使用分組函數,SQL 只能夠把GOURP BY 分組條件字段和分組函數查詢出來,
        不能有其餘字段。
        2. 若是使用分組函數,不使用GROUP BY 只能夠查詢出來分組函數的值
         過濾分組數據
        範例:查詢出部門平均工資大於2000 的部門
        11
         WHERE 和HAVING 的區別
        最大區別在於:where 後面不能有組函數
            
練習 SQL語句 :
            /*
                 基本查詢
                    select 列名|* from 表名
                */
                select * from emp;
                select emp.*,1+1 from emp;
                select 1+1 from emp where empno=7369--太麻煩
                --獲取系統時間
                select sysdate from dual;
                -------------------------------------------
                /*
                  dual  虛擬表 沒有實際意義 爲了補全oracle數據庫查詢語法
                */
                --查看虛擬表
                select * from dual;
                select 1+1 from dual;
                /*
                  查詢員工表中全部記錄
                */
                select * from emp;
                --查詢員工的編號和姓名
                select empno,ename from emp;
                --給列起別名特殊字符(#$)和數字須要使用雙引號處理
                select empno as "員工編號",ename "員工姓名",job 工做 from emp;

                select empno  "員工!編號",ename "員工姓名",job 工做 from emp;

                select empno  "員工!編號",ename "員工姓名",job "工 做" from emp;

                select empno  "員工!編號",ename "員工姓名",job 123 from emp;

                select empno  "員工!編號",ename "員工姓名",job 工#做 from emp;
                --查詢員工的工做 --distinct 關鍵字去重重複記錄
                select distinct job from emp;
                --查詢員工的年薪  null值參與運算結果爲空
                --使用nvl函數處理空值  nvl(v1,v2) v1是被判斷的數值  v1爲空v2是返回值                                                --  不爲空 返回v1
                select sal*12+comm from emp;
                select sal*12+nvl(comm,0) 年薪 from emp;
                --列值的拼接  員工編號7369員工姓名SMITH
                --mySql 能夠用一個函數 concat實現
                --oracle數據庫使用concat函數實現  oracle只支持兩個參數作拼接
                select concat('員工編號',empno) from emp;
                select concat(concat('員工編號',empno),'員工姓名') from emp;--多重嵌套實現麻煩
                --oracle數據庫 特有鏈接符 ||
                --java '員工編號'+empno+'員工姓名'+ename 
                select '員工編號: '||empno||'員工姓名: '||ename 員工簡介 from emp;

                /*
                  條件查詢
                      須要使用關鍵字 where 條件 目的是過濾出知足條件的記錄
                      where 後的條件表達式
                           比較運算表達式   > < >= <=  =  != <>
                           邏輯運算        and   or   not
                           其餘運算     between  and  判斷區間 包含邊界
                                        in      not  in  判斷範圍
                                        like   模糊查詢   %  匹配0個或多個
                                                          _  佔位一個字符
                                        is null  is not null 判斷空值
                */
                ---查詢員工的工做不是MANAGER的員工信息
                select * from emp where job !='MANAGER';
                select * from emp where job <>'MANAGER';
                --查詢員工工做是SALESMAN 而且工資>1500的員工信息
                select * from emp where job = 'SALESMAN' and sal >1500
                select * from emp where job = 'SALESMAN' or sal >1500
                --查詢員工的工資在 1500 和3000範圍內
                select * from emp where sal between 1500 and 3000;--會不會提取正好1500和3000?
                --查詢員工的工做 是MANAGER 或  PRESIDENT
                select * from emp where job ='MANAGER' or job = 'PRESIDENT'
                --使用in來實現
                select * from emp where job in ('MANAGER','PRESIDENT')
                --查詢員工姓名包含M的員工信息
                select * from emp where ename like '%M%'
                --查詢員工姓名第二位爲M的員工信息
                select * from emp where ename like '_M%'
                --查詢有獎金的員工信息
                select * from emp where comm is not null
                --過濾獎金爲0的數據
                select * from emp where comm is not null and comm != 0
                select * from emp where comm >  0

                /*
                  根據需求對數據作排序
                     order by 列 排序類型
                          倒敘   desc
                          正序   asc  默認的 能夠不寫
                */
                --查詢員工數據 按照工資作倒敘排序
                select * from emp order by sal desc 
                select * from emp order by sal       --默認正序
                --按照獎金倒敘排序 取第一位最高工資的
                select * from emp order by comm desc 
                --空值倒敘排序 默認在記錄之上  處理null值顯示記錄結尾
                --nulls  last 指定空值記錄 置於記錄末尾
                select * from emp order by comm desc  nulls last
                select * from emp order by comm   

                /*
                  函數 
                      單行函數
                         理解概念: 針對每條記錄中的數值處理 只會影響本條記錄
                                    影響多少條 返回多少條  nvl()
                          數值函數
                          字符函數
                          日期函數
                          轉換函數
                          通用函數
                      多行函數  聚合函數
                          理解概念: 針對表中多條記錄參與運算 結果是一條記錄
                         count()  統計記錄數
                         sum()    求和運算
                         avg()    求平均值
                         min()    求最小值
                         max()    求最大值
                */
                /*
                  數值函數  對數值作處理的函數
                    四捨五入  round(v1,v2) v1是原始的數值,v2是保留的小數位數
                    截取      trunc(v1,v2) v1是原始的數值,v2是保留的小數位數  不作四捨五入
                    取餘數   mod(v1,v2)   10%3   答案 --1
                */
                --47.628四捨五入操做
                select round(47.628) from dual;  --48 默認小數位0
                select round(47.628,0) from dual; --48
                select round(47.628,1) from dual; --47.6
                select round(47.628,2) from dual; --47.63
                select round(47.628,-1) from dual; --50 
                select round(47.628,-2) from dual; --0
                --47.628截取操做
                select trunc(47.628) from dual;  --47
                select trunc(47.628,0) from dual; --47
                select trunc(47.628,1) from dual; --47.6
                select trunc(47.628,2) from dual; --47.62
                select trunc(47.628,-1) from dual; -- 40
                select trunc(97.628,-2) from dual; --0
                --mod函數求餘數
                select mod(10,3) from dual;  --1
                /*
                  字符函數  對字符串處理
                     獲取字符串長度    length()
                     截取字符串       substr(v1,v2,v3) v1是原始字符串 v2是截取起始位 v3 截取的長度
                     替換字符串       replace(v1,v2,v3) v1是原始字符串 v2被替換的字符串 v3 替換後的字符
                                       替換匹配的全部字符
                     大小寫轉換  upper()  lower()
                        用於驗證碼  Xy8Yo  xy98yo  XY8YO
                */
                ---abcde
                select length('abcde') from dual;
                ---截取字符串 從0和1開始都是第一位開始截取
                select substr('abcde',0,2) from dual; --ab 
                select substr('abcde',1,2) from dual; -- ab
                select substr('abcde',-1,2) from dual; -- e
                select substr('abcde',-2,2) from dual; -- de
                --替換字符串
                select replace('hello','l','o') from dual; --heooo 
                --查詢員工表中姓名爲SMITH
                select * from emp where ename=upper('smith');
                select * from emp where ename=upper('SMITH');
                select * from emp where ename=upper('SmiTH');
                /*
                  通用函數
                    nvl(v1,v2) 處理空值使用  v1爲空返回v2
                                             不爲空是v1自己
                    nvl2(v1,v2,v3) v1是被判斷的數值 不爲空v2是返回值 爲空v3也是返回值
                    concat(v1,v2)  只能傳兩個參數 作拼接使用
                */
                select nvl2(null,2,3) from dual; 
                /*
                  轉換函數
                    數值和字符的轉換
                    日期和字符的轉換
                    轉換數值 to_number('123')
                    轉換字符 to_char(v1,v2) v1是被轉換的數據v2是轉換後的格式
                    轉換日期 to_date(v1,v2) v1是被轉換的字符(日期格式的字符串) v2是轉換的日期格式
                */
                select to_number('123') +1 from dual;--124
                select '123'+1 from dual; --to_number 有點雞肋
                --查詢員工的工資800 9000 將工資轉換成貨幣格式
                select to_char(sal,'$9,999,999.00') from emp;
                ---日期和字符的互換
                --查詢當前日期 轉換字符
                select to_char(sysdate,'yyyy-mm-dd') from dual;
                select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;--oracle數據分鐘使用mi
                select to_char(sysdate,'yyyy') from dual;
                select to_char(sysdate,'mm') from dual;
                select to_char(sysdate,'dd') from dual;
                select to_char(sysdate,'day') from dual;--獲取星期
                ---字符串轉日期
                select to_date('2017-09-13','yyyy-mm-dd') from dual;
                select to_date('2017-09-13 11:56:56','yyyy-mm-dd hh:mi:ss') from dual;
                select to_date('2017-09-13','yyyy-mm-dd hh:mi:ss') from dual;--若是是JSP頁面取日期 00:00:00 
                select to_date('2017-09-13 23:56:56','yyyy-mm-dd hh24:mi:ss') from dual;--24代表24小時制
                /*
                  日期函數
                  獲取系統時間 sysdate
                  給系統增長時間 add_months(v1,v2) v1是時間,v2是增長的月數
                  獲取系統時間間隔的月數  months_between(v1,v2) 兩個參數都是日期
                */
                --查詢3個月以後的日期
                select add_months(sysdate,3) from dual;
                --獲取間隔的月數  獲取員工到目前爲止入職多少個月
                select months_between(sysdate,hiredate) from emp;
                --獲取間隔的天數 日期和日期作運算結果爲天數
                select round(sysdate-hiredate) from emp;
                /*
                  多行函數 聚合函數
                      特色是 空值記錄不參與運算  忽略空值的記錄
                         count()  統計記錄數
                         sum()    求和運算
                         avg()    求平均值
                         min()    求最小值
                         max()    求最大值
                */
                --統計員工表記錄數若是表中存在索引 三種形式效率一致 
                --          若是沒有索引 使用後兩種
                select count(*) from emp;  ---公認沒有索引效率最低
                select count(empno) from emp;
                select count(100) from emp;
                --使用獎金列做統計
                select count(comm) from emp;  --4
                select sum(comm) from emp;  --2200
                select avg(comm) from emp;  --550
                /*
                  聚合函數搭配分組使用
                     group by 分組的列
                       分組後過濾數據使用 having
                       分組以前使用where 
                    使用規則
                       若是使用group by作分組 那麼 select 語句中只能查詢分組使用的列
                                               和 聚合函數
                */
                --查詢每一個部門的平均工資
                select deptno,avg(sal) from emp group by deptno
                --多個列做分組
                select ename,deptno,avg(sal) from emp group by deptno,ename
                --將job和部門作分組
                select job,deptno,count(*) from emp group by deptno,job
                --查詢部門平均工資>2000的部門編號
                select deptno,avg(sal) from emp group by deptno having  avg(sal) >2000
                --起別名作條件  oracle不能夠 mySql能夠
                select deptno,avg(sal) s from emp group by deptno having  s >2000
                --mySql 和oracle都不能夠
                select sal s from emp where s>1500  --條件不識別別名
                --查詢部門中員工的工資大於1500的部門平均工資
                select deptno,avg(sal) from emp where sal>1500 group by deptno;
                select deptno,avg(sal) from emp  group by deptno;
                /*
                  條件表達式  if.. 處理語句  else
                  是全部sql數據庫都支持的  
                  case 判斷列
                    when 列值 then
                      顯示值
                    when 列值 then
                      顯示值
                    else
                      默認值
                  end 
                */
                --查詢員工的工做 使用漢字顯示  MANAGER 經理  PRESIDENT 總裁
                select case job 
                   when 'MANAGER' then
                      '經理'
                    when 'PRESIDENT' then
                      '總裁'
                    else
                      '普通員工'
                    end
                    from emp;
                --默認值不寫  匹配不上顯示空
                select case job 
                   when 'MANAGER' then
                      '經理'
                   when 'PRESIDENT' then
                      '總裁'
                    end
                    from emp;
                ---數據庫oracle  有個特有條件表達式 decode(v1,v2,v3) v1是被判斷的列,v2是等於值,v3是顯示值
                select decode(job,'MANAGER','經理','PRESIDENT','總裁','普通員工') from emp;

練習2 :
        1. 查詢工資大於12000的員工姓名和工資

        2. 查詢員工號爲176的員工的姓名和部門號

        3. 選擇工資不在5000到12000的員工的姓名和工資

        4. 選擇僱用時間在1998-02-01到1998-05-01之間的員工姓名,job_id和僱用時間

        5. 選擇在20或50號部門工做的員工姓名和部門號

        6. 選擇在1994年僱用的員工的姓名和僱用時間

        7. 選擇公司中沒有管理者的員工姓名及job_id

        8. 選擇公司中有獎金的員工姓名,工資和獎金級別

        9. 選擇員工姓名的第三個字母是a的員工姓名

        10. 選擇姓名中有字母a和e的員工姓名

        11. 顯示系統時間

        12. 查詢員工號,姓名,工資,以及工資提升百分之20%後的結果(new salary)

        13. 將員工的姓名按首字母排序,並寫出姓名的長度(length)

        14. 查詢各員工的姓名,並顯示出各員工在公司工做的月份數

        15. 查詢員工的姓名,以及在公司工做的月份數(worked_month),並按月份數降序排列

        select * from employees;
        select first_name,salary from employees where salary > 12000;
        select first_name,manager_id from employees where employee_id = 176;
        select first_name,salary from employees where salary < 5000 or salary > 12000;
        select first_name,job_id,hire_date from employees where hire_date > 1998-02-01 and hire_date < 1998-05-01;
        select FIRST_NAME "名字",employee_id "員工id",hire_date "入職時間" from EMPLOYEES where hire_date between '1-2月-1998' and '1-5月-1998';
        select first_name,department_id from employees where department_id = 20 or department_id = 50;
        select first_name,hire_date from employees where hire_date between '1-1月-1994' and '31-12月-1994';
        select first_name,salary,commission_pct from employees where commission_pct is not null and commission_pct != 0;
        select first_name from employees where first_name like '__a%';
        select first_name from employees where first_name like '%a%e%' or first_name like '%e%a%';
        select employees.*,1+1 from employees;
        select sysdate from dual;
        select employee_id,first_name,salary,salary*1.2 from employees;
        select first_name,length(first_name) from employees order by substr(first_name,0,1) desc;

        select first_name,months_between(sysdate,hire_date) from employees;
        select first_name,round(months_between(sysdate,hire_date)) from employees;
        select first_name,round(months_between(sysdate,hire_date)) from employees order by round(months_between(sysdate,hire_date)) desc;
        select first_name,job_id from employees where manager_id = 0 or manager_id is null;
相關文章
相關標籤/搜索