SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)課件_第1頁(yè)
SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)課件_第2頁(yè)
SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)課件_第3頁(yè)
SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)課件_第4頁(yè)
SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Query組件的屬性Query組件的方法SQL語(yǔ)言基礎(chǔ)Query組件利用SQL語(yǔ)言的增、刪、改、查操作綜合實(shí)例:學(xué)生信息管理程序

SQL數(shù)據(jù)庫(kù)程序設(shè)計(jì)12.1Query組件的屬性和方法

SQL語(yǔ)言,又稱為結(jié)構(gòu)化查詢語(yǔ)言,它在數(shù)據(jù)庫(kù)程序設(shè)計(jì)中是十分重要的。任何一門支持?jǐn)?shù)據(jù)庫(kù)程序設(shè)計(jì)的語(yǔ)言必定提供對(duì)SQL語(yǔ)言的支持,Delphi7.0也不例外。在Delphi7.0中提供了很多支持SQL語(yǔ)言操作的組件,Query組件就是其中之一。Query組件是BDE數(shù)據(jù)集組件之一,在Delphi7.0組件選擇板上BDE選項(xiàng)卡上,與Table組件具有很多共同的特性。第11章已經(jīng)對(duì)Table組件的使用較詳細(xì)地進(jìn)行了介紹。Query組件在SQL編程中占據(jù)十分重要的地位,實(shí)現(xiàn)了Delphi7.0對(duì)SQL語(yǔ)言的支持。在Delphi7.0開(kāi)發(fā)的數(shù)據(jù)庫(kù)應(yīng)用中,SQL語(yǔ)句是通過(guò)Query部件傳遞到要訪問(wèn)的數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)庫(kù)引擎中,由數(shù)據(jù)庫(kù)引擎具體執(zhí)行SQL語(yǔ)句,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作。而不是傳遞給Delphi7.0中的BDE,由BDE實(shí)施具體的SQL動(dòng)作。本章內(nèi)容重點(diǎn)講解如何用Query組件來(lái)進(jìn)行SQL語(yǔ)言的操作。12.1.1Query組件的常用屬性(1)1.DataBaseName屬性跟Table組件一樣,Query組件也是通過(guò)DataBaseName屬性來(lái)鏈接數(shù)據(jù)庫(kù)的??梢允悄硞€(gè)數(shù)據(jù)庫(kù)別名也可以是某個(gè)數(shù)據(jù)表的路徑。詳細(xì)方法可以參照Table組件的用法。2.SQL屬性

Query組件是通過(guò)SQL屬性對(duì)數(shù)據(jù)集進(jìn)行操作,而不是通過(guò)指定一個(gè)TableName屬性的值直接指向一個(gè)表。SQL是一個(gè)字符串對(duì)象,可以給該屬性設(shè)置SQL語(yǔ)句,從而讓Query組件使用SQL語(yǔ)句操縱數(shù)據(jù)庫(kù)。例如,在SQL屬性中輸入了合法的Select查詢語(yǔ)句,然后可以將Query組件的Active屬性設(shè)置為True或者調(diào)用Open方法就可以打開(kāi)數(shù)據(jù)集。SQL屬性還提供了設(shè)置SQL語(yǔ)句的各種方法,如Add、Clear等方法分別用來(lái)添加和清除SQL語(yǔ)句,在程序中運(yùn)用十分廣泛。3.Filter屬性該屬性是用來(lái)過(guò)濾記錄的,就是按照某個(gè)字段的具體值進(jìn)行過(guò)濾記錄。它有點(diǎn)類似于查詢,也稱為篩選記錄。具體格式如下:Query1.Filter:='字段名=字段值'或者可以直接在對(duì)象瀏覽器中找到Filter屬性,并輸入“性別='男'”,注意不12.1.1Query組件的常用屬性(2)帶雙引號(hào),但過(guò)濾字段值“男”字必須用單引號(hào)括起來(lái)。但在代碼中,要用兩個(gè)連續(xù)的單引號(hào)表示一個(gè)單引號(hào)。另外,要讓Filter屬性設(shè)置的過(guò)濾條件有效,則必須設(shè)置另外一個(gè)屬性Filtered。只有當(dāng)Filtered屬性值為True時(shí),F(xiàn)ilter屬性設(shè)置才有效。其實(shí),在Table組件中也包含了Filter和Filtered屬性。所以,Table組件和Query組件的很多屬性都是相同的,而且用法也一樣,如Active、Fields等,可以參考Table組件中的相關(guān)用法。12.1.2Query組件的常用方法1.Open方法用于打開(kāi)或激活Query數(shù)據(jù)集。一般只執(zhí)行Select查詢語(yǔ)句。2.ExecSQL方法執(zhí)行Query組件中的SQL語(yǔ)句,不僅可以執(zhí)行Select查詢語(yǔ)句,而且可以執(zhí)行其他的SQL命令,如Insert、Update、Delete等SQL命令。關(guān)于Open方法和ExecSQL方法的區(qū)別本書(shū)將在后面的章節(jié)里進(jìn)一步地加以討論。3.Close方法關(guān)閉數(shù)據(jù)集。12.1.1Query組件的常用屬性(3)4.SQL屬性的兩個(gè)基本方法(1)Add方法給Query組件的SQL屬性添加SQL命令語(yǔ)句,以供Query組件執(zhí)行。Add是SQL屬性中的一個(gè)方法。如下列語(yǔ)句:Query1.SQL.Add(‘select*fromstudent’);Query1.SQL.Add(‘orderby學(xué)號(hào)’);//在前一句SQL語(yǔ)句的基礎(chǔ)上追加SQL語(yǔ)句這里也可以把以上兩句語(yǔ)句合成一句,如下所示。這兩種方法是等效的。Query1.SQL.Add(‘select*fromstudentorderby學(xué)號(hào)’);(2)Clear方法Clear方法是清除Query組件的SQL屬性值。它也是SQL屬性中的一個(gè)方法。一般在用Add方法添加SQL語(yǔ)句前,先要用Clear方法將SQL屬性清空,然后再添加全新的SQL語(yǔ)句。12.1.1Query組件的常用屬性(4)【例12-1】使用Query組件顯示student.db中全部記錄內(nèi)容。設(shè)計(jì)窗體如圖12-1所示,程序運(yùn)行效果如圖12-2所示。圖12-1窗體設(shè)計(jì)界面

