【正文】
多列子查詢?cè)陂_發(fā)中不建議使用。l ANY:比里面最大的值小SELECT * FROM empWHERE salANY(SELECT MIN(sal) FROM emp GROUP BY deptno)。在子查詢中有以下三種查詢的操作符號(hào):l INl ANYl ALLIN操作:指定一個(gè)查詢的范圍范例:求出每個(gè)部門的最低工資的雇員信息每個(gè)部門的最低工資,返回的值肯定是多個(gè),此時(shí)可以使用IN指定一個(gè)操作的范圍。這樣才能正確的顯示出部門的名稱。 但是如果想查詢出部門的名稱,就需要與dept表進(jìn)行關(guān)聯(lián)。分析:在這個(gè)基礎(chǔ)上完善查詢的條件SELECT ename,job,sal FROM empWHERE sal=(SELECT MIN(sal) FROM emp)。范例:要求查詢出工資比7654高,同時(shí)與7788從事相同工作的全部雇員信息。 分析。以上問題的解決采用了子查詢。結(jié)果出現(xiàn)錯(cuò)誤。 分析:輸出結(jié)果按月工資的合計(jì)升序排列—排序的方式:ORDER BY SELECT job, SUM(sal)FROM empWHERE job’SALESMAN’GROUP BY job HAVING SUM(sal)5000ORDER BY SUM(sal) 。這樣可以得到正確的查詢結(jié)果。進(jìn)一步查詢部門編號(hào)是10的雇員的總工資,觀察下面的代碼:SELECT deptno ,SUM(sal)FROM empWHERE deptno=10GROUP BY deptno。SELECT deptno ,SUM(sal) 工資綜合 FROM emp WHERE deptno=10。我們常用COUNT(*),最好能夠用字段代替*范例:MAX()、MIN()函數(shù),求最大最小值,一般是針對(duì)于數(shù)值的字段的,求出所有員工的的最高工資,和最底工資和平均工資。以上的的語法應(yīng)該作為了解,看到要求認(rèn)識(shí)。l [JOIN table2 USING(column_name)] 直接指定關(guān)聯(lián)的操作列SELECT * FROM emp JOIN dept USING(deptno)。l 交叉連接[CROSS JOIN table2] 產(chǎn)生笛卡爾積SELECT * FROM emp CROSS JOIN dept。SELECT ,FROM emp e,emp mWHERE =。此時(shí)發(fā)現(xiàn)在查詢結(jié)果中,deptno字段里沒有出現(xiàn)40的記錄,我們查看在dept表中的的部門編號(hào)有40,這是為什么?因?yàn)樵诠蛦T表中沒有是40部門的雇員SELECT ,FROM emp e,dept dWHERE (+)=。 l 然后考慮領(lǐng)導(dǎo)的姓名和工資等級(jí)SELECT ,FROM emp e, dept d ,salgrade s,emp m,salgrade msWHERE = AND BETWEEN AND AND = AND BETWEEN AND 。SELECT ,FROM emp e,emp mWHERE =。 查詢結(jié)果是14行,此時(shí)消除了笛卡爾積,但是如果現(xiàn)在表名稱過長(zhǎng)時(shí)過長(zhǎng)時(shí)不是很好用,一邊會(huì)對(duì)表起個(gè)別名。要想去掉笛卡爾積則必須使用字段進(jìn)行關(guān)聯(lián)的操作。范例:查詢emp 表中的記錄數(shù)SELECT COUNT(*) FROM emp。):在Oracle中應(yīng)該只使用單引號(hào)將文本和和日期括起來,不能使用引號(hào)(包括單雙引號(hào))將數(shù)字括起來l 雙引號(hào)():在Oracle中單雙引號(hào)含義區(qū)別雙引號(hào)被用來將包含特定或者空格列別名括起來雙引號(hào)還被用來將文本放入日期格式l 雙豎線(||):Oracle使用雙豎線表示串連接l 星號(hào)(*):select *意味著選擇所有列count(*)意味著計(jì)算所有行表示通配符時(shí)表示0個(gè)或任意多個(gè)l 正斜杠(/):在Oracle中用來終止SQL語句更準(zhǔn)確說是表示了“運(yùn)行現(xiàn)在位于緩沖區(qū)SQL代碼”正斜杠也用作分隔項(xiàng)l 多行注釋:/*......*/l 不等于:有多種表達(dá)方式:!=、^=、not xxx=yyy、not(xxx=yyy)多表查詢的基本語法(重、難點(diǎn)) 之前的查詢都是在一張表里進(jìn)行的,如果現(xiàn)在使用一張以上的表,就稱為多表查詢?!边@時(shí)符號(hào)就是轉(zhuǎn)義字符了,對(duì)于轉(zhuǎn)義字符我們最好選用一些不常用的字符。 連接:conn 用戶名 / 密碼 AS SYSDBA SQL基礎(chǔ)語法的格式 單行函數(shù),這些函數(shù)應(yīng)該隨著開發(fā)的增長(zhǎng)逐步掌握,DECODE()函數(shù)最重要。 普通用戶:scott/tiger sqlplusw的一些常用命令 從運(yùn)行結(jié)果上發(fā)現(xiàn),使用DECODE函數(shù)已經(jīng)讓輸出的職位信息有所更改。PRESIDENT39。ANALYST39。MANAGER39。SALESMAN39。CLERK39。) FROM DUAL 。,2,39。DECODE()類似于IF…ELSEIF…ELSE語句。獎(jiǎng)金:39。 如果需要進(jìn)行計(jì)算的時(shí)候,對(duì)于null必須使用NVL()函數(shù)進(jìn)行一個(gè)轉(zhuǎn)換操作。 求出年薪的時(shí)候應(yīng)該加上獎(jiǎng)金的,格式(sal+m)*12SELECT empno,ename,(sal+m)*12 FROM emp 。yyyymmdd39。) FROM DUAL 。SELECT TO_DATE(39。 以上就表示把字符串變?yōu)閿?shù)字,之后進(jìn)行數(shù)字的加法操作。12339。l99,99939。$99,99939。99,99939。)FROM DUAL。 to_char()函數(shù)除了可以用在日期上,也可以用在數(shù)字上。 但是現(xiàn)在要求可以將年、月、日進(jìn)行分開,此時(shí)就可以使用TO_CHAR()函數(shù)進(jìn)行拆分,拆分的時(shí)候必須指定拆分的通配符: 轉(zhuǎn)換函數(shù)轉(zhuǎn)換函數(shù)主要有以下幾種: 星期一39。 程序查詢時(shí)包含了小數(shù)點(diǎn),可以使用ROUND()進(jìn)行四舍五入的操作。 MONTHS_BETWEEN():求出給定日期范圍的月數(shù)SELECT SYSDATE FROM DUAL 。 日期 – 數(shù)字 = 日期yyyymmdd39。98022339。select to_char(sysdate,39。) from dual。yyyymondd hh24:mi:ss pm39。rr 可以把yy替換成rr有不同的效果fm 去掉數(shù)字前面的零l 觀察結(jié)果select to_char(sysdate,39。day39。) from dual。SQL select round(to_date(39。ddmmyy39。SQL select extract(month from sysdate) from dual。(x,week) 返回x后由week指定的第一個(gè)工作日SQL select sysdate,next_day(sysdate,39。SMITH39。current_date返回當(dāng)前會(huì)話時(shí)區(qū)所對(duì)應(yīng)的日期時(shí)間curren_timestamp[(x)]返回當(dāng)前會(huì)話時(shí)區(qū)所對(duì)應(yīng)的日期時(shí)間,可選參數(shù)x表示精度,如果不指定參數(shù)x,則默認(rèn)精度值為6dbtimezone返回?cái)?shù)據(jù)庫(kù)所在的時(shí)區(qū)extract(year|month|day from x)從日期x中摘取所需要的年或月或日數(shù)據(jù)last_day(x)返回日期x所在月份的最后一天的日期localtimestamp[(x)]返回當(dāng)前會(huì)話時(shí)區(qū)所對(duì)應(yīng)的日期時(shí)間,可選參數(shù)x表示精度,如果不指定參數(shù)x,則默認(rèn)精度值為6months_between(x,y)返回日期x和日期y兩個(gè)日期之間相差的月數(shù)next_day(x,week)返回日期x后的由week指定的星期幾所對(duì)應(yīng)的日期round(x,[fmt])返回日期x的四舍五入結(jié)果。 范例:使用負(fù)數(shù)表示位數(shù)SELECT TRUNC(,2) FROM DUAL 。SELECT ROUND(,2) FROM dual 。 截?cái)嘈?shù)位:TRUNC() 實(shí)際上在substr()函數(shù)中提供了一種非常方便的機(jī)制,可以采用倒著截取的方式,只要輸入的位置是負(fù)數(shù)就表示倒著進(jìn)行。范例:要求顯示所有雇員的姓名及姓名的后三個(gè)字符) 字符串替換FROM DUAL 。,39。,1,3) 截取字符串 , length(39。 字符串截?。簊ubstr() world39。 字符串除了可以使用“||”連接之外,還可以使用CONCAT()函數(shù)進(jìn)行連接操作。 還可以使用initcap()函數(shù)將單詞的第一個(gè)字母大寫SELECT INITCAP(39。 還可以使用lower()函數(shù)將一個(gè)字符串變?yōu)樾懽帜副硎尽?那么此時(shí),為了方便用戶的使用就可以使用upper函數(shù)完成。范例:將小寫字母變?yōu)榇髮懽帜窼ELECT UPPER(39。,39。) from dual。,39。abcsdfsdwfg39。a39。如果不指定參數(shù)y,則默認(rèn)截去空格。11. RPAD(x,n[,y])select rpad(ename,15,39??蛇x參數(shù)y用于指定在x左邊補(bǔ)充的字符串;省略參數(shù)y,默認(rèn)值為空串。l39。,2) from dual。select instr(39。),job) from emp。a39。) from dual。獲得主機(jī)名select SYS_CONTEXT(39。USERENV39。用來調(diào)用系統(tǒng)函數(shù)select to_char(sysdate,39。 日期函數(shù):對(duì)日期型數(shù)據(jù)進(jìn)行操作 expression:字符串或計(jì)算表達(dá)式單行函數(shù)(重點(diǎn))數(shù)據(jù)庫(kù)系統(tǒng)中,每個(gè)數(shù)據(jù)庫(kù)之間唯一不同的最大區(qū)別點(diǎn)就在與函數(shù)的支持上,使用函數(shù)可以完成一系列的操作功能。 范例:要求查詢出10部門的所有雇員信息,查詢的信息按照工資由高到低排序,如果工資相等,則按照雇傭日期由早到晚排序。實(shí)際上如果在排序的時(shí)候沒有指定排序規(guī)則,則默認(rèn)的排序規(guī)則是升序排列。 使用“!=”完成SELECT * FROM emp WHERE empno!=7369 。 。%81%39。%%39。 此時(shí),表示可以在任意的位置上出現(xiàn)字母MSELECT * FROM emp WHERE ename LIKE 39。 “_”:可以匹配一個(gè)長(zhǎng)度的內(nèi)容范例:查詢出所有雇員姓名中第二個(gè)字母包含“M”的雇員信息SELECT * FROM emp WHERE ename LIKE 39。) 。,39。SELECT * FROM emp WHERE ename IN (39。,39。范例:要求查詢出姓名是SMITH、ALLEN、KING的雇員信息SELECT * FROM emp WHERE ename IN (39。 實(shí)際上,此時(shí)是指定了查詢的范圍,那么既然有范圍了在SQL語法中就可以使用IN操作符完成。SMITH39。smith39。范例:要求查詢出姓名是smith的雇員信息3112月8139。 日期表示的時(shí)候要加“39。在SQL語法中,提供了一個(gè)專門的指定范圍查詢的過濾語句:BETWEEN…AND… 語法格式: 字段 BETWEEN 最小值 AND 最大值例:使用BETWEEN…AND修改之前的操作SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000。從程序中可以發(fā)現(xiàn),通過括號(hào)表示一組的條件。 如果要表現(xiàn)出或者的概念使用OR進(jìn)行連接,表示兩個(gè)條件有一個(gè)滿足即可。SELECT * FROM emp WHERE sal1500 AND m IS NOT NULL 。 范例:要求查詢出,基本工資大于1500,同時(shí)可以領(lǐng)取獎(jiǎng)金的雇員信息。雇員表(emp) 雇員表中記錄的是一個(gè)個(gè)的雇員的基本信息。:EDIT 文件名;在SQL文件中的注釋有3種方法:使用SQL*Plus的REMARK命令;使用SQL注釋分界符/*......*/使用ANSI/SQL的“”型注釋讀取命令文件在SQL*PLUS中:GET f:\HELP ED SQL*Plus內(nèi)部命令這些命令用于設(shè)置SQL*Plus的環(huán)境或格式化輸出結(jié)果。BEGIN