第六章SQL語言的應用3_第1頁
第六章SQL語言的應用3_第2頁
第六章SQL語言的應用3_第3頁
第六章SQL語言的應用3_第4頁
第六章SQL語言的應用3_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第六章SQL語言的應用章目錄6.1SQL語言概述6.2數(shù)據(jù)定義6.3數(shù)據(jù)查詢6.4數(shù)據(jù)操縱

SQL被作為關系數(shù)據(jù)庫的標準語言。SQL語句可以用來執(zhí)行各種各樣的操作。目前流行的關系數(shù)據(jù)庫管理系統(tǒng),如Qracle、Sybase、SQLServer、VisualFoxPro等都采用了SQL語言標準,而且很多數(shù)據(jù)庫都對SQL語句進行了再開發(fā)和擴展。

6.1SQL語言概述SQL語言具有如下特點:(1)SQL是一種一體化的語言。盡管設計SQL的最初目的是查詢,數(shù)據(jù)查詢也是其最重要的功能之一,但SQL決不僅僅是一個查詢工具,它集數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制功能于一體,可以獨立完成數(shù)據(jù)庫的全部操作。(2)SQL語言是一種高度非過程化的語言。它沒有必要一步步地告訴計算機“如何”去做,而只需要描述清楚用戶要“做什么”,SQL語言就可以將要求交給系統(tǒng),自動完成全部工作。(3)SQL語言非常簡潔。雖然SQL語言功能很強,但它只有為數(shù)不多的9條命令:CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。另外SQL的語法也非常簡單,它很接近英語自然語言,因此容易學習和掌握。

(4)SQL語言可以直接以命令方式交互使用,也可以嵌入到程序設計語言中以程序方式使用?,F(xiàn)在很多數(shù)據(jù)庫應用開發(fā)工具都將SQL語言直接融入到自身的語言之中,使用起來更方便,VisualFoxPro就是如此。這些使用方式為用戶提供了靈活的選擇余地。此外,盡管SQL的使用方式不同,但SQL語言的語法基本是一致的。

VisualFoxPro在SQL方面支持數(shù)據(jù)定義、數(shù)據(jù)查詢和數(shù)據(jù)操縱功能,但在具體實現(xiàn)方面也存在一些差異。另外,由于VisualFoxPro自身在安全控制方面的缺陷,所以它沒有提供數(shù)據(jù)控制功能。

SQL雖然在各種數(shù)據(jù)庫產品中得到了廣泛的支持,但迄今為止,它只是一種建議標準,各種數(shù)據(jù)庫產品中所實現(xiàn)的SQL在語法、功能等方面均略有差異,本章講述VisualFoxPro中SQL的語法、功能與應用。6.2.1建立表結構命令格式是:CREATETABLE|DBF

<表名1>

[NAME<長表名>][FREE](<字段名1><類型>(<寬度>[,<小數(shù)位數(shù)>])[NULL|NOTNULL][CHECK<條件表達式1>[ERROR<出錯顯示信息>]][DEFAULT<表達式1>][PRIMARYKEY|UNIQUE][REFERENCES<表名2>[TAG<標識1>]][<字段名2>……][,PRIMARYKEY

主索引表達式TAG

索引標識][,UNIQUE

候選索引表達式TAG索引標識][,FOREIGNKEY

普通索引表達式TAG索引標識

REFERENCES

父表名[TAG

索引標識]][,CHECK

<記錄有效性>[ERROR<出錯信息>]]))6.2數(shù)據(jù)定義例利用SQL命令建立學生管理數(shù)據(jù)庫,其中包含3個表:學生表、選課表和課程表。操作步驟如下:(1)用CREATE命令建立數(shù)據(jù)庫。CREATEDATABASED:\學生管理

(2)用CREATE命令建立學生表。CREATETABLE學生;(學號C(5)PRIMARYKEY,;

姓名C(8),;

入學成績N(5,1)CHECK(入學成績>0)ERROR"成績應該大于0")(3)建立課程表。CREATETABLE課程;(課程號C(5)PRIMARYKEY,;

課程名C(20),;

學分N(1))4)建立選課表。CREATETABLE選課;(學號C(5)REFERENCES學生TAG學號,;

課程號C(5)REFERENCES課程TAG課程號,;

成績ICHECK(成績>=0AND成績<=100);ERROR"成績值的范圍0~100!"DEFAULT60,;PRIMARYKEY學號+課程號TAGxhkxh)利用SQL命令建立數(shù)據(jù)庫6.2.2刪除表刪除表的SQL命令是:DROPTABLE