圖12-2程序運(yùn)行界面

這個(gè)例子要求用Query組件結(jié)合SQL語(yǔ)句顯示student.db中全部記錄內(nèi)容,并顯示在DBGrid組件中。具體實(shí)現(xiàn)步驟如下。

在應(yīng)用窗體中放置一個(gè)Query部件(Query1)、一個(gè)TDataSource部件(DataSource1)和一個(gè)TDataGrid部件(DBGrid1),并將它們鏈接起來(lái);鏈接方法:將DataSource1組件的DataSet屬性設(shè)置為Query1;將DBGrid1組件的DataSource屬性設(shè)置為DataSource1。

設(shè)置窗體Query部件Query1的DatabaseName屬性值為數(shù)據(jù)庫(kù)別名stu_data

雙擊對(duì)象查看器ObjectInspector窗口中Query1的SQL屬性,Delphi7.0將顯示StringListEditor對(duì)話框。12.1.1Query組件的常用屬性(5)【例12-1】使用Query組件顯示student.db中全部記錄內(nèi)容。設(shè)計(jì)窗體如圖12-1所示,程序運(yùn)行效果如圖12-2所示。圖12-1窗體設(shè)計(jì)界面

圖12-2程序運(yùn)行界面

這個(gè)例子要求用Query組件結(jié)合SQL語(yǔ)句顯示student.db中全部記錄內(nèi)容,并顯示在DBGrid組件中。具體實(shí)現(xiàn)步驟如下。

在應(yīng)用窗體中放置一個(gè)Query部件(Query1)、一個(gè)TDataSource部件(DataSource1)和一個(gè)TDataGrid部件(DBGrid1),并將它們鏈接起來(lái);鏈接方法:將DataSource1組件的DataSet屬性設(shè)置為Query1;將DBGrid1組件的DataSource屬性設(shè)置為DataSource1。

設(shè)置窗體Query部件Query1的DatabaseName屬性值為數(shù)據(jù)庫(kù)別名stu_data

雙擊對(duì)象查看器ObjectInspector窗口中Query1的SQL屬性,Delphi7.0將顯示StringListEditor對(duì)話框。12.1.1Query組件的常用屬性(6)

在圖12-3中的StringListEditor對(duì)話框中輸入SQL語(yǔ)句:Select*fromstudentorderby學(xué)號(hào)

單擊OK按鈕,關(guān)閉StringListEditor對(duì)話框。

設(shè)置Query的Open屬性為True。圖12-3StringListEditor對(duì)話框

這樣,就可以將student.db數(shù)據(jù)表中全部記錄內(nèi)容顯示在DataGrid1組件中。這是一種用SQL語(yǔ)句查詢數(shù)據(jù)集中記錄內(nèi)容的方法,另外在Delphi7.0中用得最多的還是在程序代碼中用相應(yīng)的方法來(lái)實(shí)現(xiàn)SQL語(yǔ)句的查詢。

