posts - 9,  comments - 10,  trackbacks - 0

          一、什么是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)前行刪除文本

          Del

          刪除當(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)。


          posted on 2007-06-15 09:47 老董 閱讀(4012) 評(píng)論(4)  編輯  收藏 所屬分類: Oracle

          FeedBack:
          # re: SQL語(yǔ)言教程
          2007-06-15 09:50 | 戀戀冬季
          期待舉例說(shuō)明......  回復(fù)  更多評(píng)論
            
          # re: SQL語(yǔ)言教程
          2007-06-15 09:55 | 老董
          別急,to be continue....  回復(fù)  更多評(píng)論
            
          # re: SQL語(yǔ)言教程
          2007-06-28 16:19 | 你好
          支持,很不錯(cuò)的哦,
          也歡迎到我博客作客:
          笑一笑,十年少。
          http://hexun.com/klf118/default.html   回復(fù)  更多評(píng)論
            
          # re: SQL語(yǔ)言教程
          2007-07-30 15:39 | 緣木求魚(yú)
          update bonus set(hiredate,sal)=(select hiredate,sal from emp where ename=‘SMITH’ );
          這句是錯(cuò)的吧
          update不支持這種格式,要修改多列只能一列一列的賦值  回復(fù)  更多評(píng)論
            
          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(9)

          隨筆檔案(9)

          文章分類(3)

          文章檔案(3)

          友情鏈接

          • 戀戀冬季
          • 一個(gè)很值得收藏的關(guān)于軟件測(cè)試方面的blog

          搜索

          •  

          積分與排名

          • 積分 - 12736
          • 排名 - 2166

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 玛多县| 民勤县| 崇左市| 会理县| 汝州市| 琼结县| 元朗区| 化隆| 灵台县| 南和县| 旬阳县| 色达县| 扶绥县| 无为县| 西城区| 镇康县| 木兰县| 白银市| 建始县| 大埔区| 西乌珠穆沁旗| 张家川| 兴山县| 富平县| 密山市| 三门县| 毕节市| 韩城市| 娱乐| 房山区| 阿巴嘎旗| 廉江市| 蒙阴县| 兴文县| 沙洋县| 南陵县| 扎鲁特旗| 汉沽区| 乐昌市| 锦州市| 防城港市|