Oracle的簡介經本人修改_第1頁
Oracle的簡介經本人修改_第2頁
Oracle的簡介經本人修改_第3頁
Oracle的簡介經本人修改_第4頁
Oracle的簡介經本人修改_第5頁
已閱讀5頁,還剩74頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、 Oracle的簡介Oracle最大最流行的數據庫。(收購java sun公司)My SQL(sun):小型(因為Oracle涉嫌壟斷而保留)SQLServer(2008):微軟公司,中型。Net平臺結合緊密Oracle:拉里.矮里森DB2:IBM(藍色巨人)PC,服務器(大型數據庫)二、 Oracle的安裝與卸載1. Oracle的安裝【建議】這些服務盡量使用手動的方式啟動,否則會影響系統的啟動時間。OracleOrgDb10G_HOME1TNSListener:表示監聽服務,如果客戶端想連接數據庫,此服務必須打開,在日后的程序開發中,此服務起作用OracleServiceXXX:表示數

2、據庫的主服務,命名規則OracleService數據庫名,此服務必須啟動,否則Oracle無法使用。2. Oracle的卸載Oracle的卸載最好按如下步驟完成:(1) 直接運行卸載程序(2) 刪除硬盤上的殘留程序,如果刪除不了,則進入安全模式下進行刪除。(3) 直接進入注冊表中,刪除與Oracle相關的配置項。(4) 終極方法?3. 監聽問題監聽服務是Oracle數據庫中最主要的一個服務,但這個服務會經常出問題,所以下面給出最常見的兩種解決方案:(1) 注冊表使用了優化軟件,刪除了相關選項。對于每一個服務,都會在注冊表中有所保存,那么Oracle監聽服務的注冊項是:HKEY_LOCAL_MA

3、CHINESYSTEMCurrentControlSetServicesOracleOraDb10g_home1TNSListener,里面有一個“ImagePath”的選項,這個選項有可能在使用優化軟件的時候被刪除,如果被刪除,則應按照如下的方式建立這個項,并寫上相應的內容:D:oracleproduct10.2.0db_1BINTNSLSNR【建議】盡量不要使用優化大師這類的優化軟件4. sqlplus命令(重點)對于Oracle數據庫操作主要使用命令行方式,而所有的命令都使用sqlplus完成,對于sqlplus有兩種方式:l 一種是dos風格的sqlplus: sqlplus.exe;

4、l 一種是windows風格的sqlplus: sqlplusw.exe;在Oracle10g之中主要使用的是sqlplusw命令,因為其可以進行一些顯示數據的調整(這些調整對于以后的程序開發而言沒有任何意義,只是顯示風格的區別)。【掌握兩個格式設置命令】Set linesize 300; /設置每行顯示的記錄長度Set pagesize 30; /設置每頁顯示的記錄長度這兩個命令在sqlplus下的設置沒什么效果。雖然sqlplusw顯示上更方便一些,但是對于命令的編輯上卻不是很方便,特別是修改錯誤的拼寫時。所以在sqlplusw中提供了ed和指令,可以進行記事本的調用和執行。l 使用ed指

5、令,調用記事本程序:ed a;l 使用指令,執行記事本中的查詢:a;我們也可以使用編輯軟件,在外部編輯程序,那么在sqlplusw中調用外部文件時,必須制定完整路徑:d:test.txt;【查看表的命令】Select * from tab;【查看當前登錄用戶的命令】Show user;Select * from session_privs;【切換登錄用戶的命令】Conn 用戶名/密碼 as sysdba(超級管理員);DBA:數據庫系統管理員(5年以上的Oracle維護經驗)【注意】當我們切換到 SYS 用戶的時候,則不能直接查詢EMP表,因為EMP表屬于具體的某個用戶,如果需要用SYS身份去

6、訪問具體的某個用戶的某個表的時候,需要采用如下的方式:Select * from用戶名.表名一旦使用超級管理員身份登錄,我們可以使用命令手工關閉或打開數據庫:超級管理員關閉只能超級管理員開啟關閉數據庫命令:SHUTDOWN IMMEDIATE;一旦關閉數據庫之后,則無法使用正常的用戶進行sqlplusw命令登錄,那么我們可以先使用sqlplus登錄,再使用超級管理員身份登錄,然后再啟動數據庫,啟動數據庫的命令是:用sqlplus 登陸sys/ change as sysdba賬號,然后輸入如下命令:STARTUP;三、 SQL語法學習(一)scott用戶的表結構【查看表結構命令】DESC 表名