<表名>DROPTABLE命令直接從磁盤上刪除所指定的表文件。如果指定的表文件是數(shù)據(jù)庫中的表并且相應的數(shù)據(jù)庫是當前數(shù)據(jù)庫,則從數(shù)據(jù)庫中刪除了表。否則雖然從磁盤上刪除了表文件,但是記錄在數(shù)據(jù)庫文件中的信息卻沒有刪除,此后會出現(xiàn)錯誤提示。所以要刪除數(shù)據(jù)庫中的表時,最好應使數(shù)據(jù)庫是當前打開的數(shù)據(jù)庫,在數(shù)據(jù)庫中進行操作。

6.2.3修改表結構修改表結構的命令是ALTERTABLE,該命令有3種格式。略

6.3.1基本查詢所謂基本查詢是指無條件查詢,其格式是:SELECT[<別名>.]<選項>[AS<顯示列名>],[…]FROM<表名1>[AS

別名1>][,…]其中:<別名>.

可使用別名來區(qū)分不同的表。<選項>顯示字段或表達式,“*”表示所有表字段<顯示列名>如果不希望使用字段名,可以根據(jù)要求設置一個名稱。

6.3數(shù)據(jù)查詢建立基本表:學生(學號,姓名,年齡,性別,所在系);

課程(課程號,課程名,學分);選課(學號,課程號,成績)例:查詢所有學生信息:

SELECT*FROM學生

SELECT學生.*FROM

學生

SELECTXS.*

/*不能用學生.**/

FROM學生XS例:查詢所有學生姓名和年齡:

SELECT姓名,年齡

FROM學生例:查詢每人的虛歲

SELECT

學號,姓名,年齡+1

AS

年齡

/*不用AS年齡,將無列名*/

FROM

學生6.3.2帶條件查詢

SELECT<選項>[,…]FROM<表名>[,…]WHERE<篩選條件>(1)<字段名><關系運算符><表達式>(2)<字段名>[NOT]BETWEEN<起始值>AND<終止值>(3)<字段名>

IS[NOT]NULL(4)<字段名>[NOT]IN<值表>(5)<字段名>[NOT]LIKE<字符表達式>(6)<字段名1><關系運算符><字段名2>(聯(lián)接)(7)<字段名>[NOT]IN

(<子查詢>)(以下幾種嵌套)(8)<字段名><關系運算符>

(<子查詢>)(9)<字段名><關系運算符>ALL(<子查詢>)(10)<字段名><關系運算符>ANY|SOME

(<子查詢>)(11)[NOT]EXISTS

(<子查詢>)SQL支持的關系運算符如下:=、<>、!=、#、==、>、>=、<、<=。(1)<字段名><關系運算符><表達式>例:查詢所有女生信息

SELECT*FROM學生

WHERE性別=‘女’(2)<字段名>[NOT]BETWEEN<起始值>AND<終止值>例:查詢所有年齡在20-25之間的學生信息

SELECT*FROM學生

WHERE年齡BETWEEN20AND25或SELECT*FROM學生

WHERE年齡>=20AND年齡<=25(3)<字段名>

IS[NOT]NULL例:查詢所有性別沒有輸入的學生信息

SELECT*FROM學生

WHERE性別ISNULL6.3.3嵌套查詢

有時候一個SELECT命令無法完成查詢任務,需要一個子SELECT的結果作為條件語句的條件,即需要在一個SELECT命令的WHERE子句中出現(xiàn)另一個SELECT命令,這種查詢稱為嵌套查詢。通常把僅嵌入一層子查詢的SELECT命令稱為單層嵌套查詢,把嵌入子查詢多于一層的查詢稱為多層嵌套查詢。VisualFoxPro只支持單層嵌套查詢。

①<字段名>[NOT]IN

(<子查詢>)

:測試當前值是否是子查詢結果集中的元素,結果集中可以是空集、一個元素或多個元素【例】求至少選修了一門課程的學生學號和姓名。

SELECT學號,姓名

FROM學生

WHERE學號

IN

(SELECT學號FROM選課)【例】求一門課程都沒選修的學生學號和姓名。

SELECT學號,姓名

FROM學生

WHERE學號

NOTIN

(SELECT學號FROM選課)

<字段名><關系運算符>

(<子查詢>):當前值與子查詢結果集中的元素的比較,結果集中最多只一個元素,不能含有多個元素。【例】求年齡大于張三的學生學號、姓名和年齡。

SELECT學號,姓名,年齡

FROM學生

WHERE年齡>(

SELECT年齡

FROM學生

WHERE姓名='張三')③

<字段名><關系運算符>ALL|ANY|SOME(<子查詢>)

