版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ASP數(shù)據(jù)庫操作大全|提前閱讀:|什么叫活動服務(wù)器組件(Active Server Compontents)?組件是基于Activex技術(shù)的代碼片斷,通過指定接口提供指定的一組服務(wù),組件供給客戶端(Clients)在運行時候請求的對象。你可以理解成組件是一種程序,通過調(diào)用這種程序,你可以實現(xiàn)你在ASP程序中無法實現(xiàn)或者很難實現(xiàn)的功能,組件是一種很好的代碼重用方法。我們可以運用Active Server Pages設(shè)計制作動態(tài)、交互的Web頁面,但是一旦你開始著手工作,參與一些實際工作的時候,你會發(fā)現(xiàn)asp在某些方面功能不強(qiáng),甚至不借助服務(wù)器端組件就很難實現(xiàn)某些功能,例如:數(shù)據(jù)庫操作(我們通常使
2、用ADO,ADO就是一個組件),郵件功能,文件系統(tǒng)操作,圖形功能.但是幸運的是我們可以找到很多組件來提高ASP編程應(yīng)用能力,在下面的內(nèi)容我們將系統(tǒng)的介紹有關(guān)的組件,在下一章里面我們還將詳細(xì)介紹如何親自動手編寫組件?;顒臃?wù)器組件的調(diào)用方法服務(wù)器組件和ASP內(nèi)置對象應(yīng)用程序(Application)、會話(Session)、請求(Request)、響應(yīng)(Response)和服務(wù)器對象不同,不能直接使用,而必須首先被實例化。CreateObject函數(shù)創(chuàng)建一個對象并返回一個對對象的引用。這個函數(shù)的語法如下:Set objVar=Server.CreateObject(class)Class表示創(chuàng)建
3、什么樣的對象Class的格式如下顯示:application.className其中application是應(yīng)用程序的名字,className是這種對象的名字。一個application可以由一個或者多個對象組成。他們可以在內(nèi)部之間相互調(diào)用的。例如Set myConnection = Server.Createobject("AdoDB.Recordset")注意:不能這樣創(chuàng)建的Asp內(nèi)建對象的實例,如下面的例子將導(dǎo)致一個錯誤<% Set Response = Server.CreateObject("Response") %>你可以就通過在
4、你的ASP腳本中使用活動服務(wù)器端組件,創(chuàng)建動態(tài),交互的Web頁面|存取數(shù)據(jù)庫|附1.早期的數(shù)據(jù)庫連接是非常困難的. 因為各種數(shù)據(jù)庫的格式都不一樣,開發(fā)者得對他們所開發(fā)的每種數(shù)據(jù)庫的底層API必須有深刻的了解. 因此,能處理各種各樣數(shù)據(jù)庫的通用的API就應(yīng)運而生了ODBC(Open Database Connectivity), ODBC是人們在創(chuàng)建通用API的早期產(chǎn)物。在程序中可以使用相同的代碼訪問不同的數(shù)據(jù)產(chǎn)品,因此有許多種數(shù)據(jù)庫(如:Access, MS-SQL Server, Oracle, Informix等.)遵從了這種標(biāo)準(zhǔn),被稱為ODBC兼容的數(shù)據(jù)庫. ODBC的具體作用如圖所示:
5、 一般,odbc是由一套擴(kuò)展的dll(dynamiclinklibrary動態(tài)鏈接庫)組成,dll提供了標(biāo)準(zhǔn)的數(shù)據(jù)庫應(yīng)用程序設(shè)計接口。而odbc是建立在標(biāo)準(zhǔn)化的sql(structuredQueryLanguage,結(jié)構(gòu)化查詢語言)之上。所以通過odbc和sql,就可以編寫?yīng)毩⒂谌魏螖?shù)據(jù)庫產(chǎn)品的數(shù)據(jù)訪問程序。2、用odbc連接數(shù)據(jù)庫:odbc中提供三種dsn,它們的區(qū)別很簡單:用戶dsn只能用于本用戶。系統(tǒng)dsn和文件dsn的區(qū)別只在于連接信息的存放位置不同:系統(tǒng)dsn存放在odbc儲存區(qū)里,而文件dsn則放在一個文本文件中。在asp中使用它們時,寫法如下:A.鏈接sql serve
6、r: 用系統(tǒng)dsn:connstr="DSN=dsnname;UID=xx;PWD=xxx;DATABASE=dbname"用文件dsn: connstr="FILEDSN=xx;UID=xx;PWD=xxx;DATABASE=dbname" 還可以用連接字符串(從而不用再建立dsn): connstr="DRIVER=SQL SERVER;SERVER=servername;UID=xx;PWD=xxx" B.鏈接access: 用系統(tǒng)dsn: connstr="DSN=dsnname" (或者為:connstr
7、="DSN=dsnname;UID=xx;PWD=xxx") 用文件dsn:connstr="FILEDSN=xx" 還可以用連接字符串(從而不用再建立dsn): connstr="DRIVER=Microsoft Access Driver;DBQ=d:abcabc.mdb"3、缺陷:ODBC含有大量的低級的調(diào)用,因此開發(fā)ODBC應(yīng)用程序還比較困難. 開發(fā)者不得不將大量的精力花在底層的數(shù)據(jù)庫通信中,而不能專注于他們所要處理的數(shù)據(jù).OLE DB 多年以來,ODBC 已成為訪問客戶端服務(wù)器數(shù)據(jù)庫的標(biāo)準(zhǔn)。ODBC 提供了基于標(biāo)準(zhǔn)的接口,接
8、口要求 SQL 處理功能,并被優(yōu)化用于基于 SQL 的方法。然而,如果要訪問不使用 SQL 的非關(guān)系數(shù)據(jù)源(例如,不按照關(guān)系存儲數(shù)據(jù)的 Microsoft Exchange Server)中的數(shù)據(jù),情況會如何呢?進(jìn)入 OLE DB。OLE DB 建立于 ODBC 之上,并將此技術(shù)擴(kuò)展為提供更高級數(shù)據(jù)訪問接口的組件結(jié)構(gòu)。此結(jié)構(gòu)對企業(yè)中及 Internet 上的 SQL、非 SQL 和非結(jié)構(gòu)化數(shù)據(jù)源提供一致的訪問。(實際上,在訪問基于 SQL 的數(shù)據(jù)時,OLE DB 仍使用 ODBC,因為對于 SQL 它是最優(yōu)結(jié)構(gòu)。)OLE DB 由三個組件構(gòu)成:數(shù)據(jù)使用者(例如,一個應(yīng)用程序);包含并公開數(shù)據(jù)的
9、數(shù)據(jù)提供程序以及處理并傳輸數(shù)據(jù)的服務(wù)組件(例如,查詢處理器、游標(biāo)引擎)。OLE DB 是一個針對 SQL 數(shù)據(jù)源和非 SQL 數(shù)據(jù)源(例如,郵件和目錄)進(jìn)行操作的 API。OLE DB 為 C 和 C+ 程序員及使用其他包含 C 樣式函數(shù)調(diào)用語言的程序員提供綁定。有一些語言(例如 VB 和 VBScript)不提供指針數(shù)據(jù)類型(地址變量)。因此,這些語言不能使用 C 樣式綁定,而且不能直接調(diào)用 OLE DB。它實際上包涵了MicrosoftJet數(shù)據(jù)庫引擎,這是一個由MicrosoftAccess所使用的引擎,并允許應(yīng)用程序開發(fā)者通過ODBC象直接鏈接到其它數(shù)據(jù)庫一樣,直接鏈接到Access表
10、,當(dāng)然也可以訪問SQLSERVER數(shù)據(jù)庫。Dao最適用于單系統(tǒng)應(yīng)用程序或小范圍本地分布使用。在此基礎(chǔ)上,Microsoft 推出了另一個數(shù)據(jù)訪問對象模型:ADO(第一個是DAO)。ADO 采用基于 DAO 和 RDO 的對象,并提供比 DAO 和 RDO 更簡單的對象模型(盡管會產(chǎn)生一些冗余的功能,如現(xiàn)在進(jìn)行一項操作時可以用不止一種方法)。ADO 中的對象層次結(jié)構(gòu)比 DAO 中的更平緩。ADO 包含一些簡化對數(shù)據(jù)存儲區(qū)數(shù)據(jù)的訪問任務(wù)的內(nèi)置對象。而DAO是第一個面向?qū)ο蟮慕涌冢珼AO模型是設(shè)計關(guān)系數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)的對象類的集合。它們提供了完成管理一個關(guān)系型數(shù)據(jù)庫系統(tǒng)所需的全部操作的屬性和方法,這其
11、中包括創(chuàng)建數(shù)據(jù)庫,定義表、字段和索引,建立表間的關(guān)系,定位和查詢數(shù)據(jù)庫等。應(yīng)用程序連接到數(shù)據(jù)庫可采取的許多途徑。例如,VB 程序員可以使用 ADO 將應(yīng)用程序連接到 OLE DB 提供程序。如果數(shù)據(jù)庫不支持 OLE DB,應(yīng)用程序可以通過 ODBC 連接。Visual C+ (VC+) 程序員可以使用 ADO 或直接通過 OLE DB 連接。這里有microsoft,附end在ASP中,用來存取數(shù)據(jù)庫的對象統(tǒng)稱ADO對象(Active Data Objects)ADO包括的七個對象: Command:定義對數(shù)據(jù)源進(jìn)行操作的命令; Connection:建立一個數(shù)據(jù)源的連接; Error:提供數(shù)
12、據(jù)訪問錯誤的細(xì)節(jié); Field:表示一般數(shù)據(jù)類型的字段; Parameter:表示Command對象的參數(shù); Property:表示由數(shù)據(jù)源定義ADO對象的動態(tài)特性; Recordset:數(shù)據(jù)庫命令結(jié)果集對象。主要對象有三種:Connection、Recordset和Command,其中Connection負(fù)責(zé)打開或連接數(shù)據(jù)庫,Recordset負(fù)責(zé)存取數(shù)據(jù)表,Command負(fù)責(zé)對數(shù)據(jù)庫執(zhí)行行動查詢(Action Query)命令和執(zhí)行SQL Server的Stored Procedure。只依靠這三個對象還是無法存取數(shù)據(jù)庫的,還必須具有數(shù)據(jù)庫存取的驅(qū)動程序:OLE DB驅(qū)動程序和ODBC驅(qū)動
13、程序。對于任何一種數(shù)據(jù)庫都必須有相對應(yīng)的OLE DB驅(qū)動程序和ODBC驅(qū)動程序,ADO對象才能對數(shù)據(jù)庫進(jìn)行存取。附:通過ADO訪問數(shù)據(jù)庫的基本步驟通常都是以下五步: 創(chuàng)建數(shù)據(jù)庫鏈接 創(chuàng)建數(shù)據(jù)對象 操作數(shù)據(jù)庫 關(guān)閉數(shù)據(jù)對象和鏈接附end|創(chuàng)建數(shù)據(jù)庫鏈接|連接各數(shù)據(jù)庫可以使用驅(qū)動程序,也可以使用數(shù)據(jù)源(dns方式),不過我建議大家使用驅(qū)動程序,因為使用驅(qū)動程序非常方便、簡單,而使用數(shù)據(jù)源比較麻煩。下表有一定基礎(chǔ)的朋友應(yīng)該可以看懂.我們常用的數(shù)據(jù)庫都不會有密碼,所以下面的驗證方面的參數(shù)可以省略.但一個鏈接的完成最起碼應(yīng)該有兩個內(nèi)容:驅(qū)動程序及數(shù)據(jù)庫位置(dns方式生成的文件就包含了這兩個內(nèi)容).|數(shù)
14、據(jù)庫鏈接實例:|1.我們在一般情況下使用Access的數(shù)據(jù)庫比較多,在這里我建議大家連接Access數(shù)據(jù)庫使用下面的方法:dim connset conn = server.createobject("adodb.connection")conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("./db/bbs.mdb")其中./db/bbs.mdb是你的數(shù)據(jù)庫存放的相對路徑!如果你的數(shù)據(jù)
15、庫和ASP文件在同一目錄下,你只要這樣寫就可以了:dim connset conn = server.createobject("adodb.connection")conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("bbs.mdb")有許多初學(xué)者在遇到數(shù)據(jù)庫連接時總是會出問題,然而使用上面的驅(qū)動程序只要你的數(shù)據(jù)庫路徑選對了就不會出問題了。2.1.建立MdbRecordset對象。M
16、DB數(shù)據(jù)庫是一個完整的數(shù)據(jù)庫,內(nèi)部可能含有若干個數(shù)據(jù)表,在此函數(shù)中,Connection的作用是連接數(shù)據(jù)庫,Recordset的作用是打開數(shù)據(jù)表。Function CreateMdbRecordset(數(shù)據(jù)庫文件名, 數(shù)據(jù)表名或Select語句 )Dim conn,Provider,DBPath建立Connection 對象Set conn = Server.CreateObject(“ADODB.Connection”)Provider=“Provider=Microsoft.Jet.OLEDB.4.0;”DBPath = “Data Source=” Server.MapPath(“數(shù)據(jù)庫
17、文件名”)打開數(shù)據(jù)庫conn.Open Provider DBPathSet CreateMdbRecordset = Server.CreateObject(“ADODB.Recordset”)打開數(shù)據(jù)表CreateMdbRecordset.Open “數(shù)據(jù)表名”, conn, 2, 2End Function2.建立帶密碼的MDB數(shù)據(jù)庫的Recordset對象。它的建立方式與建立不帶密碼的MDB數(shù)據(jù)庫的Recordset對象類似,只是多了一個密碼參數(shù),即在與數(shù)據(jù)庫連接時,必須給出密碼信息。Function CreateSecuredMdbRecordset( 數(shù)據(jù)庫文件名, 數(shù)據(jù)表名或Se
18、lect語句,password )Dim conn,Provider,DBPath建立Connection 對象Set conn = Server.CreateObject(“ADODB.Connection”)Provider = “Provider=Microsof.Jet.OLEDB.4.0;”DBPath = “Data Source=” Server.MapPath(“數(shù)據(jù)庫文件名”)連接數(shù)據(jù)庫,注意要帶有密碼參數(shù)conn.Open Provider DBPath“Jet OLEDB:Database Password=”asswordSet CreateSecuredMdbReco
19、rdset = Server.CreateObject(“ADODB.Recordset”)打開數(shù)據(jù)表CreateSecuredMdbRecordset.Open “數(shù)據(jù)表名”, conn, 2, 2End Function附:Rs.open sql,conn,A,B 的A、B各代表什么?RS.OPEN SQL,CONN,A,BA: ADOPENFORWARDONLY(=0) 只讀,且當(dāng)前數(shù)據(jù)記錄只能向下移動ADOPENSTATIC(=3) 只讀,當(dāng)前數(shù)據(jù)記錄可自由移動ADOPENKEYSET(=1) 可讀寫,當(dāng)前數(shù)據(jù)記錄可自由移動ADOPEN
20、DYNAMIC(=2) 可讀寫,當(dāng)前數(shù)據(jù)記錄可自由移動,可看到新增記錄B: ADLOCKREADONLY(=1) 默認(rèn)值,用來打開只讀記錄ADLOCKPESSIMISTIC(=2) 悲觀鎖定ADLOCKOPTIMISTIC(=3) 樂觀鎖定ADLOCKBATCHOPTIMISTIC(=4) 批次樂觀鎖定PS:樂觀鎖定:完全依靠數(shù)據(jù)庫來管理鎖的工作。悲觀鎖定:應(yīng)用程序自己管理數(shù)據(jù)或?qū)ο笊系逆i處理(下面介紹recordeset的時候有更詳細(xì)的解釋).附endSQL常用命令使用方法:(1) 數(shù)據(jù)記錄篩選:sql="select *
21、 from 數(shù)據(jù)表 where 字段名=字段值 order by 字段名 desc"sql="select * from 數(shù)據(jù)表 where 字段名 like '%字段值%' order by 字段名 desc"sql="select top 10 * from 數(shù)據(jù)表 where 字段名 order by 字段名 desc"sql="select * from 數(shù)據(jù)表 where 字段名 in ('值1','值2','值3')"sql="select
22、 * from 數(shù)據(jù)表 where 字段名 between 值1 and 值2"(2) 更新數(shù)據(jù)記錄:sql="update 數(shù)據(jù)表 set 字段名=字段值 where 條件表達(dá)式"sql="update 數(shù)據(jù)表 set 字段1=值1,字段2=值2 字段n=值n where 條件表達(dá)式"(3) 刪除數(shù)據(jù)記錄:sql="delete from 數(shù)據(jù)表 where 條件表達(dá)式"sql="delete from 數(shù)據(jù)表" (將數(shù)據(jù)表所有記錄刪除)(4) 添加數(shù)據(jù)記錄:sql="insert into
23、數(shù)據(jù)表 (字段1,字段2,字段3 ) values (值1,值2,值3 )"sql="insert into 目標(biāo)數(shù)據(jù)表 select * from 源數(shù)據(jù)表" (把源數(shù)據(jù)表的記錄添加到目標(biāo)數(shù)據(jù)表)(5) 數(shù)據(jù)記錄統(tǒng)計函數(shù):AVG(字段名) 得出一個表格欄平均值COUNT(*¦字段名) 對數(shù)據(jù)行數(shù)的統(tǒng)計或?qū)δ骋粰谟兄档臄?shù)據(jù)行數(shù)統(tǒng)計MAX(字段名) 取得一個表格欄最大的值MIN(字段名) 取得一個表格欄最小的值SUM(字段名) 把數(shù)據(jù)欄的值相加引用以上函數(shù)的方法:sql="select sum(字段名) as 別名 from 數(shù)據(jù)表 where
24、條件表達(dá)式"set rs=conn.excute(sql)用 rs("別名") 獲取統(tǒng)的計值,其它函數(shù)運用同上。(5) 數(shù)據(jù)表的建立和刪除:CREATE TABLE 數(shù)據(jù)表名稱(字段1 類型1(長度),字段2 類型2(長度) )例:CREATE TABLE tab01(name varchar(50),datetime default now()DROP TABLE 數(shù)據(jù)表名稱 (永久性刪除一個數(shù)據(jù)表)附上另一資料:<<sql基本語句>>掌握SQL四條最基本的數(shù)據(jù)操作語句:Insert,Select,Update和Delete。 練掌握SQ
25、L是數(shù)據(jù)庫用戶的寶貴財 富。在本文中,我們將引導(dǎo)你掌握四條最基本的數(shù)據(jù)操作語句SQL的核心功能來依次介紹比較操作符、選擇斷言以及三值邏輯。當(dāng)你完成這些學(xué)習(xí)后,顯然你已經(jīng)開始算是精通SQL了。在我們開始之前,先使用CREATE TABLE語句來創(chuàng)建一個表(如圖1所示)。DDL語句對數(shù)據(jù)庫對象如表、列和視進(jìn)行定義。它們并不對表中的行進(jìn)行處理,這是因為DDL語句并不處理數(shù)據(jù)庫中實際的數(shù)據(jù)。這些工作由另一類SQL語句數(shù)據(jù)操作語言(DML)語句進(jìn)行處理。SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于這是大多數(shù)SQL用戶經(jīng)常用到的,我們有必要在此對它們進(jìn)行一一
26、說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應(yīng)一個特定的雇員記錄。請熟悉這張表,我們在后面的例子中將要用到它。INSERT語句用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語句:INSERT INTO EMPLOYEES VALUES ('Smith','John','1980-06-10', 'Los Angles',16,45000);通過這樣的INSERT語句,系統(tǒng)將試著將這些值填入到相應(yīng)的列中。這些列按照我們創(chuàng)建表時
27、定義的順序排列。在本例中,第一個值“Smith”將填到第一個列LAST_NAME中;第二個值“John”將填到第二列FIRST_NAME中以此類推。我們說過系統(tǒng)會“試著”將值填入,除了執(zhí)行規(guī)則之外它還要進(jìn)行類型檢查。如果類型不符(如將一個字符串填入到類型為數(shù)字的列中),系統(tǒng)將拒絕這一次操作并返回一個錯誤信息。如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務(wù)的支持。一次事務(wù)將數(shù)據(jù)庫從一種一致性轉(zhuǎn)移到另一種一致性。如果事務(wù)的某一部分失敗,則整個事務(wù)都會失敗,系統(tǒng)將會被恢復(fù)(或稱之為回退)到此事務(wù)之前的狀態(tài)。 回到原來的INSERT的例子,請注意所有的整形十進(jìn)
28、制數(shù)都不需要用單引號引起來,而字符串和日期類型的值都要用單引號來區(qū)別。為了增加可讀性而在數(shù)字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標(biāo)識符。對于日期類型,我們必須使用SQL標(biāo)準(zhǔn)日期格式(yyyy-mm-dd),但是在系統(tǒng)中可以進(jìn)行定義,以接受其他的格式。當(dāng)然,2000年臨近,請你最好還是使用四位來表示年份。既然你已經(jīng)理解了INSERT語句是怎樣工作的了,讓我們轉(zhuǎn)到EMPLOYEES表中的其他部分:INSERT INTO EMPLOYEES VALUES ('Bunyan','Paul',&
29、#39;1970-07-04', 'Boston',12,70000);INSERT INTO EMPLOYEES VALUES ('John','Adams','1992-01-21', 'Boston',20,100000);INSERT INTO EMPLOYEES VALUES ('Smith','Pocahontas','1976-04-06', 'Los Angles',12,100000);INSERT INTO EMPLOYEE
30、S VALUES ('Smith','Bessie','1940-05-02', 'Boston',5,200000);INSERT INTO EMPLOYEES VALUES ('Jones','Davy','1970-10-10', 'Boston',8,45000);INSERT INTO EMPLOYEES VALUES ('Jones','Indiana','1992-02-01', 'Chicago&
31、#39;,NULL,NULL);在最后一項中,我們不知道Jones先生的工薪級別和年薪,所以我們輸入NULL(不要引號)。NULL是SQL中的一種特殊情況,我們以后將進(jìn)行詳細(xì)的討論?,F(xiàn)在我們只需認(rèn)為NULL表示一種未知的值。有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進(jìn)行賦值。除了對要省略的列輸入NULL外,還可以采用另外一種INSERT語句,如下:INSERT INTO EMPLOYEES( FIRST_NAME, LAST_NAME, HIRE_DATE, BRANCH_OFFICE)VALUE( 'Indiana','Jones', &
32、#39;1992-02-01','Indianapolis');這樣,我們先在表名之后列出一系列列名。未列出的列中將自動填入缺省值,如果沒有設(shè)置缺省值則填入NULL。請注意我們改變了列的順序,而值的順序要對應(yīng)新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規(guī)定不能為空),SQL操作將失敗。讓我們來看一看上述INSERT語句的語法圖:INSERT INTO table(column ,column)VALUES(columnvalue ,columnvalue);和前一篇文章中一樣,我們用方括號來表示可選項,大括號表示可以重復(fù)任意次數(shù)的項
33、(不能在實際的SQL語句中使用這些特殊字符)。VALUE子句和可選的列名列表中必須使用圓括號。SELECT語句SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數(shù)據(jù)是數(shù)據(jù)庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問數(shù)據(jù)庫來分析數(shù)據(jù)并生成報表的人可以對其他SQL語句一竅不通。SELECT語句的結(jié)果通常是生成另外一個表。在執(zhí)行過程中系統(tǒng)根據(jù)用戶的標(biāo)準(zhǔn)從數(shù)據(jù)庫中選出匹配的行和列,并將結(jié)果放到臨時的表中。在直接SQL(direct SQL)中,它將結(jié)果顯示在終端的顯示屏上,或者將結(jié)果送到打印機(jī)或文件中。也可以結(jié)合其他SQL語句來將結(jié)果放到
34、一個已知名稱的表中。SELECT語句功能強(qiáng)大。雖然表面上看來它只用來完成本文第一部分中提到的關(guān)系代數(shù)運算“選擇”(或稱“限制”),但實際上它也可以完成其他兩種關(guān)系運算“投影”和“連接”,SELECT語句還可以完成聚合計算并對數(shù)據(jù)進(jìn)行排序。SELECT語句最簡單的語法如下:SELECT columns FROM tables;當(dāng)我們以這種形式執(zhí)行一條SELECT語句時,系統(tǒng)返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結(jié)果表。這就是實現(xiàn)關(guān)系投影運算的一個形式。讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以后所有SELECT語句實例都要使用的。而我們在圖2和圖3中給
35、出了查詢的實際結(jié)果。我們將在其他的例子中使用這些結(jié)果)。假設(shè)你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:SELECT BRANCH_OFFICE FROM EMPLOYEES;以上SELECT語句的執(zhí)行將產(chǎn)生如圖2中表2所示的結(jié)果。由于我們在SELECT語句中只指定了一個列,所以我們的結(jié)果表中也只有一個列。注意結(jié)果表中具有重復(fù)的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結(jié)果中的重復(fù)行,只要在SELECT語句中加上DISTINCT子句:SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEES;這次查詢的結(jié)果
36、如表3所示。現(xiàn)在已經(jīng)消除了重復(fù)的行,但結(jié)果并不是按照順序排列的。如果你希望以字母表順序?qū)⒔Y(jié)果列出又該怎么做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結(jié)果:SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEESORDER BY BRANCH_OFFICE ASC;這一查詢的結(jié)果如表4所示。請注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,這就是我們想要對其進(jìn)行排序的列。為什么即使是結(jié)果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進(jìn)行排序,即使它們并不顯示出來。列名BRANCH_ OFFICE之后的關(guān)
37、鍵字ASC表示按照升序排列。如果你希望以降序排列,那么可以用關(guān)鍵字DESC。同樣我們應(yīng)該指出ORDER BY子句只將臨時表中的結(jié)果進(jìn)行排序;并不影響原來的表。假設(shè)我們希望得到按部門排序并從工資最高的雇員到工資最低的雇員排列的列表。除了工資括號中我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:SELECT BRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARY,HIRE_DATEFROM EMPLOYEESORDER BY SALARY DESC,HIRE_DATE DESC;這里我們進(jìn)行了多列的選擇和排序。排序的優(yōu)先級由語句中的列名
38、順序所決定。SQL將先對列出的第一個列進(jìn)行排序。如果在第一個列中出現(xiàn)了重復(fù)的行時,這些行將被按照第二列進(jìn)行排序,如果在第二列中又出現(xiàn)了重復(fù)的行時,這些行又將被按照第三列進(jìn)行排序如此類推。這次查詢的結(jié)果如表5所示。將一個很長的表中的所有列名寫出來是一件相當(dāng)麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:SELECT * FROM EMPLOYEES;這次查詢返回整個EMPLOYEES表,如表1所示。 下面我們對開始時給出的SELECT語句的語法進(jìn)行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):SELECT DISTINCT(column , columns)| *FROM tab
39、le , tableORDER BY column ASC | DESC , column ASC | DESC ;定義選擇標(biāo)準(zhǔn)在我們目前所介紹的SELECT語句中,我們對結(jié)果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進(jìn)行限制使得它只返回希望得到的行:SELECT columns FROM tables WHERE predicates;WHERE子句對條件進(jìn)行了設(shè)置,只有滿足條件的行才被包括到結(jié)果表中。這些條件由斷言(predicate)進(jìn)行指定(斷言指出了關(guān)于某件事情的一種可能的事實)。如果該斷言對于某個給定的行成立,該行將被包括到結(jié)果表中,否則該行被忽略
40、。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:SELECT * FROM EMPLOYEESWHERE LAST_NAME = 'Jones'LAST_NAME = 'Jones'部分就是斷言。在執(zhí)行該語句時,SQL將每一行的LAST_NAME列與“Jones”進(jìn)行比較。如果某一職員的姓為“Jones”,即斷言成立,該職員的信息將被包括到結(jié)果表中(見表6)。使用最多的六種比較我們上例中的斷言包括一種基于“等值”的比較(LAST_NAME = 'Jones'),但是SQL斷言還
41、可以包含其他幾種類型的比較。其中最常用的為:等于 =不等于 <>小于 <大于 >小于或等于 <=大于或等于 >=下面給出了不是基于等值比較的一個例子:SELECT * FROM EMPLOYEESWHERE SALARY > 50000;這一查詢將返回年薪高于$50,000.00的職員(參見表7)。邏輯連接符有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看Davy Jones的信息的話,表6中的結(jié)果將是不正確的。為了進(jìn)一步定義一個WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員Davy Jones
42、的記錄,用戶可以輸入如下語句:SELECT * FROM EMPLOYEESWHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy'在本例中,我們通過邏輯連接符AND將兩個斷言連接起來。只有兩個斷言都滿足時整個表達(dá)式才會滿足。如果用戶需要定義一個SELECT語句來使得當(dāng)其中任何一項成立就滿足條件時,可以使用OR連接符:SELECT * FROM EMPLOYEESWHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith'有時定義一個斷言的最好方法是通過
43、相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時,你可以進(jìn)行如下的查詢:SELECT * FROM EMPLOYEESWHERE NOT(BRANCH_OFFICE = 'Boston');關(guān)鍵字NOT后面跟著用圓括號括起來的比較表達(dá)式。其結(jié)果是對結(jié)果取否定。如果某一職員所在部門的辦事處在Boston,括號內(nèi)的表達(dá)式返回true,但是NOT操作符將該值取反,所以該行將不被選中。斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進(jìn)行求值,可以用括號將它們括起來:SELECT * FROM EMPLOYEESWHERE (LAST_NAME
44、 = 'Jones'AND FIRST_NAME = 'Indiana')OR (LAST_NAME = 'Smith'AND FIRST_NAME = 'Bessie');SQL沿用數(shù)學(xué)上標(biāo)準(zhǔn)的表達(dá)式求值的約定圓括號內(nèi)的表達(dá)式將最先進(jìn)行求值,其他表達(dá)式將從左到右進(jìn)行求值。以上對邏輯連接符進(jìn)行了說明,在對下面的內(nèi)容進(jìn)行說明之前,我們再一次對SELECT語句的語法進(jìn)行更新:SELECT DISTINCT(column , column )| *FROM table , table ORDER BY column ASC | DESC
45、 , column ASC | DESC WHERE predicate logical-connector predicate ;NULL和三值邏輯在SQL中NULL是一個復(fù)雜的話題,關(guān)于NULL的詳細(xì)描述更適合于在SQL的高級教程而不是現(xiàn)在的入門教程中進(jìn)行介紹。但由于NULL需要進(jìn)行特殊處理,并且你也很可能會遇到它,所以我們還是簡略地進(jìn)行一下說明。首先,在斷言中進(jìn)行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:SELECT * FROM EMPLOYEESWHERE SALARY IS NULL;相反,如果用戶需要所有已
46、知年薪數(shù)據(jù)的職員的信息,你可以使用以下語句:SELECT * FROM EMPLOYEESWHERE SALARY IS NOT NULL;請注意我們在列名之后使用了關(guān)鍵字IS NULL或IS NOT NULL,而不是標(biāo)準(zhǔn)的比較形式:COLUMN = NULL、COLUMN <> NULL或是邏輯操作符NOT(NULL)。這種形式相當(dāng)簡單。但當(dāng)你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。例如,回過頭來看我們圖1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等級或年薪值都是未知的。這兩個列都包含NULL。可以想象運行如下的查詢:SELECT *
47、 FROM EMPLOYEESWHERE GRADE <= SALARY;此時,Indiana Jones應(yīng)該出現(xiàn)在結(jié)果表中。因為NULL都是相等的,所以可以想象它們是能夠通過GRADE小于等于SALARY的檢查的。這其實是一個毫無疑義的查詢,但是并沒有關(guān)系。SQL允許進(jìn)行這樣的比較,只要兩個列都是數(shù)字類型的。然而,Indiana Jones并沒有出現(xiàn)在查詢的結(jié)果中,為什么?正如我們早先提到過的,NULL表示未知的值(而不是象某些人所想象的那樣表示一個為NULL的值)。對于SQL來說意味著這個值是未知的,而只要這個值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許
48、除了在true 和false之外還有第三種類型的真值,稱之為“非確定”(unknown)值。如果比較的兩邊都是NULL,整個斷言就被認(rèn)為是非確定的。將一個非確定斷言取反或使用AND或OR與其他斷言進(jìn)行合并之后,其結(jié)果仍是非確定的。由于結(jié)果表中只包括斷言值為“真”的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。UPDATE語句UPDATE語句允許用戶在已知的表中對現(xiàn)有的行進(jìn)行修改。例如,我們剛剛發(fā)現(xiàn)Indiana Jones的等級為16,工資為$40,000.00,我們可以通過下面的SQL語句對數(shù)據(jù)庫進(jìn)行更新(并清除那些煩人的NULL)。UPD
49、ATE EMPLOYEESSET GRADE = 16, SALARY = 40000WHERE FIRST_NAME = 'Indiana' AND LAST_NAME = 'Jones'上面的例子說明了一個單行更新,但是UPDATE語句可以對多行進(jìn)行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到New York,你可以使用如下語句:UPDATE EMPLOYEESSET BRANCH_OFFICE = 'New York'WHERE BRANCH_OFFICE = 'Boston'如
50、果忽略WHERE子句,表中所有行中的部門值都將被更新為'New York'。UPDATE語句的語法流圖如下面所示:UPDATE tableSET column = value , column = value WHERE predicate logical-connector predicate;DELETE語句DELETE語句用來刪除已知表中的行。如同UPDATE語句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由于SQL中沒有UNDO語句或是“你確認(rèn)刪除嗎?”之類的警告,在執(zhí)行這條語句時千萬要小心。如果決定取消Los Angeles辦事處并解雇辦事處的所有職員,這一卑
51、鄙的工作可以由以下這條語句來實現(xiàn):DELETE FROM EMPLOYEESWHERE BRANCH_OFFICE = 'Los Angeles'如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。DELETE語句的語法流圖如下面所示:DELETE FROM tableWHERE predicate logical-connector predicate ;現(xiàn)在我們完成了數(shù)據(jù)操作語言(DML)的主要語句的介紹。我們并沒有對SQL能完成的所有功能進(jìn)行說明。SQL還提供了許多的功能,如求平均值、求和以及其他對表中數(shù)據(jù)的計算,此外SQL還能完成從多個表中進(jìn)行查
52、詢(多表查詢,或稱之為連接)的工作。這種語言還允許你使用GRANT和REVOKE命令控制使用者的數(shù)據(jù)訪問權(quán)限附.end記錄集對Recordset對象方法rs.movenext 將記錄指針從當(dāng)前的位置向下移一行rs.moveprevious 將記錄指針從當(dāng)前的位置向上移一行rs.movefirst 將記錄指針移到數(shù)據(jù)表第一行rs.movelast 將記錄指針移到數(shù)據(jù)表最后一行rs.absoluteposition=N 將記錄指針移到數(shù)據(jù)表第N行rs.absolutepage=N 將記錄指針移到第N頁的第一行rs.pagesize=N 設(shè)置每頁為N條記錄rs.pagecount 根據(jù) pagesi
53、ze 的設(shè)置返回總頁數(shù)rs.recordcount 返回記錄總數(shù)rs.bof 返回記錄指針是否超出數(shù)據(jù)表首端,true表示是,false為否rs.eof 返回記錄指針是否超出數(shù)據(jù)表末端,true表示是,false為否rs.delete 刪除當(dāng)前記錄,但記錄指針不會向下移動rs.addnew 添加記錄到數(shù)據(jù)表末端rs.update 更新數(shù)據(jù)表記錄Open方法recordset.Open Source,ActiveConnection,CursorType,LockType,OptionsSourceRecordset對象可以通過Source屬性來連接Command對象。Source參數(shù)可以是一個
54、Command對象名稱、一段SQL命令、一個指定的數(shù)據(jù)表名稱或是一個StoredProcedure。假如省略這個參數(shù),系統(tǒng)則采用Recordset對象的Source屬性。ActiveConnectionRecordset對象可以通過ActiveConnection屬性來連接Connection對象。這里的ActiveConnection可以是一個Connection對象或是一串包含數(shù)據(jù)庫連接信息(ConnectionString)的字符串參數(shù)。另:CursorTypeRecordset對象Open方法的CursorType參數(shù)表示將以什么樣的游標(biāo)類型啟動數(shù)據(jù),包括adOpenForwardOnly、adOpenKeyset、a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年松江區(qū)天馬山學(xué)校招聘備考題庫及參考答案詳解一套
- 企業(yè)員工績效反饋制度
- 華福證券“獵鷹計劃”2026年校園招聘備考題庫及參考答案詳解一套
- 中誠建川(涼山)電力有限公司公開招聘20名工作人員備考題庫及答案詳解參考
- 2026年耒陽市選聘一村一輔警18人備考題庫及答案詳解參考
- 企業(yè)內(nèi)部審計與風(fēng)險控制制度
- 交通設(shè)施更新改造制度
- 中國電子云2026校園招聘冬季補招備考題庫及一套答案詳解
- 四川省廣安花橋中學(xué)校2026年招聘代課教師備考題庫及完整答案詳解1套
- 2026年鹽城經(jīng)濟(jì)技術(shù)開發(fā)區(qū)中韓產(chǎn)業(yè)園建設(shè)辦公室公開招聘勞務(wù)派遣工作人員備考題庫參考答案詳解
- 智能家居銷售培訓(xùn)課件
- DB32∕T 5167-2025 超低能耗建筑技術(shù)規(guī)程
- 2025-2026學(xué)年小學(xué)蘇少版(2024)新教材一年級上冊美術(shù)期末測試卷及答案
- 2025-2026學(xué)年北師大版六年級數(shù)學(xué)上冊期末測試卷及答案
- 地球小博士知識競賽練習(xí)試題及答案
- 不同類型休克的床旁超聲鑒別診斷策略
- 殯儀館鮮花采購?fù)稑?biāo)方案
- 中小學(xué)生意外傷害防范
- 動靜脈瘺課件
- 企業(yè)ESG審計體系構(gòu)建-洞察及研究
- 政治理論考試試題庫100題
評論
0/150
提交評論