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;