ALL是量詞,要求查詢字段要滿足子查詢的所有元素。ANY、SOME是量詞,含義相同,只要求查詢字段滿足子查詢集合中一個元素,則條件成立【例】求其他系中比數(shù)學系某一學生年齡小的學生(不大于所有的)。

SELECT*FROM學生

WHERE年齡

<ANY(SELECT年齡

FROM學生

WHERE所在系='數(shù)學系')

AND所在系<>'數(shù)學系'【例】求其他系中比數(shù)學系學生年齡都小的學生。

SELECT*FROM學生

WHERE年齡

<ALL(SELECT年齡

FROM學生

WHERE所在系=‘數(shù)學系’)

AND所在系<>‘數(shù)學系’④[NOT]EXISTS

(<子查詢>)

【例7】求選修了KC02課程的學生姓名。

SELECT姓名FROM學生

WHERE

EXISTS(SELECT*FROM選課

WHERE學生.學號=學號

AND課程號=‘KC02’)/*此處內層使用了外層的信息*/此題可用IN表示嵌套,也可用連接來代替SELECT姓名FROM學生;WHERE

學號IN(SELECT學號;FROM選課WHERE課程號="KC02")【例】求沒有選修KC02課程的學生姓名。

SELECT姓名

FROM學生

WHERE

NOTEXISTS

(SELECT*FROM選課

WHERE學生.學號=學號

AND課程號=‘KC02’)/*此處內層使用了外層的信息*/此題可用IN表示嵌套,也可用連接來代替SELECT姓名FROM學生;WHERE

學號NOTIN(SELECT學號;FROM選課WHERE課程號="KC02")6.3.4多表查詢在一個表中進行查詢,一般說來是比較簡單的,而在多表之間查詢就比較復雜,必須處理表和表間的聯(lián)接關系。使用SELECT命令進行多表查詢是很方便的。1.在WHERE子句表示

SELECT<字段列表|表達式>FROM<表1>[,表2…..]WHERE<連接條件表達式>(1)<條件表達式>:形式如:

<字段名1><關系運算符><字段名2>(2)這是種普通聯(lián)接查詢,又你內聯(lián)接查詢,只有滿足條件的記錄才包含在結果里,否則不會出現(xiàn)在結果里,一般是等值聯(lián)接例:查詢所有選了課的學生信息及選課情況SELECT*FROM學生INNERJOIN

選課ON

學生.學號=選課.學號例:查詢數(shù)學系所有學生信息及選課情況

SELECT*FROM學生LEFTJOIN

選課ON

學生.學號=選課.學號WHERE所在系=‘數(shù)學系’例:查詢所有課程的先修情況情況

SELECT*FROM選課RIGHTJOIN

課程ON

選課.課程號=課程.課程號6.3.5排序格式:SELECT<字段列表>FROM<表>[WHERE<條件>]

[ORDERBY<排序項>[ASC|DESC],…]

【例】按學號的順序查詢學生的成績SELECT學號,成績FROM選課

ORDERBY學號【例】按年齡降序查詢各系學生的學號、姓名、年齡SELECT學號,姓名,年齡,所在系FROM學生ORDERBY所在系,年齡DESC1.簡單的計算查詢

SQL不僅具有查詢功能,還有計算功能,用于計算的函數(shù)有:(1)COUNT(*):計數(shù)(2)SUM(字段名|表達式):求和(3)AVG(字段名|表達式)

:計算平均數(shù)(4)MAX(字段名|表達式)

:求最大值(5)MIN(字段名|表達式)

:求最小值【例】求選了課的學生人數(shù)。

SELECTCOUNT(DISTINCT學號)

FROM選課【例】求學生平均年齡。

SELECT

AVG(年齡)

FROM學生6.3.6分組與計算查詢例:查詢張三的總分SELECT學號,SUM(成績)總分FROM選課WHERE學號=(SELECT學號

FROM學生

WHERE姓名='張三')【例】求數(shù)據(jù)庫課程的最高分學生的學號和成績。

SELECT學號,MAX(成績)FROM選課;WHERE課程號=(SELECT課程號;FROM課程;WHERE課程名='數(shù)據(jù)庫')2.分組與計算查詢

SELECT<字段列表|函數(shù)>FROM<表>

[WHERE<條件>]

[GROUPBY<分類字段列表>,…][HAVING<過濾條件>]【功能】GROUPBY<分類字段列表>是分組計算查詢?!纠壳竺總€院系的學生平均年齡。SELECT所在系,AVG(年齡)

FROM學生;GROUPBY所在系說明:(1)HAVING子句總是跟在GROUPBY子句之后,不能單獨使用,它是用來對分組限定的【例】求至少有2個學生的學生人數(shù)。SELECT所在系,COUNT(*)FROM學生;GROUPBY所在系

