Oracle數(shù)據(jù)庫學習資料課件_第1頁
Oracle數(shù)據(jù)庫學習資料課件_第2頁
Oracle數(shù)據(jù)庫學習資料課件_第3頁
Oracle數(shù)據(jù)庫學習資料課件_第4頁
Oracle數(shù)據(jù)庫學習資料課件_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.:.;Oracle的歷史Oracle 公司( 甲骨文 ) 開創(chuàng)人 : Larry Ellison 32歲,公司提供數(shù)據(jù)庫效力.公司成立于 1977 年, 83 年公司更名為 Oracle ,原名為軟件開發(fā)實驗室.Oracle 數(shù)據(jù)庫適用于大型企業(yè)競爭對手微軟的SQLServerIBM 的DB2目前的版本2.07.0 , 8.0 , 8i , 9i , 10gOracle的效力:我的電腦右鍵選擇管理-效力和運用程序效力OracleServer數(shù)據(jù)庫效力,進程為ORACLE.exeOracleTNSListener監(jiān)聽器效力,進程TNSLSNR.exe默許端口1521、1526OracleDBC

2、onsole對運用于OEMOracleiSQL*Plus對于于iSQL*Plus是數(shù)據(jù)庫或例程的系統(tǒng)標識符是Oracle主目錄稱號這幾個效力之間的關(guān)系:啟動順序:1、OracleTNSListener必需啟動 2、OracleServer必需啟動 3、OracleDBConsole啟動依賴于OracleServerSqlPlusSqlPlus是Oracle任何版本都自帶的數(shù)據(jù)庫操作工具,運用它可以完成大部分的數(shù)據(jù)庫操作。SqlPlus可以“開場程序Oracle啟動,也可以命令行啟動互動1.命令行啟動sqlPlussqlplus 用戶名/密碼orcl或sqlplus 用戶名orcl假設(shè)用戶是管理

3、員要在sqlplus 用戶名/密碼主機字符串 as sysdba“/是用戶名和密碼分隔符號“是密碼和數(shù)據(jù)庫的分隔符號“orcl是數(shù)據(jù)庫的稱號,在安裝時指定常用命令互動connect 切換用戶show user 顯示當前用戶set linesize 1000 設(shè)置行顯示長度set pagesize 1000 設(shè)置分頁長度desc dept 查看表構(gòu)造 select table_name from user_tables查詢當前用戶的表/ 運轉(zhuǎn)上一條SQL語句 clear screen 去除屏幕edit 編輯spool d:/a 保管輸出結(jié)果到某個位置spool off 保管終了quit 退出li