7、;(二)SQL簡介SQL(Strutctured Query Language,結構化查詢語言)是一個功能強大的數據庫語言。SQL通常用于與數據庫的通訊。ANSI(美國國家標準學會)聲稱,SQL是關系數據庫管理(面向對象型的數據庫:不成熟)(使用面向對象的開發語言和關系型數據庫之間進行交互的時候,會產生一種阻抗不匹配,為了避免這種不匹配 ,后面要學習一種ORM(Object RelationShip Mapping)的框架,有hql語句)系統的標準語言。SQL功能強大,概括起來,它可以分成以下幾類:l DML(Data Manipultation Language,數據操作語言):用于檢索或修

8、改數據。(數據的增刪改查)l DDL(Data Definition Language,數據定義語言):用于定義數據的結構,如創建、修改或者刪除數據庫對象(表、序列、索引、視圖)。l DCL(Data Control Language,數據控制語言):用于定義數據庫用戶的權限。(三)簡單查詢簡單查詢是指查詢出一張表中的所有數據。簡單查詢的基本格式:SELECT DISTINCT * |字段列名,| FROM 表名別名【范例】查詢出dept表中的全部記錄Select * from dept;【范例】查詢出每個雇員的編號、姓名、基本工資Select empno,ename,salFrom emp;

9、【范例】從EMP表中查詢出所有的職位Select distinct(不同的,獨一無二) jobFrom emp;【注意】 在簡單查詢中,可以使用四則運算的運算符。+-*/【范例】查詢每個員工的姓名、職位、年薪。 Select ename,job,sal*12 (as) income From emp;【注意】as可以省略,別名盡量不要使用中文在簡單查詢中,也可以使用“|”連接查詢的字段【范例】|的使用(表示將查詢結果連接起來)Select ename|job from emp;Select ename|,|job from emp;注意,單引號表示的是字符串。【范例】要求數據按如下的方式顯示:

10、“雇員編號是:xxx的雇員姓名是:nnn,基本工資是:$,職位是:ABC!” Select 雇員編號是:|empno| 的雇員姓名是:|ename| ,基本工資是:|sal| ,職位是:|job From emp;(四)限定查詢限定查詢就是在之前的語法基礎上增加了一個WHERE子句,用于指定限定條件,此時的語法如下:SELECT DISTINCT *| 字段 別名 , FROM 表名稱 別名 where 限定條件;在WHERE子句之后可以增加多個條件,最常見的條件就是基本的關系運算:>、<、>=、<=、!=(<>)、BETWEE.AND、LIKE、IN、IS

11、 NULL、AND、OR、NOT;1.關系運算【范例】查詢月薪大于1500的員工信息Select * From empWhere sal>1500;【范例】查詢所有職位是辦事員(CLERK)的職員信息Select *From empWhere jOb=CLERK;注意Oracle里面的數據是區分大小寫(字段名不區分大小寫)。字符串要用” ”分開【范例】查詢所有月薪大于等于1100的辦事員的員工信息SELECT * FROM empWhere sal>=1100 and job=CLERK;【范例】查詢出所有辦事員或銷售人員的員工信息SELECT * FROM EMPWHERE jo

12、b=CLERK OR JOB=SALESMAN;【范例】查詢出工資大于1300的辦事員或銷售人員的員工信息SELECT * FROM EMPWHERE (job=CLERK OR JOB=SALESMAN) AND SAL>1300;注意: 兩個條件相連如果條件過長最好用括號括起來;【范例】查詢所有職位不是辦事員的員工的信息。SELECT *FROM EMPWHERE JOB <>CLERK;2.范圍判斷:BETWEENAND【范例】要求查詢出工資在1500到3000范圍之內的員工信息。Select * from emp where sal between 3000 and