利用代碼執(zhí)行SQL語(yǔ)句,在一般的數(shù)據(jù)庫(kù)程序設(shè)計(jì)中用得很廣泛,而且很靈活。但值得注意的是在添加SQL屬性前首先要用Close方法關(guān)閉數(shù)據(jù)集;在應(yīng)用程序中為SQL屬性設(shè)置新的SQL命令語(yǔ)句時(shí),必須要調(diào)用Clear方法以清除SQL屬性中現(xiàn)存的SQL命令語(yǔ)句,如果不調(diào)用Clear方法,可調(diào)用Add方法向SQL屬性中設(shè)置SQL命令語(yǔ)句,那么新設(shè)置的SQL命令語(yǔ)句會(huì)追加在現(xiàn)存SQL命令語(yǔ)句后面,但在程序運(yùn)行時(shí)常常會(huì)出現(xiàn)出乎意料的查詢結(jié)果,甚至程序無(wú)法運(yùn)行下去。12.2動(dòng)態(tài)SQL語(yǔ)句的編程(1)Query組件提供了強(qiáng)大的SQL語(yǔ)言支持功能,這大大提高了數(shù)據(jù)庫(kù)應(yīng)用程序的執(zhí)行效率。Query組件不僅可以執(zhí)行靜態(tài)的SQL語(yǔ)句,而且可以執(zhí)行動(dòng)態(tài)的SQL語(yǔ)句。靜態(tài)SQL語(yǔ)句在程序設(shè)計(jì)時(shí)便已固定下來(lái),它不包含任何參數(shù)和變量。而動(dòng)態(tài)SQL語(yǔ)句,被稱為參數(shù)化的語(yǔ)句,其中包含著表示字段名或表名的參數(shù)。在實(shí)際程序設(shè)計(jì)中使用得更多的是動(dòng)態(tài)SQL語(yǔ)句。在這一節(jié)將重點(diǎn)介紹如何給動(dòng)態(tài)SQL語(yǔ)句的參數(shù)賦值,以及在應(yīng)用程序中靈活地使用SQL語(yǔ)句。通常采用以下三種途徑來(lái)為它賦值,這三種途徑都是在程序代碼中實(shí)現(xiàn)的。1.采用字符串連接符號(hào)“+”連接組成完整的SQL語(yǔ)句這里用到字符串連接符號(hào)“+”進(jìn)行字符串的連接操作。具體表示方法如下:XM='趙凱'Query1.SQL.Add('select*fromstudentwhere姓名='''+XM+'''');注意,在Delphi7.0語(yǔ)言的字符串中,連續(xù)兩個(gè)單引號(hào)表示一個(gè)單引號(hào)。上述SQL語(yǔ)句中由兩個(gè)字符串連接符號(hào)“+”,三個(gè)字符串連接而成,組成了一句完整的查詢語(yǔ)句。讀者要讀懂字符串連接的含義。12.2動(dòng)態(tài)SQL語(yǔ)句的編程(2)Query組件提供了強(qiáng)大的SQL語(yǔ)言支持功能,這大大提高了數(shù)據(jù)庫(kù)應(yīng)用程序的執(zhí)行效率。Query組件不僅可以執(zhí)行靜態(tài)的SQL語(yǔ)句,而且可以執(zhí)行動(dòng)態(tài)的SQL語(yǔ)句。靜態(tài)SQL語(yǔ)句在程序設(shè)計(jì)時(shí)便已固定下來(lái),它不包含任何參數(shù)和變量。而動(dòng)態(tài)SQL語(yǔ)句,被稱為參數(shù)化的語(yǔ)句,其中包含著表示字段名或表名的參數(shù)。在實(shí)際程序設(shè)計(jì)中使用得更多的是動(dòng)態(tài)SQL語(yǔ)句。在這一節(jié)將重點(diǎn)介紹如何給動(dòng)態(tài)SQL語(yǔ)句的參數(shù)賦值,以及在應(yīng)用程序中靈活地使用SQL語(yǔ)句。通常采用以下三種途徑來(lái)為它賦值,這三種途徑都是在程序代碼中實(shí)現(xiàn)的。1.采用字符串連接符號(hào)“+”連接組成完整的SQL語(yǔ)句這里用到字符串連接符號(hào)“+”進(jìn)行字符串的連接操作。具體表示方法如下:XM='趙凱'Query1.SQL.Add('select*fromstudentwhere姓名='''+XM+'''');注意,在Delphi7.0語(yǔ)言的字符串中,連續(xù)兩個(gè)單引號(hào)表示一個(gè)單引號(hào)。上述SQL語(yǔ)句中由兩個(gè)字符串連接符號(hào)“+”,三個(gè)字符串連接而成,組成了一句完整的查詢語(yǔ)句。讀者要讀懂字符串連接的含義。12.2動(dòng)態(tài)SQL語(yǔ)句的編程(3)2.使用Params屬性為參數(shù)賦值

Query組件具有一個(gè)Params屬性,它們?cè)谠O(shè)計(jì)時(shí)不可用,在程序運(yùn)行過(guò)程中可用,并且是動(dòng)態(tài)建立的,當(dāng)為Query組件編寫動(dòng)態(tài)SQL語(yǔ)句時(shí),Delphi7.0會(huì)自動(dòng)地建立一個(gè)數(shù)組Params,數(shù)組Params是以0下標(biāo)開(kāi)始的,依次對(duì)應(yīng)動(dòng)態(tài)SQL語(yǔ)句中的參數(shù),也就是說(shuō)動(dòng)態(tài)SQL語(yǔ)句中第一個(gè)參數(shù)對(duì)應(yīng)Params[0],第二個(gè)參數(shù)對(duì)應(yīng)Params[1],依此類推。3.使用ParamByName方法為參數(shù)賦值

ParamByName是一個(gè)函數(shù),用動(dòng)態(tài)SQL語(yǔ)句中的參數(shù)作為調(diào)用ParamByName函數(shù)的參數(shù),這樣便可以為它們賦值。使用這種賦值方法,必須要知道動(dòng)態(tài)SQL語(yǔ)句參數(shù)的名字。使用這種方法同樣可以為各參數(shù)賦值,但在ParamByName方法中必須指明參數(shù)名。這樣給參數(shù)賦值,更加直觀一些。注意不要把Params屬性和ParamByName方法的用法混淆,Params屬性中指明的是參數(shù)出現(xiàn)的先后次序,從0開(kāi)始排序,Params[0]表示第一個(gè)參數(shù),Params[1]表示第二個(gè)參數(shù),依次類推。而ParamByName方法要指定參數(shù)的名稱,所以更加直觀、易理解。12.3常用SQL語(yǔ)句簡(jiǎn)介SQL是結(jié)構(gòu)化查詢語(yǔ)言。SQL的大部分實(shí)現(xiàn)都與該語(yǔ)言的某個(gè)特定定義相關(guān)。例如,許多數(shù)據(jù)庫(kù)的SQL服務(wù)器支持ANSI-92SQL定義。所使用的SQL語(yǔ)言的語(yǔ)法依賴于所用的特定數(shù)據(jù)庫(kù)。結(jié)構(gòu)化查詢語(yǔ)言SQL是定義和維護(hù)關(guān)系數(shù)據(jù)庫(kù)的專用語(yǔ)言,已經(jīng)被眾多的數(shù)據(jù)庫(kù)管理系統(tǒng)所采用,如MSSQLSERVER、ORACLE、SYBASE、Informix等數(shù)據(jù)庫(kù)管理系統(tǒng)。事實(shí)上,關(guān)于SQL語(yǔ)言有一個(gè)專門的ANSI標(biāo)準(zhǔn),而很多數(shù)據(jù)庫(kù)管理系統(tǒng)又有自己對(duì)標(biāo)準(zhǔn)SQL語(yǔ)言的擴(kuò)充。Delphi7.0與使用SQL語(yǔ)言的數(shù)據(jù)庫(kù)管理系統(tǒng)兼容,在使用Delphi7.0開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),可以使用SQL語(yǔ)言編程,開(kāi)發(fā)出功能強(qiáng)大的客戶/服務(wù)器程序。12.3.1SQL的優(yōu)點(diǎn)SQL的用戶包括應(yīng)用程序員、DBA管理員和終端用戶。SQL語(yǔ)言的優(yōu)點(diǎn)很多,簡(jiǎn)述如下。(1)非過(guò)程化語(yǔ)言

SQL是一個(gè)非過(guò)程化的語(yǔ)言,因?yàn)樗淮翁幚硪粋€(gè)記錄,對(duì)數(shù)據(jù)提供自動(dòng)導(dǎo)航。SQL允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,可操作記錄集,而不對(duì)單個(gè)記錄進(jìn)行操作。所有SQL語(yǔ)句接受集合作為輸入,返回集合作為輸出。SQL的集合特性允許一條SQL語(yǔ)句的結(jié)果作為另一條SQL語(yǔ)句的輸入。(2)統(tǒng)一的語(yǔ)言

SQL可用于所有用戶的DB活動(dòng)模型,包括系統(tǒng)管理員、數(shù)據(jù)庫(kù)管理員、應(yīng)用程序員、決策支持系統(tǒng)人員及許多其他類型的終端用戶?;镜腟QL命令只需很少時(shí)間就能學(xué)會(huì),最高級(jí)的命令在幾天內(nèi)便可掌握。(3)SQL是所有關(guān)系數(shù)據(jù)庫(kù)的公共語(yǔ)言由于所有主要的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQL語(yǔ)言,用戶可將使用SQL的技能從一個(gè)DBMS轉(zhuǎn)到另一個(gè)。所有用SQL編寫的程序都是可以移植的,從而大大加強(qiáng)了數(shù)據(jù)庫(kù)程序開(kāi)發(fā)的靈活性。程序開(kāi)發(fā)人員可以用多種語(yǔ)言編寫數(shù)據(jù)庫(kù)應(yīng)用程序,但對(duì)數(shù)據(jù)庫(kù)維護(hù)的SQL語(yǔ)句的使用是一致的。12.3.2SQL語(yǔ)言的基本操作(1)SQL語(yǔ)言的作用很廣,它最大、最突出的功能就是查詢,也是它用得最廣的功能。除了查詢以外還可以實(shí)現(xiàn)記錄的插入、修改和刪除以及數(shù)據(jù)表的建立、修改、刪除等操作。1.Select語(yǔ)句

Select語(yǔ)句用于以行為單位從一個(gè)或多個(gè)表獲取數(shù)據(jù)。現(xiàn)在,把注意力集中到單表的Select語(yǔ)句上。Select語(yǔ)句的關(guān)鍵字如表12-2所示?;镜腟elect語(yǔ)句的規(guī)范形式如下:Select字段列表From表名Where查詢條件Groupby分組字段Having分組條件Ooderby字段名[ASC|DESC]

一般在程序中應(yīng)用SQL語(yǔ)句前,經(jīng)常要先調(diào)試SQL語(yǔ)句是否書(shū)寫正確。在Delphi7.0中為了調(diào)試SQL語(yǔ)句,提供了數(shù)據(jù)庫(kù)瀏覽器工具——SQLExplorer。數(shù)據(jù)庫(kù)瀏覽器——SQLExplorer可以通過(guò)Delphi7.0主菜單中的【Database】菜單下的【Explorer】菜單項(xiàng)進(jìn)入,如圖12-5所示。圖12-5SQLExplorer操作窗體12.3.2SQL語(yǔ)言的基本操作(2)

在SQLExplorer操作窗口的左窗口中選擇數(shù)據(jù)庫(kù)別名,如stu_data,可以查看該別名下的數(shù)據(jù)表中詳細(xì)內(nèi)容,包括數(shù)據(jù)表的定義信息、記錄內(nèi)容和字段等詳細(xì)信息。要調(diào)試SQL語(yǔ)句,可以在右邊窗口中選擇EnterSQL選項(xiàng),并在文本框中輸入SQL語(yǔ)句。例如在上圖中輸入select*fromSTUDENT,然后單擊右邊的執(zhí)行SQL按鈕,如果SQL語(yǔ)句書(shū)寫正確就會(huì)在下面網(wǎng)格中顯示具體的查詢結(jié)果?!纠?2-4】組合查詢記錄所謂組合查詢就是在查詢時(shí)查詢條件有多個(gè)。在where子句后面各個(gè)條件之間用邏輯運(yùn)算符and或者or進(jìn)行連接,例如要查詢姓“李”的“男”學(xué)生的記錄,則SQL查詢語(yǔ)句應(yīng)該這樣寫:

Select*fromstudentwhere姓名like'李%'and性別='男'

此例在【例12-2】的基礎(chǔ)上,增加用姓名和性別兩個(gè)字段的組合查詢,并要求對(duì)姓名可以實(shí)現(xiàn)模糊匹配查詢。在原來(lái)的基礎(chǔ)上添加1個(gè)標(biāo)簽框Label2和1個(gè)組合框ComboBox1,在組合框ComboBox1中添加“所有”、“男”、“女”3個(gè)選項(xiàng),并修改Button1的Click事件代碼如下:12.3.2SQL語(yǔ)言的基本操作(3)procedureTForm1.Button1Click(Sender:TObject);VarStrSql:String;//存放SQL語(yǔ)句的變量beginStrSql:='select*fromstudentWhere1=1';{這個(gè)語(yǔ)句是給StrSql變量賦初值,“1=1”這個(gè)條件始終為真,并沒(méi)有多大意義,只是為了下面的SQL語(yǔ)句的連接時(shí)方便一些。}IfTrim(Edit1.Text)<>''ThenStrSql:=StrSql+'And姓名Like''%'+Trim(Edit1.Text)+'%''';//注意字符串的連接方法,兩個(gè)連續(xù)的單引號(hào)表示一個(gè)單引號(hào)IfTrim(Combobox1.Text)<>'所有'Then StrSql:=StrSql+'And性別='''+Trim(Combobox1.Text)+'''';Query1.Close;Query1.SQL.Clear;Query1.SQL.Add(StrSql);//將StrSql變量值加到Query1組件的Sql屬性中Query1.Prepare;Query1.Open;ifQuery1.Eofthenbegin12.3.2SQL語(yǔ)言的基本操作(4)

showmessage('沒(méi)有找到相關(guān)記錄!');Edit1.Clear;Combobox1.text:='所有';Query1.Close;Query1.SQL.Clear;Query1.SQL.Add('select*fromstudent');Query1.Open;endend;【例12-5】用SQL語(yǔ)句從Student.db和Score.db兩張數(shù)據(jù)表中查詢記錄內(nèi)容。跟前面幾個(gè)例子一樣,在窗體上放置1個(gè)Query組件、1個(gè)DataSource組件、1個(gè)DBGrid組件和1個(gè)DBNavigator組件。如圖12-6所示。將Datasouce組件的DataSet屬性設(shè)置為Query1,并分別將DBGrid組件和DBNavigator組件的DataSource屬性都設(shè)置為DataSource1。本例要求從Student.db中選擇學(xué)生的學(xué)號(hào)和姓名兩個(gè)字段的數(shù)據(jù),從學(xué)生成績(jī)表Score.db中選擇與該學(xué)生相關(guān)的課程和成績(jī)兩個(gè)字段的內(nèi)容,構(gòu)成一個(gè)新的記錄集,可在窗體的OnActivate事件中使用SQL語(yǔ)句,通過(guò)“wherestudent.學(xué)號(hào)=Score.學(xué)號(hào)”短語(yǔ)將兩個(gè)表連接起來(lái)。SQL語(yǔ)句表示如下:圖12-6多表查詢運(yùn)行界面12.3.2SQL語(yǔ)言的基本操作(6)具體程序代碼如下:procedureTForm1.FormActivate(Sender:TObject);beginQuery1.DatabaseName:='stu_data';//設(shè)置Query組件的別名Query1.Close;Query1.SQL.Clear;Query1.SQL.Add('selectstudent.學(xué)號(hào),student.姓名,Score.課程,Score.成績(jī)');Query1.SQL.Add('fromstudent,Score');Query1.SQL.Add('wherestudent.學(xué)號(hào)=Score.學(xué)號(hào)');Query1.Open;end;

當(dāng)程序運(yùn)行后,數(shù)據(jù)顯示效果如圖12-5所示,通過(guò)DBNavigator組件可以瀏覽記錄指針,但卻不能添加、刪除和更新記錄內(nèi)容,請(qǐng)讀者自己思考為什么不行?12.3.2SQL語(yǔ)言的基本操作(7)【例12-6】用SQL語(yǔ)句從Student.db統(tǒng)計(jì)出男生和女生的人數(shù),如圖12-7輸出。圖12-7輸出男女生人數(shù)統(tǒng)計(jì)表

在窗體上放置1個(gè)Query組件、1個(gè)DataSource組件、1個(gè)DBGrid組件。將DataSource組件的DataSet屬性設(shè)置為Query1,并分別將DBGrid組件的DataSource屬性都設(shè)置為DataSource1。為了統(tǒng)計(jì)男生和女生的人數(shù),需要對(duì)student.db數(shù)據(jù)表中的記錄按性別進(jìn)行分組。“Groupby性別”可以將性別相同的記錄合并成一條記錄。要得到統(tǒng)計(jì)結(jié)果,需要構(gòu)造一個(gè)輸出字段,此時(shí)可使用SQL的統(tǒng)計(jì)函數(shù)Count()作為輸出字段,它按性別分組統(tǒng)計(jì)每個(gè)分組的記錄個(gè)數(shù),要顯示統(tǒng)計(jì)結(jié)果,可以用AS短語(yǔ)命名一個(gè)新的字段別名。本例的SQL語(yǔ)句書(shū)寫如下:

Select性別,Count(*)as人數(shù)fromstudentGroupby性別12.3.2SQL語(yǔ)言的基本操作(8)程序代碼寫在窗體的OnActivate事件中,具體如下所示:procedureTForm1.FormActivate(Sender:TObject);beginQuery1.DatabaseName:='stu_data';Query1.Close;Query1.SQL.Clear;Query1.SQL.Add('select性別,count(*)as人數(shù)fromstudentGroupby性別');Query1.Open;end;

如果統(tǒng)計(jì)每個(gè)學(xué)生的所有課程的總分,顯示學(xué)號(hào),姓名和總分三項(xiàng)內(nèi)容,則SQL語(yǔ)句又該怎么寫呢?這里要查詢姓名和成績(jī),所以必須從兩張表中進(jìn)行鏈接查詢,SQL語(yǔ)句表示如下:selectscore.學(xué)號(hào),student.姓名,sum(score.成績(jī))AS總分fromscore,studentWherescore.學(xué)號(hào)=student.學(xué)號(hào)Groupbyscore.學(xué)號(hào),student.姓名12.3.2SQL語(yǔ)言的基本操作(9)2.Delete語(yǔ)句

Delete語(yǔ)句非常簡(jiǎn)單,它的作用是用來(lái)刪除數(shù)據(jù)表中的記錄。具體格式如下:Deletefrom表名where條件該命令將刪除數(shù)據(jù)表中滿足條件的所有記錄內(nèi)容。更常見(jiàn)的情況是需要?jiǎng)h除數(shù)據(jù)的特定行。對(duì)這種情況,添加Where子句即可。Delete語(yǔ)句僅僅刪除指定條件的記錄,并不是刪除數(shù)據(jù)表;如果沒(méi)有指定刪除條件,則刪除數(shù)據(jù)表中的所有記錄。