4、st 查看最后一條語句 文件名.sql 運轉(zhuǎn)外部文件中的SQL語句Sql*plus的常用命令是一個oracle提供的工具,運用此工具可以完成數(shù)據(jù)庫的操作和管理。SQL*Plus有兩種任務(wù)方式:基于圖形界面的sqlplusw基于命令行的sqlplusSql*plus 中可以執(zhí)行3種類型的命令:SQL語句SELECT * FROM tab;PL/SQL語句CREATE TABLE test(x number,info varchar(20);Commit;編寫一個存儲過程,向test表中插入20條記錄。DECLAREx number :=10;BEGINFOR I IN 1.20 LOOPINSE

5、RT INTO test VALUES (x,測試數(shù)據(jù));x=x+i;END LOOP;END;SQL*Plus內(nèi)部命令這些命令用于設(shè)置SQL*Plus的環(huán)境或格式化輸出結(jié)果。例如:改動EMP表里SAL列的輸出格式COLUMN SAL FORMAT $99,99 HEADING 薪水;運用SQL*Plus可以執(zhí)行操作系統(tǒng)本身的命令:例如:在下的記事本notepad.exeHOST notepad.exe; 退出SQL*Plus前往操作系統(tǒng):EXIT (QUIT) 協(xié)助 提示:HELP SET;HELP ;HELP ED;去除屏幕:CLEAR SRC;SQL*Plus編輯命令命令縮寫作用APPE

6、ND texttext將text加到當前行末端CHANGE /old/newC /old/new將當前行中的old改為newCHANGE /textC /text從當前行中刪除textCLEAR BUFFERCL BUFF去除全部行DEL刪除當前行INPUT I參與一行或多行INPUT textI text參與由text組成的行LISTL列出緩沖區(qū)中的全部行LIST nL n或 n列出n行LIST lastL last列出最后一行LIST m nL m n列出m到n行運轉(zhuǎn)緩沖區(qū)的命令:RUN 或/保管緩沖區(qū)中的內(nèi)容為.sql文件:SAVE f:test;編輯或者讀取命令文件.sql:EDIT

7、文件名;在SQL文件中的注釋有3種方法:運用SQL*Plus的REMARK命令;運用SQL注釋分界符/*/運用ANSI/SQL的“-型注釋讀取命令文件在SQL*PLUS中:GET f:test.sql;運轉(zhuǎn).sql文件中的指令:START或,運用更多建議:盡量運用記事本編寫代碼,這樣有利于修正。所需求的表在一切的講解中所要運用到的表全部都是scott用戶下的表,所以必需了解在此用戶下有那幾張表,以及每張表的作用是什么。防止出現(xiàn)漢字,由于實踐開發(fā)中容易出現(xiàn)亂碼問題。雇員表emp 雇員表中記錄的是一個個的雇員的根本信息。雇員表EMP No. 字段類型 描畫 1 EMPNO NUMBER(4) 表示

8、雇員編號,是獨一編號2 ENAME VARCHAR2(10) 表示雇員姓名3 JOB VARCHAR2(9) 表示任務(wù)職位4 MGR NUMBER(4) 表示一個雇員的指點編號5 HIREDATE DATE 表示雇傭日期6 SAL NUMBER(7,2) 表示月薪,工資7 COMM NUMBER(7,2) 表示獎金,或者稱為傭金8 DEPTNO NUMBER(2) 部門編號部門表dept 表示一個個詳細的部門信息 部門表dept No. 字段類型 描畫 1 DEPTNO NUMBER(2) 部門編號,是獨一編號2 DNAME VARCHAR2(14) 部門稱號3 LOC VARCHAR2(13

9、) 部門位置工資等級表SALGRADE一個公司工資是有等級制度,那么用此表表示一個工資的等級 工資等級表SALGRADE No. 字段類型 描畫 1 GRADE NUMBER 等級稱號2 LOSAL NUMBER 此等級的最低工資3 HISAL NUMBER 此等級的最高工資獎金表BONUS 表示的是一個雇員的工資及獎金獎金表BONUS No. 字段類型 描畫 1 ENAME VARCHAR2(10) 雇員姓名2 JOB VARCHAR2(9) 雇員任務(wù)3 SAL NUMBER 雇員工資4 COMM NUMBER 雇員獎金傭金 范例:查詢每月可以得到獎金的雇員信息 獎金是comm字段 只需字段

10、中存在內(nèi)容,那么表示此內(nèi)容不為空null,假設(shè)存在內(nèi)容,那么會顯示詳細的值。 不為空的表示:字段 IS NOT NULLSELECT * FROM emp WHERE comm IS NOT NULL ; 范例:查詢沒有獎金的雇員 沒有獎金那么comm字段的內(nèi)容一定是null,格式:字段 IS NULLSELECT * FROM emp WHERE comm IS NULL ; 范例:要求查詢出,根本工資大于1500,同時可以領(lǐng)取獎金的雇員信息。 此時應(yīng)該是兩個條件,而且兩個條件必需同時滿足 既然要求兩個條件全部滿足,那么必需運用AND操作符進展條件的銜接。SELECT * FROM emp

11、WHERE sal1500 AND comm IS NOT NULL ; 同時指定了兩個條件,兩個條件必需同時滿足才可以查詢出結(jié)果。 范例:要求查詢出,根本工資大于1500,或者可以領(lǐng)取獎金的雇員信息。 假設(shè)要表現(xiàn)出或者的概念運用OR進展銜接,表示兩個條件有一個滿足即可。SELECT * FROM emp WHERE sal1500 OR comm IS NOT NULL ; 之前運用NOT可以取反,把真的條件變?yōu)榧俚?,假的變?yōu)檎娴摹7独阂蟛樵兂?,根本工資不大于1500,同時不可以領(lǐng)取獎金的雇員信息。 此時相當于是整體的條件取反。SELECT * FROM emp WHERE NOT (s

12、al1500 OR comm IS NOT NULL); 等價于SELECT * FROM emp WHERE sal 1500 ,sal 1500 AND sal=1500 AND sal、=、=、=等計算符號不等于符號:在SQL中假設(shè)要想運用不等于符號,可以有兩種方式:“、“!= 范例:查詢雇員編號不是7369的雇員信息 運用“完成SELECT * FROM emp WHERE empno7369 ; 運用“!=完成SELECT * FROM emp WHERE empno!=7369 ; 對結(jié)果進展排序ORDER BY子句重點在SQL中可以運用ORDER BY子句對查詢的結(jié)果進展排序,例

13、如,如今運用查詢?nèi)康恼Z句:SELECT * FROM emp ; 此時,從查詢結(jié)果可以發(fā)現(xiàn),是按照雇員的編號進展排序的,那么此時假設(shè)要對運用指定的列進展排序,那么就必需運用ORDER BY語句,語法格式如下:SELECT DISTINCT * | 詳細的列別名 FROM 表稱號WHERE 條件(s) ORDER BY 排序的字段1,排序的字段2 ASC|DESC ASC表示升序、DESC表示降序范例:要求按照工資由低到高排序SELECT * FROM emp ORDER BY sal ; 之前是按照由低到高的順序完成,是采用的升序的方式,如今要求運用降序的方式完成。實踐上假設(shè)在排序的時候沒有

14、指定排序規(guī)那么,那么默許的排序規(guī)那么是升序陳列。SELECT * FROM emp ORDER BY sal ASC ; 要想運用降序的方式完成,那么運用DESC即可。SELECT * FROM emp ORDER BY sal DESC ; 范例:要求查詢出10部門的一切雇員信息,查詢的信息按照工資由高到低排序,假設(shè)工資相等,那么按照雇傭日期由早到晚排序。 此時存在兩個排序條件,第一個是降序,第二個升序SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ; 排序的操作一定是放在整個SQL語句的最后執(zhí)行。單行函數(shù)重點

15、數(shù)據(jù)庫系統(tǒng)中,每個數(shù)據(jù)庫之間獨一不同的最大區(qū)別點就在與函數(shù)的支持上,運用函數(shù)可以完成一系列的操作功能。單行函數(shù)語法:function_name(column|expression,arg1,arg2,) 參數(shù)闡明: function_name:函數(shù)稱號 column:數(shù)據(jù)庫列名 expression:字符串或計算表達式 arg1,arg2:在函數(shù)中運用參數(shù)單行函數(shù)分類: 字符函數(shù):接受字符輸入并且前往字符或數(shù)值 數(shù)值函數(shù):接受數(shù)值輸入并前往數(shù)值 日期函數(shù):對日期型數(shù)據(jù)進展操作 轉(zhuǎn)換函數(shù):從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型 通用函數(shù):NVL函數(shù)、DECODE函數(shù)字符函數(shù) HYPERLINK cn

16、blogs/Madream/articles/1261013.html Oracle中的dual表 Dual 是 Oracle中的一個實踐存在的表,任何用戶均可讀取,常用在沒有目的表的Select語句塊中,用來構(gòu)成select的語法規(guī)那么,oracle保證dual里面永遠只需一條記錄。這是由于ORACLE對DUAL表的操作做了一些內(nèi)部處置,盡量保證DUAL表中只前往一條記錄.當然這寫內(nèi)部操作是不可見的 .以下是dual的一些運用方法:1、查看當前用戶,可以在 SQL Plus中執(zhí)行下面語句select user from dual;2、用來調(diào)用系統(tǒng)函數(shù)select to_char(sysdat

17、e,yyyy-mm-dd hh24:mi:ss) from dual;-獲得當前系統(tǒng)時間select SYS_CONTEXT(USERENV,TERMINAL) from dual;-獲得主機名select SYS_CONTEXT(USERENV,language) from dual;-獲得當前l(fā)ocaleselect dbms_random.random from dual;-獲得一個隨機數(shù)3、可以用做計算器select 7*9 from dual;ACII(x)前往字符x的ASCII碼select ascii(a) from dual;求ACSII(a),ASCII(A),ASCII(0

18、),ASCIIXYZ的值CHRX前往ASCII碼為X的字符CONCAT(x,y)字符串拼接函數(shù)select concat(concat(ename, is a),job) from emp;INITCAP(x)首字母大寫select initcap(ename) from emp;INSTRx,y,n,m確定y在x中的位置。n是起始查找的位置,m第幾次出現(xiàn)的位置。select instr(HelloWorld!,l,2) from dual;select instr(HelloWorld!,l,2,3) from dual;LENGTH(x)字符串長度select ename,length(e

19、name) from emp where empno=7698;LOWER(x)轉(zhuǎn)換小寫select lower(ename) from emp;UPPER(x)轉(zhuǎn)換大寫LPAD(x,n,y)在字符串x的左邊補充字符串y,得到總長為n個字符的字符串。可選參數(shù)y用于指定在x左邊補充的字符串;省略參數(shù)y,默許值為空串。select lpad(ename,15,$#) from emp;RPAD(x,n,y)select rpad(ename,15,#$) from emp;LTRIM(x,y)從字符串x的左邊截去包含在字符串y中的字符。假設(shè)不指定參數(shù)y,那么默許截去空格。select ltrim(

20、abcdab,a) from dual;RTIME(x,y)trim(x)去除左右空格SUNSTR(x,n,m)前往字符串x中的一個子串,這個子串從字符串x的第n字符開場,截取參數(shù)m個字符。select substr(abcsdfsdwfg,3,4) from dual;replacex,y,z將字符串x中所具有的子串y用子串z交換select replace(jack and jue,j,bl) from dual;19. TRANSLATE(string,if,then) 根據(jù)“if中字符的位置,并檢查“then的一樣位置,然后用該位置的字符交換“string中的字符。select tra

21、nslate(ename,AE,12) from emp;是專門處置字符的,例如,可以將大寫字符變?yōu)樾?,還能求出字符的長度。范例:將小寫字母變?yōu)榇髮懽帜窼ELECT UPPER(smith) FROM DUAL ; 范例:普通用戶在查詢一個人姓名的時候有能夠思索到這個人的姓名是大寫字母存的還是小寫字母保管的呢? 那么此時,為了方便用戶的運用就可以運用upper函數(shù)完成。SELECT * FROM emp WHERE ename=UPPER(Smith) ; 還可以運用lower()函數(shù)將一個字符串變?yōu)樾懽帜副硎尽ELECT LOWER(HELLO WORLD) FROM dual ; 還

22、可以運用initcap()函數(shù)將單詞的第一個字母大寫SELECT INITCAP(HELLO WORLD) FROM dual ; 范例;運用此函數(shù)將雇員表中的雇員姓名變?yōu)殚_頭字母大寫SELECT INITCAP(ename) FROM emp ; 字符串除了可以運用“|銜接之外,還可以運用CONCAT()函數(shù)進展銜接操作。SELECT CONCAT(hello ,world) FROM DUAL ; 此時曾經(jīng)完成了銜接,但是此種方式一定不如“|好使。在字符函數(shù)中可以進展字符串的截取、求出字符串的長度、進展指定內(nèi)容的交換 字符串截取:substr() 字符串長度:length() 內(nèi)容交換:r

23、eplace()SELECT substr(hello,1,3) -截取字符串 , length(hello) -字符串長度 , replace(hello,l,x) -字符串交換FROM DUAL ; 但是在substr()函數(shù)的時候有一點需求提示大家留意,跟面試有關(guān): Oracle中substr()函數(shù)的截取點是從0還是從1開場。 |- 從0或從1開場效果是一樣的,由于Oracle比較智能。范例:要求顯示一切雇員的姓名及姓名的后三個字符 由于雇員姓名的字符串長度不一樣,所以只能求出整個的長度再減去2,這樣進展截取操作。SELECT ename,SUBSTR(ename,LENGTH(ena

24、me)-2) FROM emp ; 此時,功能曾經(jīng)實現(xiàn)了,但是操作比較費事。實踐上在substr()函數(shù)中提供了一種非常方便的機制,可以采用倒著截取的方式,只需輸入的位置是負數(shù)就表示倒著進展。SELECT ename,SUBSTR(ename,-3,3) FROM emp ; 數(shù)值函數(shù)數(shù)值函數(shù)只需是包含以下幾種: 四舍五入:ROUND() 截斷小數(shù)位:TRUNC() 取余取模:MOD 范例:執(zhí)行四舍五入操作SELECT ROUND(789.536) FROM dual ; 當然,在ROUND()函數(shù)中也可以指定四舍五入的位數(shù)范例:保管兩位小數(shù)SELECT ROUND(789.536,2) FR

25、OM dual ; 在運用ROUND()函數(shù)中還有一點非常有意思,可以直接對整數(shù)進展四舍五入的進位。SELECT ROUND(789.536,-2) FROM dual ; TRUNC()與ROUND()不同的是,在TRUNC()操作中,不會保管任何的小數(shù),而且小數(shù)點也不會執(zhí)行四舍五入的操作。范例:驗證TRUNC()函數(shù)SELECT TRUNC(789.536) FROM DUAL ; 范例:經(jīng)過TRUNC()也可以指定小數(shù)點的保管位數(shù)SELECT TRUNC(789.536,2) FROM DUAL ; 范例:運用負數(shù)表示位數(shù)SELECT TRUNC(789.536,-2) FROM DUA

26、L ; 范例:運用MOD()函數(shù)可以進展取余的操作SELECT MOD(10,3) FROM DUAL ; 日期函數(shù)函數(shù)功能Add_months(x,n)前往日期x加上n個月所對應(yīng)的日期。N為正數(shù),那么前往值表示x之后的日期;n為負數(shù),那么前往值表示x之前的日期。current_date前往當前會話時區(qū)所對應(yīng)的日期時間curren_timestamp(x)前往當前會話時區(qū)所對應(yīng)的日期時間,可選參數(shù)x表示精度,假設(shè)不指定參數(shù)x,那么默許精度值為6dbtimezone前往數(shù)據(jù)庫所在的時區(qū)extract(year|month|day from x)從日期x中摘取所需求的年或月或日數(shù)據(jù)last_day

27、(x)前往日期x所在月份的最后一天的日期localtimestamp(x)前往當前會話時區(qū)所對應(yīng)的日期時間,可選參數(shù)x表示精度,假設(shè)不指定參數(shù)x,那么默許精度值為6months_between(x,y)前往日期x和日期y兩個日期之間相差的月數(shù)next_day(x,week)前往日期x后的由week指定的星期幾所對應(yīng)的日期round(x,fmt)前往日期x的四舍五入結(jié)果。 Fmt可以取YEAR,MONTH,DAY三者之一sysdate前往當前系統(tǒng)的日期時間systimestamp前往當前系統(tǒng)的日期時間trunk(x,fmt)前往截斷日期x時間數(shù)據(jù)。Fmt可以取YEAR,MONTH,DAY三者之一

28、1.SYSDATE 前往當前的日期和時間SQL select sysdate from dual;2.add_months(x,y) 在x上加上y個月SQL select hiredate,add_months(hiredate,1) from emp 2 where ename=SMITH;3.last_day(時間) 前往當前時間所在月的最后一天SQL select sysdate,last_day(sysdate) from dual;4.months_between(d1,d2) 前往日期d1和d2之間的月份數(shù)。假設(shè)d1晚于d2,結(jié)果為正,否那么前往負數(shù)SQL select month

29、s_between(sysdate,hiredate) from emp;5.next_date(x,week) 前往x后由week指定的第一個任務(wù)日SQL select sysdate,next_day(sysdate,星期三) from dual;SQL select sysdate,next_day(sysdate,3) from dual6.extract(year|month|day from x) 抓取日期的指定部分SQL select extract(year from sysdate) from dual;SQL select extract(month from sysdat

30、e) from dual;SQL select extract(day from to_date(23-03-2021,dd-mm-yy) from dual;7.round(x,fmt)日期的四舍五入SQL select round(to_date(16-3月-08),year) from dual;SQL select round(to_date(16-3月-08),month) from dual;SQL select round(to_date(16-3月-08),day) from dual;格式符闡明舉例yyyy年份2021mmmonthmon月份02dd天28day星期幾星期五a

31、m/pm上午/下午hh/hh12/hh24小時2:30mi分鐘30ss秒rr 可以把yy交換成rr有不同的效果fm 去掉數(shù)字前面的零察看結(jié)果select to_char(sysdate,yyyy-mm-dd hh:mi:ss pm) from dual;select to_char(sysdate,yyyy-mon-dd hh24:mi:ss pm) from dual;select to_char(sysdate,yyyy-month-dd day hh24:mi:ss ) from dual;select to_char(sysdate,公元yyyy年-month-dd日 day hh24

32、:mi:ss ) from dual;select to_char(sysdate,fm yyyy-mm-dd hh:mi:ss pm) from dual;select to_char(to_date(98-02-23,rr-mm-dd),yyyy-mm-dd) from dual;在Oracle中提供了很多與日期操作相關(guān)的函數(shù),包括加減日期等等。但是在日期進展加或減結(jié)果的時候有一些規(guī)律: 日期 數(shù)字 = 日期 日期 + 數(shù)字 = 日期 日期 日期 = 數(shù)字天數(shù) 范例:顯示10部門雇員進入公司的星期數(shù) 假設(shè)要想完成此操作,那么首先必需知道當前的日期,在Oracle中可以經(jīng)過以下的操作求出當前

33、日期,運用sysdate表示。SELECT SYSDATE FROM DUAL ; 求出星期數(shù):當前日期 雇傭日期 = 天數(shù) / 7 = 星期數(shù)SELECT empno,ename,ROUND(SYSDATE-hiredate)/7) FROM emp ; 在Oracle中提供了以下的日期函數(shù)支持: MONTHS_BETWEEN():求出給定日期范圍的月數(shù) ADD_MONTHS():在指定日期上加上指定的月數(shù),求出之后的日期 NEXT_DAY():下一個的今天是那一個日期 LAST_DAY():求出給定日期的最后一天日期范例:驗證MONTHS_BETWEEN()SELECT empno,ena

34、me,MONTHS_BETWEEN(sysdate,hiredate) FROM emp ; 程序查詢時包含了小數(shù)點,可以運用ROUND()進展四舍五入的操作。范例:驗證ADD_MONTHS()函數(shù)SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL ; 范例:驗證NEXT_DAY()函數(shù) 此函數(shù)求出下一次給定日期數(shù)SELECT NEXT_DAY(SYSDATE,星期一) FROM DUAL ; 范例:驗證LAST_DAY()函數(shù) 求出一個日期的最后一天SELECT LAST_DAY(SYSDATE) FROM DUAL ; 轉(zhuǎn)換函數(shù)轉(zhuǎn)換函數(shù)主要有以下幾種: TO_CH

35、AR():轉(zhuǎn)換成字符串 TO_NUMBER():轉(zhuǎn)換成數(shù)字 TO_DATE():轉(zhuǎn)換成日期范例:查詢一切雇員的雇員編號、姓名、雇傭日期SELECT empno,ename,hiredate FROM emp ; 但是如今要求可以將年、月、日進展分開,此時就可以運用TO_CHAR()函數(shù)進展拆分,拆分的時候必需指定拆分的通配符: 年:y,年是四位的數(shù)字,所以運用yyyy表示 月:m,月是二位的數(shù)字,所以運用mm表示 日:d,日是二位的數(shù)字,所以運用dd表示還可以運用to_char()函數(shù)進展日期顯示的轉(zhuǎn)換功能。 Oracle中默許的日期格式:19-4月 -87 中國的喜歡格式:1987-04-1

36、9從運轉(zhuǎn)結(jié)果中可以發(fā)現(xiàn),假設(shè)是5月,那么會運用05表示。那么這個0稱為前導(dǎo)0,假設(shè)不希望顯示前導(dǎo)0的話,那么可以運用fm去掉這些0。 to_char()函數(shù)除了可以用在日期上,也可以用在數(shù)字上。雙引號():在Oracle中單雙引號含義區(qū)別雙引號被用來將包含特定或者空格列別名括起來SELECT empno “ ,ename,sal as “工資 FROM emp ;雙引號還被用來將文本放入日期格式SELECT TO_CHAR(sysdate,fmyyyy年mm月dd日)FROM DUAL;例如:要查詢?nèi)康墓蛦T編號、姓名、工資SELECT empno,ename,sal FROM emp ; 最

37、好在數(shù)字中參與一些符號,以分割太長的數(shù)字,普通中國運用“,,所以,此時,可以運用to_char()函數(shù)進展格式化: 9:表示一位數(shù)字SELECT empno,ename,TO_CHAR(sal,99,999) FROM emp ; 假設(shè),此時,希望數(shù)字可以明確的表示出區(qū)域,可以運用以下兩種符號: $:表示美圓SELECT empno,ename,TO_CHAR(sal,$99,999) FROM emp ; L:表示Local的縮寫,以本地的言語進展金額的顯示SELECT empno,ename,TO_CHAR(sal,l99,999) FROM emp ; TO_NUMBER是可以將字符串變

38、為數(shù)字的一種函數(shù)。SELECT TO_NUMBER(123) + TO_NUMBER(123) FROM DUAL ; 以上就表示把字符串變?yōu)閿?shù)字,之后進展數(shù)字的加法操作。TO_DATE()函數(shù)可以將一個字符串變?yōu)镈ATE型的數(shù)據(jù)。 例如:有2021-2-16是一個字符串,如今要變?yōu)镈ATE類型。SELECT TO_DATE(2021-02-16,yyyy-mm-dd) FROM DUAL ; SELECT TO_CHAR(TO_DATE(2021-02-16,yyyy-mm-dd),yyyy年mm月dd日)FROM DUAL通用函數(shù)范例:要求求出每個雇員的年薪 求出年薪的時候應(yīng)該加上獎金的,

39、格式sal+comm*12SELECT empno,ename,(sal+comm)*12 FROM emp ; 之所以呵斥這樣的結(jié)果,是由于有些雇員的獎金是NULL,NULL值計算之后結(jié)果還是NULL。所以,面對這樣的情況,就可以運用NVL函數(shù),可以將一個指定的null值變?yōu)橹付ǖ膬?nèi)容。SELECT empno,ename,NVL(comm,0), (sal+NVL(comm,0)*12 income FROM emp ; 假設(shè)需求進展計算的時候,對于null必需運用NVL()函數(shù)進展一個轉(zhuǎn)換操作。NVLx,y假設(shè)x為null,那么前往y值;否那么前往x的值。select ename,sal

40、+nvl(comm,0) from emp;NVL2x,y,z假設(shè)x不為空前往y的值,否那么前往z的值select ename,nvl2(comm,獎金:|comm,無獎金) from emp DECODE()函數(shù),此函數(shù)是在面試最有能夠問到的問題。DECODE()類似于IFELSEIFELSE語句。語法:DECODE(col/expression,search1,result1,search2,result2,.,default) 闡明:col/expression:為列名或表達式search1、search2searchi:為用于比較的條件result1、result2resulti為前往

41、值假設(shè)col/expression和searchi相比較,結(jié)果一樣的話,那么前往resulti,假設(shè)沒有與col/expression相匹配的結(jié)果,那么前往默許枝default。 范例:驗證DECODE()函數(shù)SELECT DECODE(1,1,內(nèi)容是1,2,內(nèi)容是2,3,內(nèi)容是3) FROM DUAL ; 從運轉(zhuǎn)結(jié)果上看,程序?qū)?nèi)容進展更改,顯示的結(jié)果變了。 可以直接在emp表上運用此函數(shù),例如,如今有如下的要求: 雇員的任務(wù): |- CLERK:業(yè)務(wù)員 |- SALESMAN:銷售人員 |- MANAGER:經(jīng)理 |- ANALYST:分析員 |- PRESIDENT:總裁范例:要求查詢出

42、雇員的編號,姓名,雇傭日期及任務(wù),將任務(wù)交換成以上的信息SELECT empno 雇員編號 ,ename 雇員姓名 ,hiredate 雇傭日期 , DECODE(job,CLERK,業(yè)務(wù)員,SALESMAN, 銷售人員,MANAGER,經(jīng)理, ANALYST,分析員,PRESIDENT,總裁) 職位FROM emp ; 從運轉(zhuǎn)結(jié)果上發(fā)現(xiàn),運用DECODE函數(shù)曾經(jīng)讓輸出的職位信息有所更改??偨Y(jié) 1、 Oracle的主要用戶: 超級管理員:sys/change_on_install 普通管理員:system/manager 普通用戶:scott/tiger 2、 sqlplusw的一些常用命令

43、設(shè)置行顯示數(shù)量:set linesize 長度 設(shè)置頁顯示數(shù)量:set pagesize 長度 ed及指令 銜接:conn 用戶名 / 密碼 AS SYSDBA 3、 SQL根底語法的格式 4、單行函數(shù),這些函數(shù)應(yīng)該隨著開發(fā)的增長逐漸掌握,DECODE()函數(shù)最重要。補充oracle運算符運用用于where比較條件有:等于:=、=、包含:in、not in exists、not exists范圍:between.and、not betweenand匹配測試:like、not likeNull測試:is null、is not null布爾鏈接:and、or、notoracle通配符:在查詢數(shù)據(jù)

44、時,會出現(xiàn)這樣一種情況數(shù)據(jù)本身含有% 或者 “_符號,假設(shè)此時我們查詢含有“%的數(shù)據(jù),我們要把%進展本義,讓他失去原先的通配符的含義,而僅僅表現(xiàn)字面的意思。在Oracle中沒有本義符號“這個字符,需求我們用ESCAPE進展定義,比如“ESCAPE #這時#符號就是本義字符了,對于本義字符我們最好選用一些不常用的字符。任何字符前出現(xiàn)#符號,那么這個字符將被本義,比如A#%第一個%被本義代表字面意義的“%而第二個是通配符。在where子句中通配符可和like條件起運用在Oracle中:%(百分號): 用來表示恣意數(shù)量或者能夠根本沒有_(下劃線): 表示確切未知?(問號): 用來表示確切未知#(井號

45、): 用來表示確切阿拉伯數(shù)字0到9a-d(方括號):用來表示范圍在這里是從a到d單引號():在Oracle中應(yīng)該只運用單引號將文本和和日期括起來,不能運用引號(包括單雙引號)將數(shù)字括起來雙引號():在Oracle中單雙引號含義區(qū)別雙引號被用來將包含特定或者空格列別名括起來雙引號還被用來將文本放入日期格式雙豎線(|):Oracle運用雙豎線表示串銜接星號(*):select *意味著選擇一切列count(*)意味著計算一切行表示通配符時表示0個或恣意多個正斜杠(/):在Oracle中用來終止SQL語句更準確說是表示了“運轉(zhuǎn)如今位于緩沖區(qū)SQL代碼正斜杠也用作分隔項多行注釋:/*/不等于:有多種表

46、達方式:!=、=、not xxx=yyy、not(xxx=yyy)多表查詢的根本語法重、難點 之前的查詢都是在一張表里進展的,假設(shè)如今運用一張以上的表,就稱為多表查詢。多表查詢語法如下: SELECT DISTINCT * |查詢列1 別名1,查詢列2 別名2,F(xiàn)ROM 表稱號1 別名1,表稱號2,別名2,WHERE 條件(s )ORDER BY 排序字段1 ASC|DESC ,排序字段2 ASC|DESC范例:下面運用多表查詢,同時查詢emp和dept表SELECT * FROM emp,dept; 以上的查詢運用了兩個表。從查詢結(jié)果上發(fā)現(xiàn)前往的數(shù)據(jù)是56行,但是emp是14行。范例:查詢e

47、mp 表中的記錄數(shù)SELECT COUNT(*) FROM emp; 從查詢結(jié)果上看emp中有14條范例:查詢dept 表中的記錄數(shù)SELECT COUNT(*) FROM dept; 從查詢結(jié)果上看dept中有4條56條記錄=emp表的14條dept表的4條運用多表查詢會產(chǎn)生笛卡爾積。假設(shè)表的數(shù)據(jù)越多,那么笛卡爾積就會越大,假設(shè)如今假設(shè)有5張表,每張表有100000條記錄,1000005所以多表查詢在是不建議掛在開發(fā)中過多運用的。要想去掉笛卡爾積那么必需運用字段進展關(guān)聯(lián)的操作。在emp中表存在一個deptno的字段, 在dept表里也存在一個deptno的字段,而且emp表中的deptno中

48、的字段是與dept表中的deptno關(guān)聯(lián)的,所以deptno 屬于關(guān)聯(lián)字段。在多表查詢中要用WHERE 子句來消除笛卡爾積。范例:修正前面的查詢SELECT * FROM emp,deptWHERE emp.deptno=dept.deptno; 查詢結(jié)果是14行,此時消除了笛卡爾積,但是假設(shè)如今表稱號過長時過長時不是很好用,一邊會對表起個別名。SELECT * FROM emp e,dept dWHERE e.deptno=d.deptno; 結(jié)果是一樣的,所以普通在開發(fā)中運用多表查詢,最好指定表的別名范例:要求查詢出雇員的編號、雇員的姓名、部門的編號、部門稱號及部門位置SELECT e.e

49、mpno,e.ename,d.deptno,d.dname,d.locFROM emp e,dept dWHERE emp.deptno=dept.deptno; 范例:要求查詢出每個雇員姓名、任務(wù)、雇員的直接上級指點的姓名在emp表中mgr字段表示一個雇員的上級指點的編號,假設(shè)要查詢一個雇員的上級指點的姓名,那么一定要將emp和emp本人和本人進展關(guān)聯(lián),這種叫自相關(guān)。SELECT e.ename,e.job,m.enameFROM emp e,emp mWHERE e.mgr=m.empno; 范例:要求進一步擴展,將雇員所在的部門稱號同時列出部門稱號在dept表中SELECT e.enam

50、e,e.job,m.ename,d.dnameFROM emp e,emp m, dept dWHERE e.mgr=m.empno AND e.deptno=d.deptno; 思索題:要求查詢出每個雇員的姓名、工資、部門稱號、工資在公司的等級salgrade,及其指點的姓名及工資所在公司的等級。思緒分析:首先查詢每個雇員的姓名、工資、部門稱號、工資在公司的等級,涉及到的表有emp表、salgrade表、dept表SELECT e.ename,e.sal,d.dname,s.gradeFROM emp e, dept d ,salgrade sWHERE e.deptno=d.deptno

51、AND e.sal BETWEEN s.losal AND s.hisal; 然后思索指點的姓名和工資等級SELECT e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.gradeFROM emp e, dept d ,salgrade s,emp m,salgrade msWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisalAND e.mgr=m.empno AND m.sal BETWEEN ms.losal AND ms.hisal; 進一步思索要求將工資等級按以下款式輸出:

52、1:五級工資2:四級工資3:三級工資4:二級工資5:一級工資這需求運用DECODE()函數(shù)SELECT e.ename,e.sal,d.dname,DECODE(s.grade,1,五級工資,2,四級工資,3,三級工資,4,二級工資,5,一級工資),m.ename,m.sal, DECODE(ms.grade,1,五級工資,2,四級工資,3,三級工資,4,二級工資,5,一級工資)FROM emp e, dept d ,salgrade s,emp m,salgrade msWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal

53、AND e.mgr=m.empno AND m.sal BETWEEN ms.losal AND ms.hisal; 左銜接、右銜接重點 在dept表中存在4條記錄如今將emp表和dept表關(guān)聯(lián)查詢,查詢一下指定的字段。SELECT e.empno,e.ename,d.deptno,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptno;此時發(fā)如今查詢結(jié)果中,deptno字段里沒有出現(xiàn)40的記錄,我們查看在dept表中的的部門編號有40,這是為什么?由于在雇員表中沒有是40部門的雇員SELECT e.empno,e.ename,d.deptno,d.dn

54、ameFROM emp e,dept dWHERE e.deptno(+)=d.deptno; 假設(shè)想要40部門顯示出來在WHERE子句中+寫在等號的左邊,發(fā)現(xiàn)40部門出現(xiàn)。這個時候是右銜接。因此,+在=右邊是左銜接銜接的時候以左邊為準+在=左邊是右銜接銜接的時候以右邊為準留意:在開發(fā)中左、右銜接運用較多,特別要了解實踐上在之間的查詢中查找雇員姓名及每一位雇員的指點的時候就應(yīng)該運用左、右銜接了。SELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr=m.empno;一共13行數(shù)據(jù),但是emp表中有14條記錄SELECT

55、 e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr=m.empno(+);以上運用了左銜接,顯示了14條信息,多出來了 7839 KING應(yīng)為7839 KING是最高指點,mgr字段為nullSELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr(+)=m.empno;假設(shè)我們用了右銜接,發(fā)現(xiàn)記錄有21條規(guī)范SQL語法知道SELECT table1.column,table2.columnFROM table1 CROSS JOIN table2 |N

56、ATURAL JOIN table2 | JOIN table2 USING(column_name) |JOIN table2 ON(table1.colunm_name =table2.column_name) |LEFT |RIGHT |FULL OUTER JOIN table2 ON(table1.column_name=table2.column_name);交叉銜接CROSS JOIN table2 產(chǎn)生笛卡爾積SELECT * FROM emp CROSS JOIN dept;產(chǎn)生了56條記錄,效果和以下查詢一樣SELECT * FROM emp,dept;自然銜接CROSS

57、JOIN table2 自動進展關(guān)聯(lián)字段的匹配SELECT * FROM emp NATURAL JOIN dept;查詢的結(jié)果是條記錄,自動的進展了字段的關(guān)聯(lián)匹配,不用寫WHERE子句的關(guān)聯(lián)條件,效果和以下的查詢一樣SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;JOIN table2 USING(column_name) 直接指定關(guān)聯(lián)的操作列SELECT * FROM emp JOIN dept USING(deptno);效果和上面的一樣,可以自行指定關(guān)聯(lián)的字段JOIN table2 ON(table1.colunm_name =t

58、able2.column_name) 用戶本人編寫銜接的條件SELECT * FROM emp JOIN dept ON(emp.deptno=dept.deptno);效果和上面的一樣LEFT OUTER JOIN table2 ON(table1.column_name=table2.column_name) 左外銜接RIGHT OUTER JOIN table2 ON(table1.column_name=table2.column_name)右外銜接SELECT * FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno =d.deptno);效

