簡(jiǎn)單的表操作
指令:創(chuàng)建簡(jiǎn)單表:createtable student(name varchar2(20), age number(3) );
插入新記錄:insert into studentvalues('stone',24);
查看表結(jié)構(gòu):desc student;
查詢記錄:select * from student;
刪除表:drop table student;
刪除表中的數(shù)據(jù):delete from studentwhere 條件;
說(shuō)明:SQLPlusWorksheet中用“--”作為單行注釋標(biāo)記。varchar2(20)標(biāo)明可變長(zhǎng)度的字符串,上限為20
number(3)標(biāo)明age為不包含小數(shù)點(diǎn)的3位的整數(shù)。如果只定義成number,則系統(tǒng)默認(rèn)為10位的整數(shù)
單引號(hào)引起來(lái)的字符是SQL語(yǔ)言中字符串常量的表示方式。SQL語(yǔ)言中的關(guān)鍵字大小寫是不敏感的
數(shù)據(jù)庫(kù)開發(fā)人員喜歡使用大寫關(guān)鍵字。應(yīng)用程序開發(fā)人員多數(shù)使用小寫的,以實(shí)現(xiàn)良好的可讀性
插入記錄后,其實(shí)并沒(méi)有在數(shù)據(jù)庫(kù)中立即永久生效,這時(shí)可以使用commit;提交數(shù)據(jù)的更新操作
簡(jiǎn)單的Select語(yǔ)句
語(yǔ)法格式:SELECT *|{<字段名>,...} FROM <表名>;--字段間用逗號(hào)隔開。在逗號(hào)后面添加空格可以增強(qiáng)可讀性
例如select * from emp;或select empno, ename, sal from emp;
顯示效果:Sql*plus的默認(rèn)顯示:Date和character型數(shù)據(jù)左對(duì)齊,Numeric型數(shù)據(jù)右對(duì)齊,列標(biāo)題默認(rèn)顯示為大寫
iSql*plus的默認(rèn)顯示:列標(biāo)題默認(rèn)顯示為大寫,列標(biāo)題缺省居中對(duì)齊
使用算術(shù)表達(dá)式
概述:在Select語(yǔ)句中,對(duì)NUMBER型數(shù)據(jù)可以使用算術(shù)運(yùn)算符(+、-、*、/)創(chuàng)建表達(dá)式
舉例:select empno, ename, sal, sal*12 from emp;--查詢emp中員工的編號(hào)姓名工資和年薪
select empno, ename, sal, sal*12+1000 from emp;
select empno, ename, sql, sal*(12+1000) from emp;--可以使用括號(hào)更改計(jì)算順序
連接運(yùn)算符
概述:即“||”可以把列與字符或其它表達(dá)式連接在一起,得到一個(gè)新的字符串,實(shí)現(xiàn)“合成”列的功能
舉例:select ename || ' is a ' || job from emp;
select empno, ename ||'''s annual salary is'|| sal*12 from emp;
說(shuō)明:用一個(gè)單引號(hào)代表字符串常量的分隔標(biāo)記。用兩個(gè)單引號(hào)代表字符串常量中出現(xiàn)的一個(gè)單引號(hào)字符
在查詢的時(shí)候,也不需要轉(zhuǎn)義符,直接用兩個(gè)單引號(hào)代表字符串常量中出現(xiàn)的一個(gè)單引號(hào)即可
使用字段別名
概述:重命名查詢結(jié)果中的字段,以增強(qiáng)可讀性。如果別名中使用特殊字符或強(qiáng)制輸出大小寫時(shí)需使用雙引號(hào)
格式:SELECT <字段名>|<表達(dá)式> [[AS]<字段別名>],... FROM<表名>;
舉例:select empno, ename "Ename", sal*12 "年 薪" from emp;
select empno as 員工編號(hào), ename 員工姓名, sal*12 "年薪" from emp;
說(shuō)明:as可以不加。別名可以用雙引號(hào)引起來(lái)。如果別名中不包含特殊字符,雙引號(hào)可以省略
如果別名中包含了空格,如"年 薪",就必須加雙引號(hào),否則將被解析成兩個(gè)成份,導(dǎo)致語(yǔ)法上出問(wèn)題
如果Ename不加雙引號(hào),那么執(zhí)行后會(huì)顯示為ENAME。只有給它加上雙引號(hào)之后,才會(huì)遵重大小寫來(lái)顯示
空值
概述:空值是無(wú)效的,未指定的,未知的或不可預(yù)知的值??罩挡坏韧?或空格
舉例:select empno, ename, sal, comm from emp;--執(zhí)行后某些記錄的comm屬性會(huì)顯示一片空白,即空值
insert into student(age) values(24);--插入數(shù)據(jù)時(shí),如果沒(méi)有指定name值,那么默認(rèn)的name就是空值
補(bǔ)充:算術(shù)表達(dá)式中如果出現(xiàn)空值,則整個(gè)表達(dá)式結(jié)果為空
連接表達(dá)式中出現(xiàn)的空值被當(dāng)作一個(gè)空的(長(zhǎng)度為零的)字符串處理
如select ename, sal, comm, ename || ' - ' || comm, sal+comm from emp;
在算術(shù)表達(dá)式中如果涉及到空值的話,可以使用相應(yīng)的函數(shù)對(duì)可能存在空值的字段進(jìn)行缺省值的設(shè)置
經(jīng)過(guò)判斷之后,如果它是空值,則返回0,如果不是空值,則返回它真正的值,然后再進(jìn)行算術(shù)運(yùn)算
去除重復(fù)行
概述:缺省情況下,查詢結(jié)果中顯示所有符合條件的記錄行,包括重復(fù)行??梢允褂肈ISTINCT可以清除重復(fù)行
DISTINCT的作用范圍是后面所有字段的組合,即后面的多個(gè)字段的組合不出現(xiàn)重復(fù)就可以了
舉例:select deptno from emp;--本意是查詢部門編號(hào)的種類,顯示的卻是所有的編號(hào),包括重復(fù)編號(hào)
select distinct deptno from emp;--清除查詢結(jié)果中重復(fù)的部門編號(hào)
select distinct deptno, job from emp;--只要deptno和job組合后的結(jié)果不重復(fù),那么就都顯示輸出
說(shuō)明:通常把極為簡(jiǎn)單的數(shù)據(jù)處理,包括數(shù)據(jù)的查詢、組合、過(guò)濾或轉(zhuǎn)換類型等操作,均交給數(shù)據(jù)庫(kù)進(jìn)行處理
比如分組統(tǒng)計(jì)、求和、求平均值、過(guò)濾空值、過(guò)濾重復(fù)值、數(shù)據(jù)開頭和結(jié)尾的空格過(guò)濾、字符串轉(zhuǎn)日期型等等
而對(duì)于復(fù)雜些的業(yè)務(wù)邏輯,或者與商業(yè)邏輯相關(guān)的內(nèi)容,建議在應(yīng)用程序中處理。這樣也就實(shí)現(xiàn)了松散的耦合
查詢結(jié)果排序
概述:查詢結(jié)果缺省按照記錄的插入順序進(jìn)行排列??梢允褂肙RDER BY子句對(duì)查詢結(jié)果進(jìn)行排序
排序方式包括升序(ASC,缺省)和降序(DESC)兩種。也可以使用字段別名排序或按多字段排序
舉例:select empno, ename, sal from emp order by sal;--按sal進(jìn)行升序排列,ASC可以省略不寫
select empno, ename, sal from emp order by sal desc;--按sal進(jìn)行降序排列
select empno, ename, sal*12 annsal from emp order by annsal;
select deptno, empno, ename, sal from emp order by deptno, sal;
說(shuō)明:多字段排序時(shí),先按照deptno排序,如果在得到的排列結(jié)果中存在重復(fù)的deptno記錄的話
就將重復(fù)的deptno記錄再按照sal排序。至于具體的排序方式,則需要對(duì)兩個(gè)字段進(jìn)行單獨(dú)指定
如deptno,sal表示二者均按升序排列。deptno,sal desc表示deptno按升序排列,sal按降序排列
如deptno desc,sal表示deptno按降序排列,sal按升序排列。依此類推
這種邏輯適合由數(shù)據(jù)庫(kù)在查詢階段進(jìn)行處理。在應(yīng)用程序中通過(guò)代碼來(lái)實(shí)現(xiàn)的話,就會(huì)困難一些
條件查詢
說(shuō)明:在查詢語(yǔ)句中或查詢條件中使用字符串或日期的時(shí)候,字符串和日期值要用單引號(hào)括起來(lái)
字符串大小寫敏感。日期值格式敏感,缺省的日期格式是DD-MON-RR
注意:凡涉及到字符串內(nèi)容的比較,大小寫都是敏感的
格式:SELECT *|{[DISTINCT]<字段名>|<表達(dá)式>[<別名>],...} FROM<表名> [WHERE <查詢條件>];
舉例:select * from emp where ename='SMITH';--這里所要查詢的SMITH嚴(yán)格區(qū)分大小寫
select * from emp where hiredate='02-4月-81';--系統(tǒng)會(huì)自動(dòng)將符合約定格式的字符串轉(zhuǎn)換成Date型
select sysdata from dual;--以缺省的日期格式獲取當(dāng)前的系統(tǒng)時(shí)間
說(shuō)明:表dual中只有一行一列,它本身并不保存系統(tǒng)時(shí)間,sysdate永遠(yuǎn)代表當(dāng)前的系統(tǒng)時(shí)間
通常在進(jìn)行簡(jiǎn)單的查詢或運(yùn)算的時(shí)候,dual表起一個(gè)媒介的作用,使得形式上看起來(lái)像是查詢
dual的好處在于只有一行記錄,它一般用在練習(xí)時(shí)測(cè)試某些指令。一般不在真實(shí)的開發(fā)使用它
比如select 3+2 from dual;返回5。又如select 3+2 from emp;則會(huì)返回很多行的5
它會(huì)對(duì)emp中每一行記錄都查詢,但查的不是真正保存的內(nèi)容,而是逐行的計(jì)算一遍3+2
再把得到的5作為一個(gè)唯一的結(jié)果,也是唯一的一個(gè)字段返回來(lái),所以結(jié)果就是10多行的5
對(duì)于Oracle數(shù)據(jù)庫(kù),即使是想讓它做一個(gè)簡(jiǎn)單的常量表達(dá)式的運(yùn)算,也要采用問(wèn)答的形式
即便此時(shí)所有的數(shù)據(jù)都在用戶的手中,那也要裝作是查詢,給它一個(gè)指令,令其返回結(jié)果
關(guān)系運(yùn)算符
符號(hào):BETWEEN...AND...:界于兩值之間,包括邊界,并且必須把小的數(shù)值放在前面
IN(set):出現(xiàn)在集合中。判斷是否存在某字段等于集合中的值的記錄
LIKE:模糊查詢,也叫通配查詢
IS NULL:判斷空值
示例:select * from emp where sal between 1600 and 2900;--查詢工資界于1600和2900之間的員工的信息
select * from emp where ename in('SMITH','KING','King');--返回姓名為set中的元素的值的記錄
select * from emp where comm is null;--返回所有comm字段的值為空的記錄
select * from emp where comm is not null;--返回非空的。注意0和空是不同的
注意:凡涉及到字符串內(nèi)容的比較,大小寫都是敏感的。即in()中的值需要與ename值完全匹配方可查詢出記錄
LIKE:%代表零或多個(gè)字符。_代表一個(gè)字符??梢允褂肊SCAPE標(biāo)識(shí)特殊符號(hào)
select * from emp where ename like 'S%';--查詢以S開頭的姓名的記錄。這里S仍然是大小寫敏感的
select * from emp where ename like '_A%';--查詢第二個(gè)字母是A的姓名的記錄
select * from emp where ename like '%_%' escape '';--返回姓名存在下劃線的記錄
這里的escape標(biāo)明“”起到轉(zhuǎn)義符的作用。在真實(shí)的開發(fā)中,這種轉(zhuǎn)義符用的并不多
Oracle中的轉(zhuǎn)義符可以隨便定義,所以例句中的“”也可以換成其它的符號(hào),如“K”
說(shuō)明:用一個(gè)單引號(hào)代表字符串常量的分隔標(biāo)記。用兩個(gè)單引號(hào)代表字符串常量中出現(xiàn)的一個(gè)單引號(hào)字符
在模糊查詢的時(shí)候,也不需要轉(zhuǎn)義符,直接用兩個(gè)單引號(hào)代表字符串常量中出現(xiàn)的一個(gè)單引號(hào)即可
邏輯運(yùn)算符
概述:優(yōu)先級(jí)由高至低:NOT→AND→OR
舉例:select * from emp where deptno=20 and sal>2000;--返回部門編號(hào)為20而且工資大于2000的記錄
select * from emp where deptno=20 or sal>2000;--返回部門編號(hào)為20的人或者工資大于2000的記錄
select * from emp where deptno not in(20,30,40);--返回部門編號(hào)沒(méi)有出現(xiàn)在該集合中的人的信息
更多信息請(qǐng)查看IT技術(shù)專欄