一、什么是SQL語(yǔ)言?
SQL是結(jié)構(gòu)化查詢語(yǔ)言的縮寫(Structure Query Language),簡(jiǎn)單的說(shuō),SQL是一種關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,它可以訪問(wèn)以邏輯集的形式有序地儲(chǔ)存在數(shù)據(jù)庫(kù)的數(shù)據(jù),這些邏輯集稱為表。實(shí)際上SQL是一種計(jì)算機(jī)編程語(yǔ)言,但它比傳統(tǒng)的編程語(yǔ)言,如,BASIC,F(xiàn)ORTRAN等簡(jiǎn)單的多。另外SQL是關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,了解了SQL也就理解了關(guān)系數(shù)據(jù)庫(kù),因此在整個(gè)關(guān)系數(shù)據(jù)庫(kù)體系中SQL是最基礎(chǔ)、也是最重要的部分。
其顯著的優(yōu)點(diǎn):
1、 它是一種非過(guò)程化的交互式語(yǔ)言,它對(duì)數(shù)據(jù)的處理是以集合為單位的,即每次處理一個(gè)記錄集而不是每次處理一個(gè)單個(gè)記錄。SQL對(duì)數(shù)據(jù)提供導(dǎo)航,這意味著用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,而不必指定數(shù)據(jù)的存取方法。
2、 SQL是一種所有用戶都可以使用的語(yǔ)言,這些用戶包括系統(tǒng)管員、數(shù)據(jù)庫(kù)管理員,程序開(kāi)發(fā)人員,應(yīng)用程序員及其它許多的終端用戶,SQL可在任何Oracle產(chǎn)品中使用,它可以用于數(shù)據(jù)庫(kù)的操作。如數(shù)據(jù)查詢、修改和刪除,對(duì)表進(jìn)行插入、修改和刪除行。控制對(duì)數(shù)據(jù)庫(kù)和數(shù)據(jù)對(duì)象的存取,保證數(shù)據(jù)庫(kù)的一致性和完整性。
3、 SQL是所有關(guān)系數(shù)據(jù)庫(kù)的公共語(yǔ)言。它是世界公認(rèn)的標(biāo)準(zhǔn)的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。用戶可方便地移植用SQL語(yǔ)言編寫的程序。ORACLE支持SQL語(yǔ)言的執(zhí)行。ORALCE在標(biāo)準(zhǔn)SQL語(yǔ)言的基礎(chǔ)上新增加了許多功能,使的它功能更加強(qiáng)大,使用起來(lái)更加靈活。在以后的學(xué)習(xí)中,如不特殊說(shuō)明,提到的SQL指ORALCE化的SQL
1.1、 SQL與SQL*PLUS、PL/SQL幾個(gè)概念的區(qū)別
SQL*PLUS:SQL*PLUS是ORACLE提供的一個(gè)用來(lái)處理ORACLE數(shù)據(jù)和生成報(bào)表的工具,主要實(shí)現(xiàn)二個(gè)功能
A、 它提供給用戶與ORACLE交互式的界面,在此環(huán)境下可自由、靈活、 方便的實(shí)現(xiàn)ORACLE的SQL對(duì)關(guān)系數(shù)據(jù)的處理活動(dòng)。
B、 輸出格式化報(bào)表
PL/SQL:從V6開(kāi)始,ORACLE實(shí)現(xiàn)了一種過(guò)程處理語(yǔ)言,稱為PL/SQL,它具有與大多數(shù)其它程序設(shè)計(jì)語(yǔ)言相似的編程結(jié)構(gòu),它是在SQL的基礎(chǔ)上擴(kuò)充形成的,可以理解為PL/SQL=SQL+過(guò)程控制、功能擴(kuò)充語(yǔ)句。
1.2、其它幾個(gè)需明確的常用術(shù)語(yǔ)
ORACLE中的對(duì)象:
是一個(gè)有意義的事務(wù),可在其內(nèi)部存放信息,我們常談到的對(duì)象類型中表和視圖是最常見(jiàn)的。
函數(shù):是施加于數(shù)據(jù)的操作,它改變數(shù)據(jù)的特性。
提交:使用COMMIT語(yǔ)句將已修改的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。在此之前對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)修改只存在各自的緩存區(qū)內(nèi)。COMMIT是將在緩存區(qū)中以修改的內(nèi)容寫到數(shù)據(jù)庫(kù)文件中。
回滾:ROLLBACK當(dāng)為了某各個(gè)對(duì)話更改數(shù)據(jù)庫(kù)之后,由于某種原因不想提交此更改,ORALCE所采取的操作,這是一個(gè)把信息恢復(fù)到更改前的操作。
保留字:被ORACLE使用的具有特殊含義的字符,不能用做變量名。
1.3、SQL語(yǔ)言的組成
1、數(shù)據(jù)定義語(yǔ)言 create,drop,alter
2、數(shù)據(jù)查詢語(yǔ)言 select
3、數(shù)據(jù)操作語(yǔ)言 update,insert,delete
4、數(shù)據(jù)控制語(yǔ)言 grant,revoke(撤消權(quán)限)
二、SQL語(yǔ)言的數(shù)據(jù)類型
CHAR 存放定長(zhǎng)字符數(shù)據(jù) 最長(zhǎng)2000
VARCHAR2 存放可變長(zhǎng)字符數(shù)據(jù) 最長(zhǎng)4000
NUMBER(L,D) 存放數(shù)值數(shù)據(jù),L代表總位數(shù) D代表小數(shù)點(diǎn)后位數(shù)
DATE 日期 范圍公元前4712年1月1日到公元后4712年12月31日
NCHAR 與CHAR類似,只不過(guò)最大長(zhǎng)度由數(shù)據(jù)庫(kù)使用的字符集決定
BLOB 二進(jìn)制大對(duì)象,最大長(zhǎng)度4GB
LONG 存放可變字符數(shù)據(jù),最大為2GB
RAW 純二進(jìn)制對(duì)象,最大長(zhǎng)度為2000字節(jié)
VARCHAR 目前等同于CHAR
一、字符型
char和varchar2數(shù)據(jù)類型用來(lái)存儲(chǔ)字符、數(shù)據(jù), 具有比二種類型的列可以存儲(chǔ)任何一個(gè)字符。由于Oracle的空格填充值(即在字符中尾問(wèn)用空格填充時(shí)的空格值)只存儲(chǔ)在char列中,而不存varchar2列中,所以用varchar2存數(shù)要比用char存數(shù)占用的空間少,由于這個(gè)理由, 在含varchar2列的大表在進(jìn)行全表掃描比在char列中存儲(chǔ)相同數(shù)據(jù)的表上, 進(jìn)行全表掃描的數(shù)據(jù)塊較少,若應(yīng)用程序經(jīng)常需要在含字?jǐn)?shù)大表中掃描時(shí),應(yīng)存在varchar2中而不存儲(chǔ)在char列中, 這樣可改善程序的性能。但在決定使用什么數(shù)據(jù)類型時(shí),性能不是唯一決定的因素,例如,在比較字符串的值時(shí),希望Oracle忽略掉尾部空格, 則必須把這些值存儲(chǔ)在char列中,因而選什么數(shù)據(jù)類型,應(yīng)該關(guān)心應(yīng)用程序關(guān)心的語(yǔ)義間的不同。
1、char
用來(lái)存儲(chǔ)固定長(zhǎng)度的字符串,在建立具有char列的表時(shí),必須說(shuō)明該列長(zhǎng)度(以字節(jié)為單位)。列的長(zhǎng)度1-255間,default值為1。
注意:如果指定的值比較短,則用空格填充該值固定長(zhǎng)度,則Oracle返回一個(gè)錯(cuò)誤信息。
若兩個(gè)char型字符串比較大小時(shí),若兩值長(zhǎng)度不同,則在較短值中插入空格。 直到值有相同的長(zhǎng)度。比較時(shí),只有尾部空格數(shù)不同,其它部分相同的二個(gè)值被認(rèn)為相等。
2、varchar2
存儲(chǔ)可變長(zhǎng)度的字符串,建立具有varchar2列的表時(shí),說(shuō)明該列長(zhǎng)度(以字節(jié)為單位)。最大長(zhǎng)度1-2000之間,對(duì)每條記錄,該列的每一值都可作為可變長(zhǎng)字段來(lái)存儲(chǔ),例如,一個(gè)列被說(shuō)明為varchar2數(shù)據(jù)類型,長(zhǎng)度為50,若一條特定記錄中類varchar2列給出10個(gè)單字節(jié),字符,則就在該列中存儲(chǔ)10個(gè)字符而不最50個(gè)。 兩個(gè)varchar(2)列比較值時(shí),只須在二個(gè)值須相同的字符,且還有相同的長(zhǎng)度時(shí)才認(rèn)為相等。
3、varchar
目前與varchar2數(shù)據(jù)類型相同,但在Oracle未來(lái)版中,varchar數(shù)據(jù)類型可能會(huì)使用不同的比較語(yǔ)義,所以最好用varchar2數(shù)據(jù)類型。
二、數(shù)字型
即number用來(lái)存儲(chǔ)0,正負(fù),定點(diǎn)數(shù)長(zhǎng)正負(fù)浮點(diǎn)數(shù)。用number數(shù)據(jù)類型的數(shù)字(精度最多為38位十進(jìn)制數(shù))保證能在運(yùn)行Oracle的不同系統(tǒng)中移值。存儲(chǔ)在number列中的數(shù)字范圍。
說(shuō)明數(shù)字列的方法:
1)column_name number
2)column_name number(精度,小數(shù)位數(shù))若沒(méi)有指出小數(shù)的位數(shù),則隱含為沒(méi)有小數(shù),小數(shù)的位數(shù)范圍。-84<=x<=127。
注意:若給出的小數(shù)位數(shù)是負(fù)數(shù),則實(shí)際數(shù)被舍入到小數(shù)點(diǎn)左邊指定的位數(shù),如,說(shuō)明為(7,-2)就意味著舍入到最接近的百位數(shù)。
三、日期型
即date數(shù)據(jù)類型,用來(lái)存儲(chǔ)表中的日期和時(shí)間,存儲(chǔ)的內(nèi)部有年(包括世紀(jì))、月、日、時(shí)、分和秒。對(duì)應(yīng)于世紀(jì)、年、月、日、分和秒。 輸入、輸出日期時(shí),標(biāo)準(zhǔn)缺省格式,DD-MON-YY。
如:’04-JAN-98’
如果輸入一個(gè)不 當(dāng)前缺省日期格式的日期,則用帶有格式掩碼的函數(shù)to_date。
如,to_date(‘november,13,1992’,’month,dd,yyyy’)dd_mon_yy則yy表示20世紀(jì)中的年。
例31-DEC-92表示1992.12.31。
存儲(chǔ)時(shí)間格式(24小時(shí)):HH:MM:SS,若沒(méi)有輸時(shí)間,則日期字中時(shí)間取缺省值:12:00:00A.M,若沒(méi)有輸日期,只輸入了時(shí)間,則日期部分取缺省值為當(dāng)月的第一天,為了輸入日期的時(shí)間部分,可以使用帶有指出時(shí)間部分的格式掩碼的函數(shù)to_date。如:
insert into birthdays(bname,bday) values(‘annie’,to_date(‘13-nov-32 10:56am,’dd_mov_yy nn:m i am’);
要比較一個(gè)含有時(shí)間數(shù)據(jù)的日期,而不希望比較,則可使用函數(shù)據(jù)trunc,SQL函數(shù)sysdate返回系統(tǒng)的時(shí)期和時(shí)間。
四、long數(shù)據(jù)類型
用long定義的列可以存儲(chǔ)可變長(zhǎng)字符數(shù)據(jù),最多特性相同,根據(jù)式作站的可用內(nèi)存量可以限制long值的長(zhǎng)度。
long數(shù)據(jù)的使用:
在數(shù)據(jù)字典中用long數(shù)類定義的列存儲(chǔ)定義視圖的稿文,可以在select,update語(yǔ)句中的set子句和insert語(yǔ)句的values子句中使用由long定義的列。
long和logn raw數(shù)據(jù)的限制。
long和long raw列有許多作用,但使用它們時(shí)有限制。
1)每個(gè)表中只允許有一個(gè)long列。
2)long列不能出現(xiàn)在完整性約束中。
3)在子句where,order by,group by或connect by以及在select語(yǔ)句的distinct操作符中不能使用long列。
4)在sql函數(shù)(如substr可insert)中不能引用long列。
5)在子查詢的select中或有操作符union,onion all或minus的select中不能使用long列。
6)sql的表達(dá)式中不能使用long列。
7)用查詢創(chuàng)立表時(shí)(create table...as select)或用查詢插入一個(gè)表或視圖(insert into...select...)時(shí)不能引用long列。
8)不能用long數(shù)據(jù)類型說(shuō)明PL/SQL程序單元的變量。
在設(shè)計(jì)包含有l(wèi)ong或long raw數(shù)據(jù)的一些表時(shí),把long或long raw列放入一個(gè)表中,與它們有關(guān)的數(shù)據(jù)放入另一個(gè)表中,然后用完整性約束把二個(gè)表連起來(lái),這樣設(shè)計(jì)的結(jié)果就能使sql語(yǔ)句只訪有關(guān)的數(shù)據(jù),避免去讀整個(gè)long或long raw數(shù)據(jù),從而提高速度。例:為了存儲(chǔ)有關(guān)雜志的信息(包括每篇文本的稿文),可建兩個(gè)表。
五、Raw和Long Raw數(shù)據(jù)類型。
對(duì)Oracle不能解釋的數(shù)據(jù),即在不同的系統(tǒng)間傳輸它們時(shí)不能被轉(zhuǎn)換的數(shù)據(jù)可以使用數(shù)據(jù)類型Raw和Long Raw。擴(kuò)充這兩種數(shù)據(jù)開(kāi)的目的是將它們用于二進(jìn)制數(shù)和字節(jié)串。
Raw相同于Varchar2而Long Raw相同于Long Varchar,但對(duì)Raw和Long Raw數(shù)據(jù)不進(jìn)行字符集轉(zhuǎn)換,對(duì)于Char,Varchar2,Logn數(shù)據(jù)。
Oracle會(huì)自動(dòng)把它們從數(shù)據(jù)字符集轉(zhuǎn)換到通過(guò)參數(shù)Nls_Lang由用戶會(huì)話所定的字符集,這些就是它們的不同之處。
Oracle在Raw(Logn Raw)數(shù)據(jù)與Char數(shù)據(jù)進(jìn)行互相轉(zhuǎn)換時(shí),把數(shù)據(jù)看成一個(gè)能表示成每4個(gè)二進(jìn)制位為一個(gè)位圖的十六進(jìn)制數(shù)。
例如,輸入或顯示一個(gè)字節(jié)的Raw數(shù)據(jù)。
‘11001011’時(shí),把它看作’cb’。
Long Raw列不可被索引,Raw可以。
六、空與不空(NULL 、NOT NULL)——另一類數(shù)據(jù)類型
空(NULL)在PL*SQL代表另一類數(shù)據(jù)類型,它們表示缺少任何值換句話是沒(méi)有數(shù)據(jù)或是無(wú)信息。空值不同于零,很小的值,空白或其它任何數(shù)據(jù),SQL*PLUS對(duì)NULL進(jìn)行特殊處理。
PL*SQL應(yīng)用這一特殊數(shù)據(jù)類型是為了正確處理SQL*PLUS中的一些函數(shù),如平均值的統(tǒng)計(jì)或找最大、最小值。
空值(NULL)的使用:IS NULL 、IS NOT NULL
三、SQL*Plus的工作環(huán)境
SQL*Plus為用戶提供了很方便的界面環(huán)境,使得用戶可在SQL*Plus環(huán)境中輸入、編輯和運(yùn)行SQL、SQL*Plus 命令和 PL/ SQL塊,也可隨時(shí)獲得幫助信息。
3.1 SQL*Plus程序
ORACLE_HOME\BIN\PLUS**w.EXE或PLUS**.EXE(區(qū)別:PLUS**.EXE DOS環(huán)境下的PLUS)
ORACLE_HOME:95工作站 ORAWIN95 NT服務(wù)器 ORANT
**代表版本號(hào),常用的有PLUS33W.EXE、PLUS80W.EXE
3.2 SQL*Plus的進(jìn)入和退出
1、 直接運(yùn)行。EXE文件
2、 菜單 程序|ORACLE FOR WIN95|SQL*PLUS
3、 登錄 輸入:用戶、口令。
登錄成功后,顯示成功登錄信息并出現(xiàn)SQL提示符 SQL>
4、 退出 輸入:EXIT
3.3 利用SQL緩沖區(qū)進(jìn)行命令編輯和運(yùn)行。
1) 輸入SQL語(yǔ)句時(shí)可多行輸入,語(yǔ)句以‘;’作為結(jié)束時(shí)
2) SQL*PLUS緩沖區(qū):運(yùn)行SQL*PLUS時(shí),ORACLE在緩沖區(qū)保留最后執(zhí)行的命令,在SQL提示符下,輸入斜杠“/”并輸入“ENTER”,這個(gè)操作可再次執(zhí)行保留在緩沖區(qū)里的SQL語(yǔ)句。 利用系統(tǒng)文本編輯器,可以對(duì)緩沖區(qū)內(nèi)容進(jìn)行編輯,也稱全屏幕編輯。命令是:Edit
3) 很多情況下,在輸入命令時(shí)會(huì)發(fā)現(xiàn)輸入錯(cuò)誤,需要修改,這種情況下,使用SQL*PLUS命令行編輯器將使得輸入更容易些,它可以很快的修改SQL緩沖區(qū)內(nèi)的SQL語(yǔ)句。
提示:在使用LIST命令,可看到*號(hào),有*號(hào)的行即可進(jìn)行編輯的當(dāng)前行。
SQL*PLUS行編輯命令
編輯器命令 |
目 的 |
(a)ppend |
填加文本到當(dāng)前行尾 |
(c)hange/old/nes/ |
在當(dāng)前行以新的文本代替舊的文本 |
(c)hange/text/ |
從當(dāng)前行刪除文本 |
|
刪除當(dāng)前行 |
(i)nput text |
在當(dāng)前行之后填加一行 |
(L)ist |
顯示在緩沖區(qū)所有的行 |
(L)ist N |
顯示緩沖區(qū)的第N行 |
4)SQL*PLUS提供的一個(gè)有用的命令describe 用desc(describe)命令顯示一個(gè)指定表的每一個(gè)列的定義。語(yǔ)法:DESC <TABLENAME>
四、SQL語(yǔ)言的運(yùn)算符
算術(shù) +、-、*、/、正、負(fù)。
字符 ||(用于連接兩個(gè)字符串)例:'jack is'||'a boy'等操作。
比較 > 、< 、=、 != (或)<>、 <=、 >=、IN、BETWEEN。。。AND、LIKE
邏輯 not(邏輯非)、and(與)、or(或)。
集合 union(并)、intersect(交)、minus(差)。
五、創(chuàng)建練習(xí)用表
5.1 CREATE
功能:在數(shù)據(jù)庫(kù)中定義一新表
語(yǔ)法:CTEATE TABLE <TABLE_NAME>(
<COLUMN_NAME DATATYPE NULL 說(shuō)明>
)
例:CREATE TABLE DJ_NSRJB (
NSRSBH VARCHAR2(15) NOT NULL,
NSRMC VARCHAR2(80));
分析:由四部分組成
1、 CREATE 通知ORACLE 創(chuàng)建結(jié)構(gòu)
2、 TABLE 通知ORACLE創(chuàng)建對(duì)象的類型,這里指表
3、<TABLE_NAME> 表名是唯一且合法的表名
4、 COLUMNS 創(chuàng)建時(shí)需指出列名、數(shù)據(jù)類型及長(zhǎng)度定義如有NULL說(shuō)明,則在類型后做非空說(shuō)明
附:數(shù)據(jù)命名規(guī)則如下(適用于其它對(duì)象):
1)長(zhǎng)度在1-30個(gè)字符之間。
2)首字符必需為字母(A-Z)。
3)數(shù)據(jù)對(duì)象不能同已存在的名字沖突。
A、 在數(shù)據(jù)庫(kù)中表名和視圖名必需唯一。
B、 在同一張表中,列名必須是唯一。
4)在命名中不可使用ORACLE的保留字。
5.2 ALTER
功能一:用來(lái)向已存在表中增加列
語(yǔ)法:ALTER TABLE <TABLE_NAME> ADD(<COLUMN_NAME DATATYPE NULL 說(shuō)明>)
例:ALTER TABLE DJ_NSRJB ADD(JLX VARCHAR2(4),HY VARCHAR2(4));
分析:1)關(guān)鍵字 ALTER TABLE。
2) <TABLE_NAME> 所要修改的表名。
3)關(guān)鍵字 ADD 表明增加列
4)COLUMN定義略
功能二:用來(lái)修改已存在表中的列 修改列的寬度、重新定義空值說(shuō)明。
語(yǔ)法:ALTER TABLE <TABLE_NAME> MODIFY(<COLUMN_NAME DATATYPE NULL 說(shuō)明>)
例:ALTER TABLE DJ_NSRJB MODIFY(NSRSBH VARCHAR2(15) NOT NULL);
ALTER TABLE DJ_NSRJB MODIFY(NSRMC VARCHAR2(120));
分析:
1)關(guān)鍵字 ALTER TABLE
2)〈TABLE_NAME> 所要修改的表名
3)關(guān)鍵字 MODIFY 表明修改列
4)COLUMN定義略
5.3、DROP
功能:從數(shù)據(jù)庫(kù)中刪除一個(gè)現(xiàn)存表。
語(yǔ)法:DROP TABLE <TABLE_NAME>
5.4、錄入練習(xí)用表中的數(shù)據(jù)
INSERT
語(yǔ)法:INSERT INTO 〈TABLENAME〉(COL1,COL2,CL3。。。)VALUES(VAL1,VAL2,VAL2。。。);
分析:
1)SQL關(guān)鍵字INSERT INTO 和VALUES
2)變量〈TABLENAME〉必須是數(shù)據(jù)庫(kù)已存在的一個(gè)表,是準(zhǔn)備插入數(shù)據(jù)的一個(gè)表。
3)變量(COL1,COL2,COL3。。)指表中已存在的列
4)值表(VAL1,VAL2,VAL2。。。)由SQL把表中每個(gè)值分配給它們相對(duì)應(yīng)的列名插入數(shù)據(jù)必須在三個(gè)方面與它們的列定義相匹配數(shù)據(jù)類型必須相同。數(shù)據(jù)必須在它們特定的列大小要求范圍之內(nèi)數(shù)值和列必須是一一對(duì)應(yīng)的(第一個(gè)值與第一個(gè)列相對(duì)應(yīng),以此類推)
提示:在向表中插入一行數(shù)據(jù)時(shí),如果該表中定義了不為空的列,則在每一條插入語(yǔ)句都必須有該列的值。
例:INSERT INTO DJ_NSRJB(NSRSBH,NSRMC,F(xiàn)GKS,F(xiàn)GR)VALUES(‘14020010010001’,‘通達(dá)器材’,‘ZG’,HYK’);
語(yǔ)法二:INSERT INTO 表名1 (列1,列2,。。。) 查詢語(yǔ)句
分析:一次插入多行數(shù)據(jù)
例:INSERT INTO DJ_NSRJB (NSRSBH,NSRMC) SELECT NSRSBH,NSRMC FROM DJ_NSRJBBAK;比較單行插入,用SELECT語(yǔ)句的值代替VALUES子句。
練習(xí)
1、創(chuàng)建第一個(gè)練習(xí)表dj_nsrjb 納稅人基本信息
NSRSBH VARCHAR2(15) --納稅人識(shí)別號(hào)
NSRMC VARCHAR2(80) --納稅人名稱
FGKS VARCHAR2(4) --分管科室
FGR VARCHAR2(5) --分管人
JJLX VARCHAR2(3) --經(jīng)濟(jì)類型(注冊(cè)類型)
ZZSNSLX VARCHAR2(1) --增值稅納稅類型
2、向表中增加下面的列
HY VARCHAR2(2) --行業(yè)
BZRQ DATE --辦證日期
3、修改表中字段NSRMC到120位長(zhǎng)度,同時(shí)加NSRSBH約束不能為空。
4、 修改表中字段ZZSNSLX增加缺省值‘0’ 小規(guī)模
5、 創(chuàng)建第二個(gè)練習(xí)用表ZSJB
6、 插入練習(xí)數(shù)據(jù)
六、數(shù)據(jù)查詢語(yǔ)句SELECT
功能:SELECT命令用于從ORACLE數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)。
語(yǔ)法:SELECT 〈列名〉FROM 〈表名〉WHERE〈條件〉ORDER BY 〈列名〉
分析:SELECT (什么?) 子句,體現(xiàn)用戶檢索的信息,表中一個(gè)或多個(gè)列的名字。如果選擇多個(gè)列,列名之間必須用逗號(hào)分隔開(kāi),但最后的列名后面沒(méi)有逗號(hào),即與FROM相臨的列名之間沒(méi)有逗號(hào)。(必須) FROM(哪里?)子句,正確的表名(必須)WHERE〈條件〉子句,后面跟條件ORDER BY(排序)子句,排序列
提示:查看所有的列時(shí),SELECT 語(yǔ)句使用SELECT *
6.1 簡(jiǎn)單查詢,只有必須的查詢子句
1、 查詢表中部分字段的值。
例:SELECT NSRSBH,NSRMC FROM DJ_NSRJB;
2、 查詢表中的所有字段的值。
例:SELECT * FROM DJ_NSRJB;
3、 消除冗余行的查詢
例:SELECT DISTINCT NSRSBH FROM ZS_JB; /*有幾戶申報(bào)*/
例:SELECT DISTINCT JJLX FROM DJ_NSRJB; /*DJ_NSRJB表中有幾種注冊(cè)類型的納稅戶*/
4、 用被選擇列的別名來(lái)指定顯示選擇結(jié)果時(shí)的列名
例:SELECT NSRMC ‘MC‘ FROM DJ_NSRJB;在顯示結(jié)果時(shí)用MC代替NSRMC
5、 虛表DUAL的使用(選學(xué)內(nèi)容)
DUAL用于測(cè)試函數(shù)或完成快速計(jì)算,是一個(gè)小而有用的ORACLE表,ORACLE只為其提供一行一列的內(nèi)容。
SQL〉DESC DUAL;
DUMMY CHAR(1)
DUAL的作用:在ORACLE的許多函數(shù)即可以用于列也可以用于常量,通過(guò)DAUL可以發(fā)現(xiàn)某些函數(shù)只能用于常量,在下面的列子中SELECT語(yǔ)句沒(méi)有指明是表中的哪一行,哪一列。
例:計(jì)算POWRE(4,3) 即4的3次方
SQL〉SELECT POWRE(4,3)FROM DUAL;
結(jié)果顯示:64
提示:也可以把DUAL表理解成是一塊隨時(shí)可用內(nèi)存。
6.2 條件查詢
比較運(yùn)算符
單值測(cè)試
YBSE 〉1000 應(yīng)補(bǔ)稅額大于1000
YBSE 〈1000 應(yīng)補(bǔ)稅額小于1000
YBSE 〉= 1000 應(yīng)補(bǔ)稅額大于等于1000
YBSE 〈=1000 應(yīng)補(bǔ)稅額小于等于1000
YBSE 〈〉1000 應(yīng)補(bǔ)稅額不等于1000
YBSE !=1000 應(yīng)補(bǔ)稅額不等于1000
值列表測(cè)試(對(duì)多值測(cè)試)
應(yīng)補(bǔ)稅額在400和1500之間的包括400和1500
YBSE BETWEEN 400 AND 1500
應(yīng)補(bǔ)稅額小于400和大于1500
YBSE NOT BETWEEN 400 AND 1500
稅種在列表(‘01‘,’02‘,’03‘)中
SZ IN (‘01‘,’02‘,‘03)
稅種不在列表(‘01‘,’02‘,’03‘)中
SZ NOT IN (‘01‘,’02‘,‘03)
提示:
YBSE BETWEEN 400 AND 1500 等價(jià)于 YBSE〉= 400 AND YBSE〈=1500 SZ IN (‘01‘,’02‘,‘03)等價(jià)于 SZ=’01‘ OR SZ=’02‘ OR SZ=’03‘
LIKE模式匹配
SQL*PLUS通配符_(下劃線) 表示任意一字符
%(百分號(hào))表示一個(gè)不確定的串
語(yǔ)法: LIKE ‘查找串’
分析:查找串可以是字母、數(shù)字、特殊字符和SQL*PLUS通配符----百分號(hào)(%)和下劃線(_)的組合。百分號(hào)代表“零或任意多個(gè)字”。下劃線代表“列特定位置上的任意一個(gè)字符”----- 一個(gè)且僅一個(gè)字符。除了通配符外,查找串中所有其它字符只能表示自身,查找串放在單引號(hào)內(nèi)。通過(guò)NOT和LIKE的結(jié)合使用,可以查找列值不在查找串中的行。例: NSRMC LIKE ‘%計(jì)算機(jī)%‘ 納稅人名稱包括計(jì)算機(jī)的 NSRMC LIKE ‘計(jì)算機(jī)%‘ 納稅人名稱以計(jì)算機(jī)開(kāi)頭 NSRMC LIKE NOT ‘%計(jì)算機(jī)‘ 納稅人名稱不以計(jì)算機(jī)結(jié)尾 NSRMC LIKE ‘_計(jì)%‘ 納稅人名稱第二個(gè)字是‘計(jì)’字的
WHERE (條件)子句
WHERE 子句:后面跟條件,條件是由一個(gè)列名,比較操作符和比較值組成。
例:NSRSBH = ‘1343423’ 納稅人識(shí)別號(hào)等于
YBSE>1500 應(yīng)補(bǔ)稅額大于20
由多個(gè)條件組成復(fù)合條件,條件之間用AND 、OR組合。
例:NSRSBH= ‘1343423’ AND YBSE〉1500
納稅人識(shí)別號(hào)等于‘1343423’ 而且應(yīng)補(bǔ)稅額大于1500
SBRQ BETWEEN ‘01-JAN-99’ AND ‘31-JAN-99’ AND YBSE〉1500 一月份申報(bào)的而且應(yīng)補(bǔ)稅額大于1500
SZ IN (‘01’,‘02,’03) AND JJLX=‘110’ 稅種是增值稅、消費(fèi)稅、營(yíng)業(yè)稅而且注冊(cè)類型是國(guó)有企業(yè)的
NSRMC LIKE ‘計(jì)算機(jī)%‘ OR JJLX=‘110’ 納稅人名稱以計(jì)算機(jī)開(kāi)頭或注冊(cè)類型是國(guó)有企業(yè)的
6.3排序結(jié)果表:ORDER BY
通過(guò)在SELECT語(yǔ)句中增加一個(gè)ORDER BY排序子句可以控制輸出的顯示順序。ORDER BY按照所要求的列值條件把結(jié)果表中的行進(jìn)行排序,也可以對(duì)多個(gè)列中的行進(jìn)行排序,列名用逗號(hào)分開(kāi)。
ORDER BY 〈列名〉A(chǔ)SC(默認(rèn)) 升序方式排序
ORDER BY 〈列名〉DESC 降序方式排序
多列排序ORDER BY 〈COLUMN1〉,〈COLUMN2 DESC〉,〈COLUMN3〉,。。。。。
排序規(guī)則:較高:字母
高: 數(shù)字(按代數(shù)值大小)
NULL最低(大型機(jī)系統(tǒng)中,NULL最高)
例:ORDER BY SZ,NSRSBH,YBSE DESC 先按稅種,納稅人識(shí)別號(hào),再按應(yīng)補(bǔ)額從大到小。
6.4 學(xué)會(huì)使用五個(gè)組值函數(shù)(行函數(shù))
SQL是一個(gè)非過(guò)程數(shù)據(jù)訪問(wèn)語(yǔ)言,它沒(méi)有IF -THEN –ELSE結(jié)構(gòu),也沒(méi)有直接存儲(chǔ)和操作臨時(shí)值的機(jī)制,僅僅利用標(biāo)準(zhǔn)的SELECT- FROM –WHERE操作,它不能完成像在列中求最大、最小等一些典型的數(shù)據(jù)分析工作,SQL開(kāi)發(fā)人員意識(shí)到這一點(diǎn),因此該用戶提供了五個(gè)組值函數(shù):
AVG 計(jì)算列的平均值
SUM 計(jì)算列的總合
MIN 顯示列的最小值
MAX 顯示列的最大值
COUNT 統(tǒng)計(jì)結(jié)果表中的行數(shù)
語(yǔ)法:FUNCTION(列名或單值表達(dá)式)
提示:
1、 需要處理的列名必須在括號(hào)之間 函數(shù)(列名)
2、 如果使用一個(gè)函數(shù),SELECT子句中的所有列都必須帶有函數(shù)(使用GROUP BY 時(shí)例外)
3、 對(duì)于算術(shù)表達(dá)式可以使用函數(shù)
4、 對(duì)列中包含有NULL值時(shí),大多數(shù)函數(shù)將忽略該值。
詳解
AVG
語(yǔ)法:AVG(列名)或AVG(DISTINCT(列名))
提示:AVG只能處理數(shù)字類型列AVG忽略所處理列中的有NULL值的行 如列名前加上DISTINCT關(guān)鍵字,對(duì)于列中重復(fù)的值只處理一次NULL值示例
1,2,3,4,NULL 結(jié)果:2。5
1,2,3,4,0 結(jié)果:2
例:SELECT AVG(YBSE) FROM ZS_JB WHERE ZZSNSLX=‘2’; 一般納稅人平均應(yīng)補(bǔ)稅額。
MAX
語(yǔ)法:MAX(列名)
提示:MAX可對(duì)所有數(shù)據(jù)類型進(jìn)行操作
當(dāng)列為字符類型時(shí),返回按ASCII排序的最大值
當(dāng)列為數(shù)值類型時(shí),返回最大代數(shù)值
當(dāng)列為日期類型時(shí),返回列中最大的日期值
AVG忽略所處理列中的有NULL值的行
例:SELECT MAX(YBSE) FROM ZS_JB WHERE ZZSNSLX=‘2’ AND SZ=‘01’; 一般納稅人增值稅最大的應(yīng)補(bǔ)稅額。
MIN(略)
SUM
語(yǔ)法:SUM(列名)
提示:SUM只能處理數(shù)字類型列
SUM忽略所處理列中的有NULL值的行
如列名前加上DISTINCT關(guān)鍵字,對(duì)于列中重復(fù)的值只處理一次
例:SELECT SUM(SBSE) FROM ZS_JB WHERE HZLXHRQ BETWEEN ‘01-JAN-99’ AND ‘31-JAN-99’; 一月份的入庫(kù)稅額。
COUNT
1、 返回一個(gè)表示結(jié)果表行數(shù)的整數(shù)
SELECT COUTN(*)
因?yàn)镃OUNT(*)在行一級(jí)上工作,因此有NULL域的行也統(tǒng)計(jì)在內(nèi)
例:SELECT COUNT(*) FROM DJ_NSRJB WHERE JJLX=‘110’; 國(guó)有企業(yè)的納稅戶登記戶數(shù)。
2、 返回列中具有不同的值的個(gè)數(shù)
SELECT COUNT(DISTINCT(列名)) 因?yàn)樗窃诹幸患?jí)工作。因此它將不統(tǒng)計(jì)NULL域
例:SELECT COUNT(DISTINCT(JJLX)) FROM DJ_NSRJB; 現(xiàn)有登記戶數(shù)共有幾種注冊(cè)類型。
6.5 學(xué)會(huì)使用列值函數(shù)(列函數(shù))
函數(shù):SQL語(yǔ)言提供了許多可以直接調(diào)用的函數(shù)。
一、字符函數(shù)。
1、LPAD
格式:LPAD(char1,n[char2])
功能:在char1的左邊加上char2的字符序列,直到新的字符串長(zhǎng)為n。
例: LPAD('A',4,'0')='000A'
2、RPAD
格式:RPAD(char1,n[char2])
功能:在char1的右邊加上char2的字符序列,直到新的字符串長(zhǎng)為n。
例: RPAD('a',4,'0')='A000'
3、SUBSTR
格式: SUBSTR(char,m[,n])
功能:從char的第m個(gè)字符開(kāi)始取n個(gè)字符。
4、LTRIM
格式:LTRIM(char [,set])
功能:從char的左邊移去屬于set字符集中的字母,直到第一個(gè)不屬于set中的字符為止。set 缺省為空格。
例:LTRIM('aac','a')='c';
LTRIM(' c')='c';
5、RTRIM
格式:RTRIM(char [,set])
功能:從char的右邊移去屬于set字符集中的字母,直到第一個(gè)不屬于set中的字符為止。
6、LENGTH
格式:LENGTH(char)
功能:返回字符串char的長(zhǎng)度。
二、日期函數(shù)
1、ADD_MONTHS
格式:ADD_MONTHS(d,n);
功能:d日期加n個(gè)月返回的日期。
2、LAST_DAY
格式:LAST_DAY(d);
功能:包含日期d的月份的最后一天。
3、MONTHS_BETWEEN
格式:MONTHS_BETWEEN(d1,d2)
功能:返回d1與d2之間含有多少個(gè)月。
三、數(shù)值函數(shù)
1、CELL
格式:CELL(n)
功能:返回大于或等于n的最大整數(shù)。
例:CELL(4.5)=5
2、FLOOR
格式:FLOOR(n)
功能:返回小于或等于n的最大整數(shù)。
例:FLOOR(-3.1)=-4
3、ROUND
格式:ROUND(n [,m])
功能:返回將n舍入到小數(shù)點(diǎn)右邊m位的值。
例:ROUND(8.99,1)=9
4、TRUNC
格式:TRUNC(n[,m]
功能:返回在m位截?cái)嗟膎值,當(dāng)m省略時(shí),在0位截?cái)啵琺為頁(yè)數(shù),小數(shù)點(diǎn)左邊m個(gè)數(shù)字截去。
例:TRUNC(8.99,1)=8.9
5、TO_CHAR
格式:TO_CHAR(n[,fmt])
TO_CHAR(d[,fmt])
fmt:'Mon.dd.yyyy'
'Day.month.dd'
'YYYY,MM,DD'
功能:按照f(shuō)mt格式將日期型轉(zhuǎn)換成varchar2型。
6、TO_DATE
格式:TO_DATE(char[,fmt])
功能:按照f(shuō)mt指定的日期格式將char由char型轉(zhuǎn)換成日期型。
7、TO_NUMBER
格式:TO_NUMBER[char[,fmt])
功能:將char由char型轉(zhuǎn)換成數(shù)值型。
四、空值替換函數(shù) NVL
格式:NVL(expr1,expr2)
功能:若expr1為空則返expr2;若expr1不為空則返expr2.
五、譯碼函數(shù)DECODE(選學(xué)內(nèi)容)
DECODE函數(shù)是ORACLER的SQL中功能最強(qiáng)的函數(shù)之一。
格式:Decode(value,if1,then1,if2,then2,...,else)
Value代表了表中的任意列(不論何種數(shù)據(jù)類型)或一個(gè)計(jì)算所得的任何結(jié)果,如一個(gè)日期減去另一個(gè)日期,字符列的SUBSTR函數(shù),一個(gè)數(shù)字乘以另一個(gè)數(shù)字,等等。每一行的value均被測(cè)試。如果value等于if1,DECODE函數(shù)的結(jié)果是then1,如果value等于if2,DECODE函數(shù)的結(jié)果是then2,等等,事實(shí)上可以構(gòu)造盡可能多的if/then配對(duì)。如果value不等于任何一個(gè)if值,那么DECODE函數(shù)的結(jié)果是else。每一個(gè)if和then以及else還可以是一列或者是函數(shù)或計(jì)算式的結(jié)果。
例:Decode(page,'1','page1','2','page2','turn to 11page')
6.6 學(xué)會(huì)如何解決實(shí)際問(wèn)題(綜合練習(xí)一)
七、數(shù)據(jù)操縱語(yǔ)句
數(shù)據(jù)操縱語(yǔ)句執(zhí)行后必須執(zhí)行撤消或提交。
撤消由 rollback 命令執(zhí)行,提交由 commit 命令執(zhí)行
插入、修改、刪除數(shù)據(jù):insert、update、delete。
一、 插入:INSERT(略)
二、 刪除:DELETE
例:delete from bonus;
delete from bonus where ename='SMITH';
注意:1)刪除依賴于WHERE條件所指定的范圍。
2) 一次只能對(duì)一個(gè)表執(zhí)行刪除操作。
3) DELETE并不刪除表(使用DROP刪除表)。
4) 同INSERT一樣,DELETE也能引起引用完整性問(wèn)題。截?cái)嗫梢钥焖賱h除表中所有數(shù)據(jù),不執(zhí)行行級(jí)觸發(fā)器。
TRUNCATE table new_dept;
三、修改:UPDATE
例: update bonus set comm=comm+50 where sal>2000;
用嵌入的select語(yǔ)句可以修改多列。
update bonus set(hiredate,sal)=(select hiredate,sal from emp where ename=‘SMITH’ );
用定值修改:
update bonus set comm=null;
注意:insert,update,delete的主要問(wèn)題是,仔細(xì)地構(gòu)造where子句,使它們只影響你真正想要的行,在你提交之前,一定要仔細(xì)小心,以免操作錯(cuò)誤。同時(shí)看看結(jié)果,執(zhí)行了多少行,是否是你想要的行數(shù)(rows)。