59、果和我們上面的右銜接是一樣的SELECT * FROM emp e,dept dWHERE e.deptno(+)=d.deptno;以上的的語法應(yīng)該作為了解,看到要求認識。組函數(shù)和分組統(tǒng)計組函數(shù)也稱為聚合函數(shù)。例如:我們把學生可以分為男生和女生兩個組,假設(shè)想求每組的人數(shù),平均身高,平均年齡等,就需求用到分組函數(shù)了。在SQL中常用的組函數(shù)有以下幾個:COUNT():求出全部的記錄數(shù)MAX():求出一組中的最大值MIN():求出一組中的最小值A(chǔ)VG():求出一組中的平均值SUM():求和范例:COUNT()函數(shù)SELECT COUNT(empno) FROM emp;我們常用COUNT(*),最

60、好可以用字段替代*范例:MAX()、MIN()函數(shù),求最大最小值,普通是針對于數(shù)值的字段的,求出一切員工的的最高工資,和最底工資和平均工資。SELECT MAX(sal) 最高工資,MIN(sal) 最底工資,AVG(sal) 平均工資FROM emp;范例:求出部門的一切員工工資的總合SELECT SUM(sal) 工資綜合 FROM emp WHERE deptno=10;假設(shè)如下查詢輸出部門編號和其部門一切員工的工資總和,會產(chǎn)生錯誤。SELECT deptno ,SUM(sal) 工資綜合 FROM emp WHERE deptno=10;發(fā)生以上的錯誤信息,是由于這樣的查詢需求進展分組

溫馨提示

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

評論

0/150

提交評論