1. 簡(jiǎn)單查詢語(yǔ)句
1.1 查詢?nèi)?
SELECT * FROM 表名稱 ;
1.2 實(shí)際上簡(jiǎn)單查詢語(yǔ)句語(yǔ)法格式就是:
SELECT * | 具體的列 別名FROM 表名稱 ;
1.3 如果現(xiàn)在假設(shè)揖赴,只需要查詢出雇員的編號(hào)、姓名、工作的話荠诬,則就需要指定查詢的列:
SELECT empno,ename,job FROM emp ;
1.4 要求查詢出某一列锌蓄,肯定要查詢的是某一個(gè)字段:
SELECT job FROM emp;
以上的查詢結(jié)果似乎有一些不妥熬尺。因?yàn)楣ぷ鞔嬖谥貜?fù)值锨天,既然要查詢的是工作菊卷,所以肯定應(yīng)該將重復(fù)的內(nèi)容消除掉缔恳,所以在查詢的時(shí)候可以通過(guò) DISTINCT 直接消除掉所有的重復(fù)列。
SELECT {DISTINCT} * | 具體的列 別名FROM 表名稱 ;
但是洁闰,在消除重復(fù)列的時(shí)候歉甚,有一點(diǎn)必須說(shuō)明,如果要同時(shí)查詢多列扑眉,則必須保證所有列都重復(fù)才能消除掉纸泄。
例如:查詢雇員的編號(hào)及工作
SELECT DISTINCT empno,job FROM emp ;
因?yàn)楣蛦T編號(hào)不重復(fù)赖钞,所以此時(shí)證明所有的列沒(méi)有重復(fù)的,所以不能消除掉聘裁。
1.5 要求查詢出雇員的編號(hào)雪营,姓名,工作衡便,但是顯示的格式:
編號(hào)是:7369 的雇員献起,姓名是:SMITH,工作是:CLERK
要想實(shí)現(xiàn)此種功能镣陕,則可以使用 Oracle 中提供的字符串連接操作谴餐,使用“||”表示。如果要加入一些顯示信息的話呆抑,所有的其他的固定信息要使用“'”括起來(lái)岂嗓。
SELECT '編號(hào)是:' || empno || '的雇員,姓名是:' || ename || '鹊碍,工作是:' || jobFROM emp ;
1.6 在查詢中也可以使用四則運(yùn)算功能厌殉,例如:要求,求出每個(gè)雇員的姓名及年薪侈咕。
SELECT ename , sal * 12 FROM emp ;
在程序中 sal*12 意義很不明確公罕,所以最好為這個(gè)運(yùn)算結(jié)果起一個(gè)別名,但是在起別名的時(shí)候一定要回避中文乎完。
SELECT ename , sal * 12 incomeFROM emp ;
程序中可以支持+熏兄、-、*树姨、/的語(yǔ)句,所有的語(yǔ)句要有優(yōu)先順序桥状,先乘除后加減帽揪。
2. 限定查詢(WHERE子句)
2.1 如果希望可以根據(jù)指定的條件查詢的話,則必須指定限定查詢辅斟。限定查詢的語(yǔ)法:
SELECT {DISTINCT} * | 具體的列 別名FROM 表名稱{WHERE 條件(s)}
2.1.1 范例:查詢出工資大于 1500 的所有雇員信息
· 數(shù)學(xué)計(jì)算中转晰,工資大于:sal>1500
SELECT * FROM emp WHERE sal>1500 ;
2.1.2 范例:查詢每月可以得到獎(jiǎng)金的雇員信息
·獎(jiǎng)金是 comm 字段
·只要字段中存在內(nèi)容,則表示此內(nèi)容不為空(null)士飒,如果存在內(nèi)容查邢,則會(huì)顯示具體的值。
·不為空的表示:字段 IS NOT NULL
SELECT * FROM emp WHERE comm IS NOT NULL ;
2.1.3 范例:查詢沒(méi)有獎(jiǎng)金的雇員
沒(méi)有獎(jiǎng)金則 comm 字段的內(nèi)容肯定是 null酵幕,格式:字段 IS NULL
SELECT * FROM emp WHERE comm IS NULL ;
2.1.4 范例:要求查詢出扰藕,基本工資大于 1500,同時(shí)可以領(lǐng)取獎(jiǎng)金的雇員信息芳撒。
· 此時(shí)應(yīng)該是兩個(gè)條件邓深,而且兩個(gè)條件必須同時(shí)滿足未桥;
· 既然要求兩個(gè)條件全部滿足,則必須使用 AND 操作符進(jìn)行條件的連接芥备。
SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL ;
同時(shí)指定了兩個(gè)條件,兩個(gè)條件必須同時(shí)滿足才可以查詢出結(jié)果萌壳。
2.1.5 范例:要求查詢出亦镶,基本工資大于 1500,或者可以領(lǐng)取獎(jiǎng)金的雇員信息袱瓮。
· 如果要表現(xiàn)出或者的概念使用 OR 進(jìn)行連接缤骨,表示兩個(gè)條件有一個(gè)滿足即可。
SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL ;
之前使用 NOT 可以取反荷憋,把真的條件變?yōu)榧俚模俚淖優(yōu)檎娴摹?/p>
2.1.6 范例:要求查詢出褐望,基本工資不大于 1500勒庄,同時(shí)不可以領(lǐng)取獎(jiǎng)金的雇員信息。
· 此時(shí)相當(dāng)于是整體的條件取反瘫里。
SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL) ;
從程序中可以發(fā)現(xiàn),通過(guò)括號(hào)表示一組的條件谨读。
2.1.7 范例:查詢基本工資大于 1500局装,但是小于 3000 的全部雇員信息
· 滿足兩個(gè):sal > 1500 ,sal < 3000
SELECT * FROM emp WHERE sal>1500 AND sal<3000 ;
在 SQL 語(yǔ)法中铐尚,提供了一個(gè)專門的指定范圍查詢的過(guò)濾語(yǔ)句:BETWEEN...AND....
語(yǔ)法格式:
字段 BETWEEN 最小值 AND 最大值
2.1.8 范例:使用 BETWEEN...AND 修改之前的操作
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
實(shí)際上 BETWEEN ... AND 操作等價(jià):sal>=1500 AND sal<=3000,包含了等于的功能哆姻。
2.1.9 范例:查詢出在 1981 年雇傭的全部雇員信息
· 1981年1月1日 ~ 1981年12月31日之間雇傭的雇員· 日期表示的時(shí)候要加“ ' ”
SELECT * FROM empWHERE hiredate BETWEEN '1-1 月 -81' AND '31-12 月-81' ;
結(jié)論:BETWEEN ... AND 查詢除了可以支持?jǐn)?shù)字之外宣增,也可以支持日期的查詢· 隨著深入的學(xué)習(xí)會(huì)發(fā)現(xiàn),日期實(shí)際上也是以數(shù)字的形式表示出來(lái)矛缨。
2.1.10 范例:要求查詢出姓名是 smith 的雇員信息· 此時(shí)告訴了要查詢的名字爹脾,條件:ename='smith'
SELECT * FROM emp WHERE ename='smith' ;
執(zhí)行以上的查詢語(yǔ)句之后,并不會(huì)返回查詢結(jié)果箕昭,再次查詢數(shù)據(jù)庫(kù)表的信息灵妨,發(fā)現(xiàn) smith 是采用大寫的形式表示的,在 Oracle 中是對(duì)大小寫敏感的落竹,所以此時(shí)在查詢的時(shí)候必須以大寫的形式進(jìn)行條件的編寫泌霍。代碼修改如下:
SELECT * FROM emp WHERE ename='SMITH' ;
2.1.11 范例:要求查詢出雇員編號(hào)是 7369、7499筋量、7521 的雇員的具體信息· 如果此時(shí)按照之前的做法烹吵,則設(shè)置條件要使用 OR 連接:
|- empno=7369 OR empno=7499 OR empno=7521
SELECT * FROM empWHERE empno=7369 OR empno=7499 OR empno=7521 ;
實(shí)際上碉熄,此時(shí)是指定了查詢的范圍,那么既然有范圍了在 SQL 語(yǔ)法中就可以使用 IN 操作符完成肋拔。
語(yǔ)法格式:
字段 IN (值 1,值 2,.....,值 n)
如果現(xiàn)在要求查詢的內(nèi)容不在此范圍之中锈津,則可以使用 NOT IN,語(yǔ)法如下:
字段 NOT IN (值 1,值 2,.....,值 n)
范例:使用以上的格式進(jìn)行修改
SELECT * FROM empWHERE empno IN (7369,7499,7521) ;
2.1.12 范例:要求查詢出雇員編號(hào)不是 7369凉蜂、7499琼梆、7521 的雇員的具體信息
SELECT * FROM empWHERE empno NOT IN (7369,7499,7521) ;
另外,需要說(shuō)明的是窿吩,使用 IN 操作符不光可以用在數(shù)字上茎杂,也可以用在字符串的信息上。
2.1.13 范例:要求查詢出姓名是 SMITH纫雁、ALLEN煌往、KING 的雇員信息
SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING') ;
提示: 如果在指定的查詢范圍中指定了額外的內(nèi)容,則不影響程序運(yùn)行轧邪。
SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING','#$#$$##$') ;
在一般的日常見(jiàn)到的站點(diǎn)中經(jīng)常發(fā)現(xiàn)有模糊查找功能刽脖,即:輸入一個(gè)指定的關(guān)鍵字,把符合的內(nèi)容全部查詢出來(lái)忌愚,在 SQL 中使用 LIKE 語(yǔ)句完成曲管。
在使用 LIKE 語(yǔ)句的時(shí)候要注意通配符的問(wèn)題,在 LIKE 語(yǔ)句中主要使用以下兩種通配符:
· “%”:可以匹配任意長(zhǎng)度的內(nèi)容
· “_”:可以匹配一個(gè)長(zhǎng)度的內(nèi)容
2.1.14 范例:查詢出所有雇員姓名中第二個(gè)字母包含“M”的雇員信息
SELECT * FROM empWHERE ename LIKE '_M%' ;
2.1.15 范例:查詢出雇員姓名中包含字母 M 的雇員信息· 此時(shí)硕糊,表示可以在任意的位置上出現(xiàn)字母 M
SELECT * FROM empWHERE ename LIKE '%M%' ;
但是院水,要提醒大家的是:“如果在使用 LIKE 的時(shí)候沒(méi)有指定查詢的關(guān)鍵字,則表示查詢?nèi)俊?/p>
SELECT * FROM empWHERE ename LIKE '%%' ;
將所有的記錄都查詢出來(lái)了简十。
使用 LIKE 還可以方便的進(jìn)行日期的查找功能檬某。
2.1.16 范例:要求查詢出在 1981 年雇傭的雇員信息
SELECT * FROM empWHERE hiredate LIKE '%81%' ;
2.1.17 范例:查詢工資中包含 6 的雇員信息
SELECT * FROM empWHERE sal LIKE '%5%' ;
在操作條件中還可以使用:>、>=螟蝙、=橙喘、<、<=等計(jì)算符號(hào)不等于符號(hào):在 SQL 中如果要想使用不等于符號(hào)胶逢,可以有兩種形式:“<>”、“!=”范例:查詢雇員編號(hào)不是 7369 的雇員信息
· 使用“<>”完成
SELECT * FROM emp WHERE empno<>7369
· 使用“!=”完成
SELECT * FROM emp WHERE empno!=7369 ;
2.2 對(duì)結(jié)果進(jìn)行排序(ORDER BY子句)
在 SQL 中可以使用 ORDER BY 子句對(duì)查詢的結(jié)果進(jìn)行排序饰潜,例如初坠,現(xiàn)在使用查詢?nèi)康恼Z(yǔ)句:
SELECT * FROM emp ;
此時(shí),從查詢結(jié)果可以發(fā)現(xiàn)彭雾,是按照雇員的編號(hào)進(jìn)行排序的碟刺,那么此時(shí)如果要對(duì)使用指定的列進(jìn)行排序,則就必須使用 ORDER BY 語(yǔ)句薯酝,語(yǔ)法格式如下:
SELECT {DISTINCT} * | 具體的列 別名 FROM 表名稱 {WHERE 條件(s)} {ORDER BY 排序的字段 1,排序的字段 2 ASC|DESC} ASC 表示升序半沽、DESC 表示降序
范例:要求按照工資由低到高排序
SELECT * FROM emp ORDER BY sal ;
之前是按照由低到高的順序完成爽柒,是采用的升序的形式,現(xiàn)在要求使用降序的形式完成者填。實(shí)際上如果在排序的時(shí)候沒(méi)有指定排序規(guī)則浩村,則默認(rèn)的排序規(guī)則是升序排列。
SELECT * FROM emp ORDER BY sal ASC ;
要想使用降序的方式完成占哟,則使用 DESC 即可心墅。
SELECT * FROM emp ORDER BY sal DESC ;
范例:要求查詢出 10 部門的所有雇員信息,查詢的信息按照工資由高到低排序榨乎,如果工資相等怎燥,則按照雇傭日期由早到晚排序。
· 此時(shí)存在兩個(gè)排序條件蜜暑,第一個(gè)是降序铐姚,第二個(gè)升序
SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ;
3. 單行函數(shù)
數(shù)據(jù)庫(kù)系統(tǒng)中,每個(gè)數(shù)據(jù)庫(kù)之間唯一不同的最大區(qū)別點(diǎn)就在與函數(shù)的支持上肛捍,使用函數(shù)可以完成一系列的操作功能隐绵。
單行函數(shù)語(yǔ)法:
function_name(column|expression,[arg1,arg2,...])
參數(shù)說(shuō)明:
· function_name:函數(shù)名稱
· column:數(shù)據(jù)庫(kù)列名
· expression:字符串或計(jì)算表達(dá)式
· arg1,arg2:在函數(shù)中使用參數(shù)
單行函數(shù)分類:
· 字符函數(shù):接受字符輸入并且返回字符或數(shù)值
· 數(shù)值函數(shù):接受數(shù)值輸入并返回?cái)?shù)值
· 日期函數(shù):對(duì)
·日期型數(shù)據(jù)進(jìn)行操作
· 轉(zhuǎn)換函數(shù):從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型
· 通用函數(shù):NVL 函數(shù)篇梭、DECODE 函數(shù)
3.1 字符函數(shù)
字符函數(shù)是專門處理字符的氢橙,例如,可以將大寫字符變?yōu)樾?恬偷,還能求出字符的長(zhǎng)度悍手。
范例:將小寫字母變?yōu)榇髮懽帜?/p>
SELECT UPPER('smith') FROM DUAL ;
范例:一般用戶在查詢一個(gè)人姓名的時(shí)候有可能考慮到這個(gè)人的姓名是大寫字母存的還是小寫字母保存的呢?
· 那么此時(shí),為了方便用戶的使用就可以使用 upper 函數(shù)完成袍患。
SELECT * FROM emp WHERE ename=UPPER('Smith') ;
還可以使用 lower()函數(shù)將一個(gè)字符串變?yōu)樾懽帜副硎尽?/p>
SELECT LOWER('HELLO WORLD') FROM dual ;
還可以使用 initcap()函數(shù)將單詞的第一個(gè)字母大寫
SELECT INITCAP('HELLO WORLD') FROM dual ;
范例;使用此函數(shù)將雇員表中的雇員姓名變?yōu)殚_(kāi)頭字母大寫
SELECT INITCAP(ename) FROM emp ;
字符串除了可以使用“||”連接之外坦康,還可以使用 CONCAT()函數(shù)進(jìn)行連接操作。
SELECT CONCAT('hello ','world') FROM DUAL ;
此時(shí)已經(jīng)完成了連接诡延,但是此種方式肯定不如“||”好使滞欠。在字符函數(shù)中可以進(jìn)行字符串的截取、求出字符串的長(zhǎng)度肆良、進(jìn)行指定內(nèi)容的替換
· 字符串截取:substr()
· 字符串長(zhǎng)度:length()
· 內(nèi)容替換:replace()
SELECT substr('hello',1,3) 截取字符串 , length('hello') 字符串長(zhǎng)度 , replace('hello','l','x') 字符串替換 FROM DUAL ;
· Oracle 中 substr()函數(shù)的截取點(diǎn)是從 0 還是從 1 開(kāi)始筛璧。
|- 從 0 或從 1 開(kāi)始效果是一樣的,因?yàn)?Oracle 比較智能惹恃。
范例:要求顯示所有雇員的姓名及姓名的后三個(gè)字符
· 因?yàn)楣蛦T姓名的字符串長(zhǎng)度不一樣夭谤,所以只能求出整個(gè)的長(zhǎng)度再減去 2,這樣進(jìn)行截取操作巫糙。
SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;
此時(shí)朗儒,功能已經(jīng)實(shí)現(xiàn)了,但是操作比較麻煩。實(shí)際上在 substr()函數(shù)中提供了一種非常方便的機(jī)制醉锄,可以采用倒著截取的方式乏悄,只要輸入的位置是負(fù)數(shù)就表示倒著進(jìn)行。
SELECT ename,SUBSTR(ename,-3,3) FROM emp ;
3.2 數(shù)值函數(shù)
數(shù)值函數(shù)只要是包含以下幾種:
· 四舍五入:ROUND()
· 截?cái)嘈?shù)位:TRUNC()
· 取余(取模):MOD
范例:執(zhí)行四舍五入操作
SELECT ROUND(789.536) FROM dual ;
當(dāng)然恳不,在 ROUND()函數(shù)中也可以指定四舍五入的位數(shù)
范例:保留兩位小數(shù)
SELECT ROUND(789.536,2) FROM dual ;
在使用 ROUND()函數(shù)中還有一點(diǎn)非常有意思檩小,可以直接對(duì)整數(shù)進(jìn)行四舍五入的進(jìn)位。
SELECT ROUND(789.536,-2) FROM dual ;
TRUNC()與 ROUND()不同的是妆够,在 TRUNC()操作中识啦,不會(huì)保留任何的小數(shù),而且小數(shù)點(diǎn)也不會(huì)執(zhí)行四舍五入的操作神妹。
范例:驗(yàn)證 TRUNC()函數(shù)
SELECT TRUNC(789.536) FROM DUAL ;
范例:通過(guò) TRUNC()也可以指定小數(shù)點(diǎn)的保留位數(shù)
SELECT TRUNC(789.536,2) FROM DUAL ;
范例:使用負(fù)數(shù)表示位數(shù)
SELECT TRUNC(789.536,-2) FROM DUAL ;
范例:使用 MOD()函數(shù)可以進(jìn)行取余的操作
SELECT MOD(10,3) FROM DUAL ;
喜歡的朋友可以點(diǎn)一點(diǎn)關(guān)注颓哮。