天天看點

Oracle資料庫之第一篇

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。

本文連結:https://blog.csdn.net/zhao1299002788/article/details/101757751

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 應用開發實戰
		一、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. 中文亂碼的處理
		二、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
		三、基本查詢
		 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
		字元串的連接配接使用‘||’
		四、條件查詢和排序
		 使用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
		五、單行函數
		 什麼是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 号部門員工的工資,顯示稅率
		六、多行函數
		 什麼是多行函數?
		分組函數作用于一組資料,并對一組資料傳回一個值。
		也叫:組函數、分組函數
		組函數會忽略空值;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;           

複制