13、1500; 注意 BETWEENAND(包含邊界)不僅只對數字有效,對日期也是有效的。(日期格式要參照數據庫里數據的具體信息)【范例】要求查詢出1981年雇傭的所有員工的信息。Select *From empWhere hiredate between 01-1月-81 and 31-12月-81;3.判斷是否為空:IS(NOT) NULL使用此語法可以判斷某一個字段上的內容是否是”null”,注意null和數字0以及空字符串是兩個概念。【范例】查詢出所有領取獎金的員工信息Select * From empWhere comm is not null;4.指定范圍的判斷:IN(NOT IN)操

14、作符IN操作符表示指定一個查詢的范圍【范例】查詢出雇員編號是:7369、7566、7799的雇員信息。 Select *From empWhere empno in (7369,7566,7799);5.模糊查詢:LIKE子句(重點)LIKE子句提供了模糊查詢的功能,但注意,和搜索引擎的查詢是不同的。LIKE子句中常用的兩個匹配符號:l 匹配單個字符:_l 匹配任意多個字符:%【范例】要求查詢雇員姓名中以字母A開頭的全部雇員信息。Select *From empWhere ename like A%;【范例】要求查詢出雇員姓名中第二個字母是A的全部雇員信息。Select *From empWh

15、ere ename like _A%;【范例】要求查詢出雇員姓名中帶有字母A的雇員Select *From empWhere ename like %A%;也可以使用NOT操作符,對操作進行求反的功能:【范例】要求查詢出雇員姓名中不帶有字母A的雇員Select *From empWhere ename not like %A%;Lucene:全文搜索引擎:基于索引(如同字典里的偏旁索引或拼音索引);(數據庫里的sql語句查詢是逐條查詢)SEO:搜索引擎優化()(五)數據的排序使用ORDER BY子句指定所需字段的排序,排序的語法格式:SELECT DISTINCT *| 字段 別名 , FRO

16、M 表名稱 別名 WHERE 條件(s) ORDER BY 字段 ASC|DESC , 字段 ASC|DESC , 注意 ORDER BY子句是寫在所有的SQL語句最后的內容,而且對于排序有以下幾點說明:l 排序的時候可以指定多個排序的字段;l 排序的方式有兩種:升序(ASC)默認,降序(DESC)【范例】要求查詢出所有的雇員信息,按照工資由高到低排序,如果工資相同,則按照雇傭日期有早到晚排序。Select * From empOrder by sal desc,hiredate;(六)單行函數的使用雖然各個數據庫都是支持SQL語句的,但是每一個數據庫也有每一個數據庫自己所支持的操作函數,這就

17、是單行函數,而如果要想進行數據庫開發的話,除了要會使用SQL之外,還要多學習函數。單行函數主要分為以下五類:字符函數、數字函數、日期函數、轉換函數、通用函數。1.字符函數字符函數的功能主要是進行字符串數據的操作,下面給出幾個字符函數:(對查出的字符串結果進行操作,數據本身并無變化)l UPPER(字符串|列):將輸入的字符串變為大寫返回;l LOWER(字符串|列):將輸入的字符串變為小寫返回;l INITCAP(字符串|列):開頭首字母大寫;l LENGTH(字符串|列):求出字符串的長度;l REPLACE(字符串|列):進行替換;l SUBSTR(字符串|列,開始點結束點):字符串截取;

18、【范例】觀察轉小寫的操作,將所有的雇員姓名按照小寫字母返回注1:查詢結果列名是按查詢列名顯示的,如下面的例子,列名是lower(name) ,通常我們會用as(可省)重命名。注2: 函數都是對“列名”進行操作,對顯示的列的結果就行操作。Select lower(ename) from emp;【范例】將每一個雇員姓名的開頭首字母大寫 Select initcap(ename) from emp;【范例】查詢出每個雇員姓名的長度Select ename,length(ename) from emp;【范例】要求查詢出姓名長度正好是5的雇員信息 Select * From empWhere len