2.Delete語(yǔ)句

Delete語(yǔ)句非常簡(jiǎn)單,它的作用是用來(lái)刪除數(shù)據(jù)表中的記錄。具體格式如下:

Deletefrom表名where條件該命令將刪除數(shù)據(jù)表中滿足條件的所有記錄內(nèi)容。更常見(jiàn)的情況是需要?jiǎng)h除數(shù)據(jù)的特定行。對(duì)這種情況,添加Where子句即可。Delete語(yǔ)句僅僅刪除指定條件的記錄,并不是刪除數(shù)據(jù)表;如果沒(méi)有指定刪除條件,則刪除數(shù)據(jù)表中的所有記錄。圖12-8刪除指定學(xué)號(hào)的學(xué)生記錄12.3.2SQL語(yǔ)言的基本操作(10)確定刪除”按鈕的Click事件代碼如下:procedureTForm1.Button1Click(Sender:TObject);beginifMessageDlg('你真的要?jiǎng)h除學(xué)號(hào)為'+trim(Edit1.Text)+'的學(xué)生記錄嗎?',mtwarning,mbOKCancel,1)=mrOKthenbeginQuery1.Close;Query1.SQL.Clear;Query1.SQL.Add('Deletefromstudentwhere學(xué)號(hào)=:XH');Query1.ParamByName('XH').AsString:=TRIM(EDIT1.Text);Query1.ExecSQL;//必須調(diào)用ExecSQL方法執(zhí)行Delete語(yǔ)句,沒(méi)有返回結(jié)果