HAVINGCOUNT(*)>=2(2)計算函數(shù)只能用在SELECT短語中或分組的HAVING短語中,不能用在WHERE短語和ORDERBY短語中:【例】求每個倉庫的職工平均工資,并按從高到低排列。SELECT所在系,AVG(年齡)ASNL

FROM學生;GROUPBY年在系;ORDERBYNLDESC&&不可用ORDERBYAVG(年齡)6.3.7集合的并運算格式:SELECT…FROM…WHERE…UNION;

SELECT…FROM…WHERE…功能:將兩個查詢結果通過并運算合并成一個查詢【例】查詢“數(shù)學系”和“化學系”的學生信息。SELECT*FROM學生WHERE所在系="數(shù)學系"

UNION;SELECT*FROM學生WHERE所在系="化學系"

它等價于:SELECT*FROM學生;WHERE

所在系="數(shù)學系"OR所在系="化學系"說明:

參加并運算的兩個集合的類型應該相同,即字段數(shù)和對應字段的值域相同.1.顯示查詢的部分結果【格式】:SELECT[ALL|DISTINCT]<字段列表>[TOPn[PERCENT]]FROM<表>ORDERBY<列名>ALL:

表示顯示全部查詢記錄,包括重復記錄,默認是指ALL。DISTINCT:

表示顯示無重復結果的記錄。TOPn:表示顯示結果的前n條記錄,TOPnPERCENT表示顯示結果的前n%的記錄說明:TOP應與ORDERBY匹配使用6.3.8VFP中SELECT語句幾個特殊選項例:查詢所有選修了課程的學生學號SELECTALL學號

FROM選課SELECTDISTINCT學號

FROM選課例:查詢選課表的“KC01”課程的最高分記錄SELECTTOP1*FROM選課;ORDERBY成績

DESCWHERE課程號="KC01"例:查詢選課表的“KC01”課程成績在前40%記錄SELECTTOP40PERCENT*FROM選課;ORDERBY成績DESCWHERE課程號="KC01"查詢的動向一般有:INTOARRAY

<數(shù)組名>:將查詢結果保存到一個數(shù)組中。INTOCURSOR<臨時表名>:將查詢結果保存到一個臨時表中。INTODBF|TABLE

<表名>:將查詢結果保存到一個永久表中。TOFILE<文件名>[ADDITIVE]:將查詢結果保存到文本文件中。如果帶“ADDITIVE”關鍵字,查詢結果以追加方式添加到<文件名>指定的文件,否則,以新建或覆蓋方式添加到<文件名>指定的文件。TOSCREEN:將查詢結果保在屏幕上顯示。TOPRINTER:將查詢結果送打印機打印。【例】查詢“1001”學生的選課信息(1)將結果輸出到數(shù)組s中。SELECT*FROM選課WHERE學號="1001";INTOARRAYS1(2)將結果輸出到臨時表tmp中SELECT*FROM選課WHERE學號="1001";INTOCURSORtmp說明:生成的臨時表文件自動打開,為只讀文件,可象一般的表文件一樣使用,關閉時自動刪除(3)將結果輸出到自由表temp中SELECT*FROM選課WHERE學號="1001";INTOdbftemp(4)將結果輸出到文本文件temp中SELECT*FROM選課WHERE學號="1001";TO[FILE]temp(5)將結果輸出到屏幕上SELECT*FROM選課WHERE學號="1001";TOSCREEN(6)將結果輸出到打印機上SELECT*FROM選課WHERE學號="1001";TOPRINTER說明:查詢語句即有TO子句,又有INTO子句,則TO被忽略6.4.1插入記錄

【格式1】INSERTINTO<表名>[(<字段名表>)]

VALUES(<表達式表>)【功能】在指定的表文件末尾追加一條記錄。格式1用表達式表中的各表達式值賦值給<字段名表>中的相應的各字段?!菊f明】若插入的是一條完整的記錄(每個字段都有對應的值),則可省了<字段名表>,否則必須指定的字段,沒有出現(xiàn)的字段,則取空值(或默認值)。6.4數(shù)據(jù)操縱【例】將一個新學生記錄(學號:‘1004’,姓名:‘王小明’,年齡:20)插入到學生表中。

INSERTINTO

學生(學號,姓名,年齡);

VALUES(“2002”,“王小明”,20)

又如:

INSERTINTO學生;VALUES(“2003”,“王鵬”,20,“男”,“數(shù)學系”)

&&基本表只含五個屬性,且順序與值一致【格式2】INSE

溫馨提示

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

評論

0/150

提交評論