19、gth(ename)=5;【范例】使用字母”_”替換掉姓名中的所有字母“A”Select replace(ename,A,_) from emp;字符串截取操作有兩種語法:l SUBSTR(字符串|列,開始點):表示從開始點一直截取到結尾;Eg: SELECT ename,SUBSTR(ename,3) FROM emp;l SUBSTR(字符串|列,開始點,截取多少):表示從開始點截取到結束點,截取部分內容;Eg: SELECT ename,SUBSTR(ename,0,3) FROM emp; SELECT ename,SUBSTR(ename,1,3) FROM emp;【范例】要求截取

20、每個雇員姓名的后三個字母<1>正常思路:通過長度-2確定開始點 Select ename,substr(ename,length(ename) -2) from emp;<2>新思路:設置負數,表示從后指定截取位置;Select ename,substr(ename,-3) from emp;注:(面試題)問substr下標是從1開始還是從0開始截取的。答:都一樣;(其實是從1開始的,這樣好理解)2.數字函數l ROUND(數字|列,保留小數的位數):四舍五入的操作。l TRUNC(數字|列,保留小數的位數):舍棄指定位置的內容。(注:就是不進位)l MOD(數字1 ,

21、數字2):取模,取余數。【范例】驗證ROUND函數SELECT ROUND(903.53576),ROUND(-903.53576),ROUND(903.53576,2), ROUND(903.53576,-1) FROM dual;負數表示從整數開始截取。無參數表示省略小數部分內容。 注意 dul是Oracle數據庫為用戶方便,提供的一個虛擬表。【驗證TRUNC函數】SELECT TRUNC (903.53576), TRUNC (-903.53576), TRUNC (903.53576,2), TRUNC (903.53576,-1) FROM dual;【驗證MOD函數】SELECT

22、MOD(10,3) FROM dual;3.日期函數要取得當前的日期,可以使用”SYSDATE”取得。Eg:SELECT SYSDATE FROM dual;在日期中也可以進行若干計算:日期 +/- 數字=日期,表示若干天之后/之后的日期。Eg:SELECT SYSDATE+3 FROM dual;【范例】求出每個雇員到今天為止的雇傭天數 Select ename, trunc(sysdate-hiredate) From emp;對于日期,還提供了如下四個操作函數:l LAST_DAY(日期):求出指定日期所屬月份的最后一天;【范例】求出本月的最后一天的日期SELECT LAST_DAY(S

23、YSDATE) FROM dual;l NEXT_DAY(日期,星期數):求出指定日期下一個指定星期X的日期;注:星期數如果用漢字就對應,如果用數字按外國算法,星期日算是1;【范例】求出下一個周一的日期SELECT NEXT_DAY(SYSDATE,星期一) FROM dual;l ADD_MONTHS(日期,數字):求出若干個月之后的日期;Eg:SELECT ADD_MONTHS(SYSDATE,4) FROM dual;l MONTHS_BETWEEN(日期1,日期2):求出兩個日期之間所經歷的月數l【范例】求出每個雇員到今天為止的雇傭月數SELECT ename,hiredate,MON

24、THS_BETWEEN(SYSDATE,hiredate) FROM emp;SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp;【注意】在所有的開發之中,如果是日期的操作,建議使用以上的函數,因為這些函數可以避免閏年的問題。注:用到自己建的表的信息就無需使用daul表了;依然是操作日期字段。4.轉換函數(核心)轉換函數主要完成數據間的相互轉換的操作,一共有三種轉換函數:l TO_CHAR(字符串|列,格式字符串):將日期或者是數字變為字符串顯示;l TO_DATE(字符串,格式字符串):將字符串變為DAT

25、E數據顯示;l TO_NUMBER(字符串):將字符串變為數字顯示;<1>TO_CHAR()函數系統時間是按照“日-月-年”的格式顯示,如果想要換成正常的“年-月-日”格式顯示,這種情況下可以使用TO_CHAR()函數,有些常用的格式字符串需要大家記住:年(yyyy),月(mm),日(dd)。Eg:SELECT TO_CHAR(SYSDATE,yyyy-MM-dd hh-mi-ss) from dual;如果需要去掉前導0,可以加入一個fm來實現。Eg:SELECT TO_CHAR(SYSDATE, fmyyyy-mm-dd) from dual;要想顯示時間,則需要增加標記:Eg