//重新獲取student表中的所有記錄

Query1.Close;Query1.SQL.Clear;Query1.SQL.Add('select*fromstudent');Query1.Open;//查詢語(yǔ)句要用Open方法執(zhí)行,返回一個(gè)記錄集end;end;12.3.2SQL語(yǔ)言的基本操作(11)3.Insert語(yǔ)句

Insert語(yǔ)句更為復(fù)雜。它用于向表添加行。Insert語(yǔ)句可用于向所有的字段添加值,也可以只對(duì)某些字段添加值,這依賴于具體使用的Insert語(yǔ)句。由于這個(gè)原因,Insert語(yǔ)句需要表名、字段列表,以及與每個(gè)字段相匹配的值。語(yǔ)句的具體形式如下:Insertinto數(shù)據(jù)表名(字段名1,字段名2,…)Values(字段值1,字段值2,…)說(shuō)明:(1)如果沒(méi)有指定字段名,系統(tǒng)則會(huì)按數(shù)據(jù)表中字段的先后順序插入數(shù)據(jù);(2)字段值的數(shù)據(jù)類型必須與對(duì)應(yīng)字段的數(shù)據(jù)類型相吻合;(3)數(shù)據(jù)表名可以是可以更新的視圖名稱,也可以是經(jīng)過(guò)子查詢把別的數(shù)據(jù)表中的內(nèi)容插入?!纠?2-8】使用Insert語(yǔ)句插入記錄。在【例12-1】的基礎(chǔ)上添加如圖12-9所示的幾個(gè)組件:1個(gè)GroupBox組件、7個(gè)標(biāo)簽框(Label1~Label7)、7個(gè)編輯框(Edit1~Edit7)和2個(gè)命令按鈕procedureTForm1.Button1Click(Sender:TObject);//“插入”按鈕Click事件過(guò)程Varxh,xm,xb,csrq,zzmm,jg,rxcj:string;beginTry{開(kāi)始捕捉錯(cuò)誤}Query1.Close;query1.SQL.Clear;//在SQL語(yǔ)句中,字符類型和日期型的字段值必須加單引號(hào),數(shù)值型字段不需要加單引號(hào)xh:=''''+edit1.Text+'''';//學(xué)號(hào),需加引號(hào)xm:=''''+edit2.Text+''''; //姓名xb:=''''+edit3.Text+''''; //性別csrq:=''''+edit4.Text+''''; //出生日期zzmm:=''''+edit5.Text+''''; //政治面貌jg:=''''+edit6.Text+''''; //籍貫rxcj:=edit7.Text; //入學(xué)成績(jī),不需要加單引號(hào)12.3.2SQL語(yǔ)言的基本操作(12)(Button1~Button2)。7個(gè)標(biāo)簽框分別標(biāo)注student.db數(shù)據(jù)表中的7個(gè)字段名,(圖12-9使用insert語(yǔ)句插入記錄)12.3.2SQL語(yǔ)言的基本操作(13)query1.SQL.Add('Insertintostudentvalues('+xh+','+xm+','+xb+','+csrq+','+zzmm+','+jg+','+rxcj+')');query1.SQL.Add('InsertintostudentValues(''030117'',''李香香2'',''女'',''4/5/45'',''團(tuán)員'',''浙江'',442)');query1.ExecSQL;ExceptonEDBEngineErrordo//如果數(shù)據(jù)庫(kù)操作發(fā)生錯(cuò)誤,則顯示提示信息。