26、:SELECT TO_CHAR(SYSDATE,fmyyyy-mm-dd hh:mi:ss) day FROM dual;【注意】使用TO_CHAR()函數之后,所有的內容都是字符串,不再是之前的DATE型數據。TO_CHAR()函數也可以用于數字的格式上,這個時候每一個“9”表示一位數字的概念,而不是數字9的概念。Eg:select to_char(32884858585,L999,999,999,999,999) from dual;其中的字母“L”表示的是“Local”的含義,即當前所在的語言環境下的貨幣符號。<2>TO_DATE()函數此函數的主要功能是將一個字符串變為DA

27、TE類型數據。Eg:select to_date(1999-03-22,yyyy-mm-dd) from dual;一般此函數在更新數據庫的時候使用較多.<3>TO_NUMBER()函數:用的較少TO_NUMBER()函數是將字符串變數字。Eg:select to_number(1)+to_number(2) from dual;Eg:select 1+2 from dual;5.通用函數(核心)通用函數主要有兩個:NVL()、DECODE(),這兩個函數算是Oracle自己的特色函數。<1>NVL()函數,處理null(將null換為0);【范例】要求查詢出每個雇員的

28、全部年薪SELECT ename,sal,comm,(sal+comm)*12 from emp;修改:Select ename, (sal+NVL(comm,0)*12 from emp;<2>DECODE()函數:多數值判斷DECODE()函數非常類似于程序中的ifelse語句,唯一不同的是DECODE()函數判斷的是數值,而不是邏輯條件。此函數的語法如下:DECODE(數值|列,判斷值 1,顯示值1,判斷值 2,顯示值2,判斷值 3,顯示值3,.。【范例】要求顯示全部雇員的職位,但是這些職位要求替換為中文顯示Select empno,ename,job,DECODE(job,

29、CLERK,辦事員,SALESMAN,銷售員,MANAGER,經理,ANALYST,分析員,PRESIDENT,總裁) from emp;DECODE()函數是整個Oracle之中最具有特點的函數,一定要將其掌握。【習題作業】1.選擇部門30中的所有員工。 Select * from emp where deptno=30;2.列出所有辦事員(CLERK)的姓名、編號和部門編號。 Select ename,empno,deptno From empWhere job=CLERK;3.找出獎金高于薪金的員工。Select *From empWhere comm>sal;4.找出傭金高于薪金

30、60%的員工Select *From empWhere comm>sal*0.6;5.找出部門10中所有經理和部門20中所有辦事員的職員信息。 Select *From empWhere (deptno=10 and job=MANAGER) or (deptno=20 and job=CLERK);6.找出部門10中所有經理(MANAGER),部門20中所有辦事員(CLERK),既不是經理又不是辦事員但其薪金大于或等于2000的所有員工的詳細資料。SELECT *FROM empWhere (deptno=10 and job=MANAGER) OR (deptno=20 and jo

31、b=CLERK) or (job not in(MANAGER,CLERK) and sal>=2000);7.找出收取傭金的員工的不同工作 Select distinct job From emp Where comm is not null; 8.找出不收取傭金或收取的傭金低于100的員工 Select * From empWhere comm is null or comm<100;9.找出各月倒數第三天受雇的所有員工每一個雇員的雇傭日期肯定是不一樣的,所以現在必須找到每一個雇員受雇傭所在月的最后一天,之后按照“日期-數字”的方式求出前三天的日期,這個日期必須和受雇傭日期相符

32、合才滿足條件。 Select * From emp Where hiredate=(last_day(hiredate)-2);10找出早于30年前受雇傭的員工信息 Select *From empWhere months_between(sysdate,hiredate)/12>30;11.以首字母大寫的方式顯示所有員工的姓名 Select initcap(ename) from emp;12.顯示正好為5個字符的員工的姓名 Select ename from emp where length(ename)=5;13.顯示不帶有“R”的員工的姓名Select enameFrom emp

33、Where ename not like %R%;14.顯示所有員工姓名的前三個字符。 SELECT SUBSTR(ENAME,1,3) FROM EMP;15.顯示所有員工的姓名,用“a”替換所有”A” Select replace(ename,A,a) FROM EMP;16.顯示滿10年服務年限的員工的姓名和受雇日期Select *From empWhere months_between(sysdate,hiredate)/12>10;17.顯示員工的詳細資料,按姓名排序 Select * from emp order by ename;18.顯示員工的姓名和受雇日期,按照受雇日期

34、排列,將老員工排在前面 Select ename,hiredate From emp Order by hiredate;19.顯示所有員工的姓名、工作和薪金,按工作的降序排列,若工作相同則按薪金排序。 Select ename,job,sal From emp Order by job desc,sal;20.顯示所有員工姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同則將最早年份的員工排在最前面。Select ename,hiredate, to_char(hiredate,yyyy) year,to_char(hiredate,mm) m From empOrder by m

35、,year;21.顯示在一個月為30天的情況所有員工的日薪金,忽略余數。 Select trunc(sal/30)From emp;22.找出在(任何年份的)2月受雇的所有員工。 Select * from emp where to_char(hiredate,mm)=2;23.對于每個員工,顯示其加入公司的天數。Select ename,trunc(sysdate-hiredate) from emp;24.顯示姓名字段的任何位置包含“A”的所有員工的姓名Select ename from emp where ename like %A%;(七)多表查詢(重點)1.多表查詢的基本概念在之前所

36、使用的查詢操作之中,都是從一張表中查詢出所需要的內容,那么如果在一個查詢語句中要顯示多張表的數據,則必須使用多表查詢的操作,而多表查詢的語法如下:SELECT DISTINCT *| 字段 別名 , FROM 表名稱 別名 ,表名稱 別名, WHERE 條件(s) ORDER BY 字段 ASC|DESC , 字段 ASC|DESC , 【笛卡爾積問題】我們執行SELECT * FROM emp,dept;這個多表查詢語句,會發現查詢出56條記錄,笛卡爾積在數據庫中表示的是多張表的數據乘積。使用字段關聯,可以消除笛卡爾積的問題。Select *From emp e,dept dWhere e.

37、deptno = d.deptno;【注意】 當在多表查詢之中,不同的表中有相同字段名稱的時候,訪問這些字段時,必須加上表名稱,即“表名.字段”。(在開發中,經常需要給表起別名)SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;SELECT * FROM emp e,dept d WHERE e.deptno = d.deptno;需要注意的是,使用多表查詢的時候,如果遇到數據量很大的時候,多表查詢的性能是很差的,因此在大數據量的時候,盡量少用多表查詢。(本質:其實多表查詢的這種消除笛卡爾積的方式只是從笛卡爾積中取出符合條件的記錄,在數據庫

38、查詢時依然做了笛卡爾積)【范例】查詢出每一位雇員的編號、姓名、職位、部門名稱、部門所在位置(幾段式) Select e.empno,e.ename,e.job,d.dname,d.loc From emp e,dept d Where e.deptno=d.deptno;【范例】查詢出每一位雇員的姓名、職位、其領導的姓名Select e.ename,e.job,e2.ename(同一張表,兩張表的效果)From emp e,emp e2Where e.mgr=e2.empno;【范例】查詢出每個雇員的編號、姓名、基本工資、職位、領導的姓名、部門名稱及位置。Select e.empno,e.en

39、ame,e.sal,e.job,e2.ename,d.dname,d.locFrom emp e,emp e2,dept dWhere e.mgr=e2.empno and e.deptno=d.deptno;【思考題】要求查詢出每一個雇員的編號、姓名、工資、部門名稱、工資所在公司的工資等級 Select e.empno,e.ename,e.sal,d.dname,s.grade From emp e,dept d,salgrade sWhere e.deptno=d.deptno and e.sal between s.losal and s.hisal;(注:要看關聯的是什么)【作業】將上

40、一個范例中的每一個工資等級替換成具體的文字信息,例如1替換成第五等工資、2替換成第四等工資Select e.empno,e.ename,e.sal,d.dname,decode(s.grade,1,第五等工資,2,第四等工資) From emp e,dept d,salgrade sWhere e.deptno=d.deptno and e.sal between s.losal and s.hisal;2.左右連接左右連接指的是參考表的方向問題,參考左邊表還是參考右邊表,在Oracle中,使用“(+)”來表示左右連接,這種符號有以下兩種使用情況:l (+)=:放在等號的左邊,表示右連接,表示

41、參考右邊的表(把右邊表中的所有數據都查出來)l =(+):放在等號的右邊,表示左連接,表示參考左邊的表(把左邊表中的所有數據都查出來)通常情況下,我們不用刻意去區分左還是右,可以根據查詢結果而定,如果發現有些需要的數據沒有顯示出來,就使用此符號更改連接方向。【范例】查詢每個雇員的姓名和領導的姓名 Select e1.ename,e2.enameFrom emp e1 ,emp e2Where e1.mgr=e2.empno(+);【注意】(+)是Oracle數據庫自己所獨有的,其他數據庫不能使用。3.SQL:1999語法處了以上的表左右連接操作之外,在SQL語法之中,也提供了另外一套用于表連接

42、的操作SQL,格式如下:SELECT table1.column, table2.column FROM table1CROSS JOIN table2 | NATURAL JOIN table2 | JOIN table2 USING(column_name) | JOIN table2 ON(table1.column_name=table2.column_name) | LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name=table2.column_name);(1)交叉連接(CROSS JOIN):用于產生笛卡爾積 Sele

43、ct * from emp cross join dept;=select * from emp,dept;(2)自然連接(NATURAL JOIN):自動找到匹配的關聯字段,消除掉笛卡爾積Select * from emp natural join dept;并不是所有的字段都是關聯字段,設置關聯字段需要通過約束指定;(3)JOIN.USING子句:用戶自己指定一個消除笛卡爾積的關聯字段 Select * from emp join dept using (deptno);(4)JOINON子句:用戶自己指定一個可以消除笛卡爾積的關聯條件 Select * from emp e,dept d

44、 where e.deptno=d.deptno;Select * from emp e join dept d on (e.deptno = d.deptno);(5)連接方向的改變:l 左(外)連接:LEFT OUTER JOINON;l 右(外)連接:RIGHT OUTER JOINON;l 全(外)連接:FULL OUTER JOIN.ON;Select e1.ename,e2.enameFrom emp e1 left outer join emp e2On( e1.mgr=e2.empno);在Oracle之外的數據庫都使用SQL:1999語法操作,所以這個語法還必須會。(八)統計

45、函數及分組查詢(重點、難點)結合使用1. 常用的統計函數(又稱為分組函數)有:l COUNT():查詢表中的數據記錄;l AVG():求平均值;l SUM():求和;l MAX():求最大值;l MIN():求最小值;【范例】統計出公司的所有雇員,每個月平均支付的平均工資及總工資 Select avg(sal),sum(sal) From emp;【范例】統計雇員中的最高和最低工資 Select max(sal),min(sal) from emp; 【注意】關于COUNT()函數 Select count(distinct job) from emp;COUNT()函數的主要功能是進行數據的

46、統計,但是在進行數據統計的時候,如果一張表中沒有統計記錄,COUNT()也會返回數據,只是這個數據是“0”;SELECT COUNT(ename) FROM BONUS;如果使用的是其他函數,則有可能返回null,但是COUNT()永遠都會返回一個具體的數字。2.分組統計 分組統計主要使用GROUP BY 子句來完成,分組的SQL語法如下:SELECT DISTINCT * | 分組字段1 別名 ,分組字段2 別名 | 統計函數FROM 表名稱 別名 , 表名稱 別名 WHERE 條件(s) GROUP BY 分組字段1 分組字段2,. ORDER BY 排序字段 ASC|DESC 排序字段

47、ASC|DESC 【范例】按照部門編號分組,求出每個部門的人數,平均工資Select count(empno),avg(sal)From empGroup by deptno【范例】按照職位分組,求出每個職位的最高和最低工資 Select job, max(sal),min(sal) From emp Group by job;【注意】一旦分組之后,對于語法上就會出現新的限制,對于分組有以下要求:l 分組函數可以在沒有分組的時候單獨使用,但不能出現其他的查詢字段,如下的錯誤示例: Select count(job) ,job from emp;因為無法顯示l 如果要進行分組,則SELECT 子

48、句之后,只能出現分組的字段(原因是:按它分的組)和統計函數,其他的字段不能出現:正確:錯誤:SELECT deptno,job,COUNT(empno),AVG(sal) FROM emp GROUP BY job;l 分組函數允許嵌套,但是嵌套之后的分組函數的查詢之中不能再出現任何的其他字段。【范例】按照職位分組,統計平均工資最高的工資Select max(avg(sal)這個位置 From emp(上句話按嵌套函數舉例)Group by job;【范例】查詢出每個部門的名稱、部門的人數、平均工資 Select d.dname,count(e.empno),avg(e.sal) From d

49、ept d,emp eWhere d.deptno=e.deptnoGroup by d.dname;(注意邏輯順序)【范例】要求顯示每個部門的編號、部門名稱、位置、部門的人數、平均工資Select d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal)From dept d,emp eWhere d.deptno = e.deptnoGroup by d.deptno,d.dname,d.loc;(后兩個可以在分組中列出來,所以可以補充不滿足第二條件的條件)【范例】要求顯示平均工資大于2000的部門的編號、部門名稱、位置、部門的人數、平均工資 Sel

50、ect d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal) From dept d,emp eWhere d.deptno=e.deptno and avg(e.sal)>2000Group by d.deptno,d.dname,d.loc;(錯誤)顯示錯誤:不允許使用分組函數 之所以會出現這個錯誤是因為WHERE子句只能用來對單行而不是行組進行過濾。(因為要先分組因,后分組過濾果)要過濾行組,可以使用HAVING子句。語法如下:SELECT DISTINCT * | 分組字段1 別名 ,分組字段2 別名 | 統計函數FROM 表