beginapplication.MessageBox('數(shù)據(jù)庫(kù)登錄錯(cuò)誤;請(qǐng)檢查【學(xué)號(hào)是否重復(fù)!】'+#13+#10+'或者【字段值是否為空!】或【字段類型是否匹配!】','錯(cuò)誤!',MB_OKCANCEL);end;end;//重新顯示全部記錄內(nèi)容withquery1dobeginclose;

12.3.2SQL語(yǔ)言的基本操作(14)4.Update語(yǔ)句

Update語(yǔ)句用于修改現(xiàn)存的記錄。Update語(yǔ)句如果不使用where子句,將更新所有的記錄。大多數(shù)情況下都需要限制更新記錄的條件,但所有的更新都從基本的語(yǔ)句開(kāi)始。SQL語(yǔ)言中Update的語(yǔ)法如下:Update數(shù)據(jù)表名set字段名1=字段值1[,字段名2=字段值2,字段名N=字段值N]Where更新條件該語(yǔ)句以關(guān)鍵字Update開(kāi)始,后接數(shù)據(jù)表名。set子句后接逗號(hào)分隔的列表,包括所要更新的字段及其新值。【例12-9】使用Update語(yǔ)句修改記錄。界面跟【例12-8】基本保持不變,只添加一個(gè)Memo1組件,用來(lái)顯示SQL語(yǔ)句。具體界面如圖12-10所示。圖12-10使用Update語(yǔ)句修改記錄

程序要求先單擊DBGrid1組件,選擇一條要修改的記錄,并將該記錄的各字段值分別顯示到對(duì)應(yīng)的編輯框中,供用戶修改。修改完畢后,單擊“確定修改”按鈕調(diào)用SQL語(yǔ)句中的Update命令提交修改,并將Update語(yǔ)句顯示在Memo1組件中。具體代碼如下:12.3.2SQL語(yǔ)言的基本操作(15)procedureTForm1.Button1Click(Sender:TObject);Varxh,xm,xb,csrq,zzmm,jg,rxcj:string;begin//在SQL語(yǔ)句中,字符類型的字段值必須加單引號(hào),數(shù)值型字段不需要加單引號(hào)xh:=''''+edit1.Text+'''';//學(xué)號(hào)xm:=''''+edit2.Text+'''';//姓名xb:=''''+edit3.Text+'''';//性別csrq:=''''+edit4.Text+'''';//出生日期zzmm:=''''+edit5.Text+'''';//政治面貌jg:=''''+edit6.Text+'''';//籍貫rxcj:=edit7.Text;//入學(xué)成績(jī)Tryquery1.Close;query1.SQL.Clear;query1.SQL.Add('Updatestudentset姓名='+xm+',性別='+xb+',出生日期='+csrq+',政治面貌='+zzmm+',籍貫='+jg+',入學(xué)成績(jī)='+rxcj);query1.SQL.Add('WHERE學(xué)號(hào)='+xh);

12.3.2SQL語(yǔ)言的基本操作(17)memo1.Text:=query1.SQL.Text;//在Memo1中顯示SQL語(yǔ)句

query1.ExecSQL;ExceptonEDBEngineErrordobeginapplication.MessageBox('數(shù)據(jù)庫(kù)登錄錯(cuò)誤;請(qǐng)檢查:'+#13+#10+'【字段值是否為空!】或【字段類型是否匹配!】','錯(cuò)誤!',MB_OKCANCEL);end;end;//重新顯示全部記錄內(nèi)容withquery1dobeginclose;sql.Clear;sql.Add('select*fromstudentorderby學(xué)號(hào)');

open;end;end;{單擊DBGrid1組件中的一條記錄時(shí),在文本框中顯示選中記錄內(nèi)容}12.3.2SQL語(yǔ)言的基本操作(18)procedureTForm1.DBGrid1CellClick(Column:TColumn);beginwithquery1dobeginedit1.Text:=fieldbyname('學(xué)號(hào)').AsString;edit2.Text:=fieldbyname('姓名').AsString;edit3.Text:=fieldbyname('性別').AsString;edit4.Text:=formatdatetime('mm''/''dd''/''yyyy',strtodate(fie

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論