51、名稱 別名 , 表名稱 別名 WHERE 條件(s) GROUP BY 分組字段1 分組字段2,. HAVING 分組后的過濾條件(可以使用統計函數) ORDER BY 排序字段 ASC|DESC 排序字段 ASC|DESC 修改上面的范例結果:Select d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal) From dept d,emp eWhere d.deptno=e.deptno Group by d.deptno,d.dname,d.locHaving avg(e.sal)>2000;【注意點】WHERE 和 HAVING 的區別

52、l WHERE:是在執行GROUP BY 操作之前進行的過濾,表示從全部數據之中篩選出部分的數據,在WHERE之中不能使用統計函數;l HAVING:是在GROUP BY分組之后的再次過濾,可以在HAVING子句中使用統計函數;【綜合范例】顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,并且要滿足從事同一工作的雇員的月工資合計大于1500,輸出結果按月工資的合計升序排列;Select e.job,sum(e.sal)From emp e Where e.job<>SALESMANGroup by e.jobHaving sum(e.sal)>1500Order by

53、 sum(e.sal); (九)子查詢(重點、核心)子查詢=簡單查詢+限定查詢+多表查詢+統計查詢的綜合體通常多表查詢不建議大家使用,因為其性能較差,但是多表查詢最有利的替代者就是子查詢,所以子查詢在實際的開發之中使用的相當多。所謂子查詢就是在一個查詢之中嵌套了其他的若干查詢,嵌套子查詢之后的查詢SQL語句如下:SELECT DISTINCT * | 分組字段1 別名 ,分組字段2 別名 | 統計函數( SELECT DISTINCT * | 分組字段1 別名 ,分組字段2 別名 | 統計函數FROM 表名稱 別名 , 表名稱 別名 WHERE 條件(s) GROUP BY 分組字段1 分組字段2,. HAVING 分組后的過濾條件(可以使用統計函數) ORDER BY 排序字段 ASC|DESC 排序字段 ASC|DESC )FROM 表名稱 別名 , 表名稱 別名 ( SELECT DISTINCT * | 分組字段1 別名 ,分組字段2 別名 | 統計函數FROM 表名稱 別名 , 表名稱 別名 WHERE 條件(s) GROUP BY 分組字段1 分組字段2,. HAVING 分組后的過濾條件(可以使用統計函數) ORDER BY 排序字段 ASC|DESC 排序字段 ASC|DESC ) WHERE 條件(s) ( SELECT DISTINCT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論