第四章關(guān)系數(shù)據(jù)庫語言_第1頁
第四章關(guān)系數(shù)據(jù)庫語言_第2頁
第四章關(guān)系數(shù)據(jù)庫語言_第3頁
第四章關(guān)系數(shù)據(jù)庫語言_第4頁
第四章關(guān)系數(shù)據(jù)庫語言_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章關(guān)系數(shù)據(jù)庫語言SQL4.1SQL簡介4.2查詢語句4.3數(shù)據(jù)更新4.4數(shù)據(jù)定義小結(jié)4.1SQL簡介SQL是結(jié)構(gòu)化查詢語言(StructuredQueryLanguage)的縮寫,是一種面向關(guān)系數(shù)據(jù)庫的國際標(biāo)準(zhǔn)語言,在當(dāng)前數(shù)據(jù)庫領(lǐng)域中應(yīng)用最為廣泛和成功,美國國家標(biāo)準(zhǔn)局ANSI在1986年將SQL作為關(guān)系數(shù)據(jù)庫系統(tǒng)的標(biāo)準(zhǔn)語言,后被國際標(biāo)準(zhǔn)化組織(ISO)采納為國際標(biāo)準(zhǔn)。現(xiàn)在很多大型數(shù)據(jù)庫都實現(xiàn)了SQL語言。4.1.1SQL語言的發(fā)展SQL的發(fā)展歷程主要有以下幾個階段:(1)1974年由Boyce和Chamberlin提出,當(dāng)時稱為SEQUEL(StructuredEnglishQueryLanguage)。(2)1975~1979年IBM公司對SEQUEL進行了修改,并由SanJoseResearchLaboratory研制了著名的關(guān)系數(shù)據(jù)庫管理系統(tǒng)原型SystemR,實現(xiàn)了這種語言。(3)1981年IBM推出了商用關(guān)系數(shù)據(jù)庫SQL/DS,并將其改名為SQL,由于它功能豐富,語言簡潔,因此倍受用戶及計算機工業(yè)界歡迎,被眾多計算機公司和軟件公司所采用。(4)目前SQL語言不僅用于小型數(shù)據(jù)庫如Foxpro、Access,而且更廣泛用于各種大型數(shù)據(jù)庫,如Sysbase、SQLServer、Oracle、Informix、DB2、Ingres等。SQL在發(fā)展中經(jīng)歷了一系列標(biāo)準(zhǔn)化過程:(1)1982年美國國家標(biāo)準(zhǔn)局(AmericanNationalStandardInstitute,簡稱ANSI)開始制訂SQL標(biāo)準(zhǔn)。(2)1986年10月ANSI的數(shù)據(jù)庫委員會X3H2批準(zhǔn)了SQL作為關(guān)系數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn);同年ANSI公布SQL語言的第一個標(biāo)準(zhǔn)SQL-86,并于次年由國際標(biāo)準(zhǔn)化組織(InternationalStandardizationOrganization,簡稱ISO)通過SQL-86標(biāo)準(zhǔn)。(3)1989年ISO對SQL-86進行補充,推出SQL-89標(biāo)準(zhǔn),也稱SQL1。(4)1992年ISO又推出SQL-92標(biāo)準(zhǔn),亦稱SQL2。(5)1999年起ANSI陸續(xù)公布增加了面向?qū)ο蠊δ艿男聵?biāo)準(zhǔn)SQL-99(亦稱SQL3)的12個標(biāo)準(zhǔn)文本。4.1.2SQL語言的特點(1)非過程化:SQL語言是非過程化語言,在SQL語言中,只要求用戶提出“做什么”,而無需指出“怎樣做”。SQL語句操作的過程由系統(tǒng)自動完成。(2)一體化:SQL可以操作于不同層次模式,集數(shù)據(jù)定義語言(DDL)、數(shù)據(jù)操縱語言(DML)、數(shù)據(jù)控制語言(DCL)為一體。用SQL語言可實現(xiàn)DB生命周期的全部活動,其中包括建立數(shù)據(jù)庫、建立用戶賬號、定義關(guān)系模式、查詢及數(shù)據(jù)維護、數(shù)據(jù)庫安全控制等。(3)兩種使用方式,統(tǒng)一的語法結(jié)構(gòu):兩種使用方式:自含式語言與嵌入式語言自含式方式就是聯(lián)機交互使用方式;嵌入式方式是指SQL語句嵌入某種高級程序設(shè)計語言的程序中,以實現(xiàn)數(shù)據(jù)庫操作。盡管這兩種使用方式不同,但SQL語言的語法結(jié)構(gòu)基本是一致的。4.1.3SQL語言的書寫準(zhǔn)則

遵從某種準(zhǔn)則可以提高語句的可讀性,通常遵循的準(zhǔn)則主要有:SQL語句對大小寫不敏感,但關(guān)鍵字常用大寫

SQL語句可寫在一行上,但為便于理解,增強條理性,常習(xí)慣于每個字句占用一行關(guān)鍵字不能在行與行之間分開,很少采用縮寫形式

SQL中的數(shù)據(jù)項需同時列出時,分隔符用“,”;字符或字符串常量的定界符用單引號“

'”表示4.2查詢語句4.2.1基本查詢4.2.2使用列表達式4.2.3WHERE從句的進一步使用4.2.4數(shù)據(jù)匯總4.2.5連接查詢4.2.6嵌套查詢4.2.7聯(lián)合查詢4.2.8使用系統(tǒng)內(nèi)置函數(shù)的查詢

SQL的核心是數(shù)據(jù)查詢。對于數(shù)據(jù)庫的查詢操作是通過SELECT

查詢命令實現(xiàn)的,它的基本形式由

SELECT-FROM-WHERE

查詢塊組成,多個查詢塊可以嵌套執(zhí)行。總述SQL查詢語句的完整語法描述如下:SELECT

[ALL|DISTINCT]<目標(biāo)列表達式>[,<目標(biāo)列表達式>]…FROM

<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達式>][GROUPBY<列名1>[HAVING<條件表達式>]][ORDERBY<列名2>[ASC|DESC]];

指定要顯示的屬性列指定查詢對象指定查詢條件查詢結(jié)果按指定列的值分組篩選出只有滿足指定條件的組對查詢結(jié)果表按指列值的升序或降序排序

4.2.1基本查詢最基本的查詢就是從指定的表中找出符合條件的記錄。這樣的查詢由SELECT和FROM短語構(gòu)成無條件查詢,或由SELECT、FROM和WHERE或其他短語構(gòu)成條件查詢。

(1)簡單的無條件查詢設(shè)某個數(shù)據(jù)庫中有表stu_info,請把該表中的所有記錄的所有屬性查詢出來:

SELECT*//*表示所有字段,是通配符

FROMstu_info//選定數(shù)據(jù)庫中的表

(2)簡單的條件查詢請查找stu_info表中所有的女生的信息。SELECT*

FROMstu_info

WHERExbm='女'

//設(shè)定條件在SELECT子句中可以決定哪些列出現(xiàn)在結(jié)果關(guān)系中,這相當(dāng)于關(guān)系代數(shù)中的投影運算。具體辦法:在SELECT子句之后不是寫“*”,而是根據(jù)需要列出在FROM子句中聲明的諸關(guān)系的屬性。例:SELECTxh,xm//選定字段FROMstu_info //選定數(shù)據(jù)庫中的表WHERExbm='女'

//設(shè)定條件(3)查詢語句中的投影操作使用SQL的SELECT可以將查詢結(jié)果排序,排序的短語是ORDERBY,具體格式如下:

SELECT列名1,列名2,…FROM表名WHERE條件表達式

ORDERBY

列名1[ASC|DESC][,列名2[ASC|DESC]…]按升序(ASC)或降序(DESC)排序,允許按一列或多列排序。(4)設(shè)定排序條件下面是使查詢結(jié)果排序的例子:SELECT*

//“*”表示所有字段

FROM

stu_info//選定數(shù)據(jù)庫中的表

WHERExbm='女'//設(shè)定條件

ORDERBYxh

//設(shè)定排序字段

在查詢過程中經(jīng)常會出現(xiàn)一些重復(fù)記錄,例如“SELECTbhFROMstu_info”。其查詢結(jié)果將會有多個重復(fù)的班級名,顯然這種結(jié)果不能令人滿意。因此需要去掉重復(fù)值,此時需要指定DISTINCT

短語:

SELECTDISTINCTbhFROMstu_info

這里短語DISTINCT的作用是去掉查詢結(jié)果中的重復(fù)值。執(zhí)行結(jié)果中班級名都不重復(fù)。(5)限定重復(fù)記錄4.2.2使用列表達式在SQL中,指定列的方法我們學(xué)習(xí)了以下兩種:(1)指定列(2)使用通配符*第(3)種是:可用列表達式,來獲取經(jīng)過計算的查詢結(jié)果。列表達式不僅可以是算術(shù)表達式,還可以是字符串常量、函數(shù)等。(6)計算列值SELECT'學(xué)號',xh,'年齡',YEAR(GETDATE())-YEAR(CSRQ),bhFROMstu_info(7)修改查詢結(jié)果的列標(biāo)題(1)SELECTYEAR(GETDATE())-YEAR(CSRQ)

AS年齡,nlFROMstu_info(2)SELECT

學(xué)號=xh,nlFROMstu_info(3)SELECTxh'學(xué)號',nlFROMstu_info查詢工作的關(guān)鍵就在通過分析怎樣把實際問題中的自然語言描述轉(zhuǎn)化為1)從哪個表中查詢。即:from子句2)要查詢哪些列。即:select子句3)要查詢的條件。即:where子句完成查詢工作的三個關(guān)鍵步驟其中第3步最復(fù)雜4.1.3WHERE從句的進一步使用常用的查詢條件查詢條件謂詞比較=><>=<=!=<>!>!<確定范圍between…and,notbetween…and確定集合in,notin字符匹配like,notlike空值isnull,isnotnull多重條件and,or(8)表達式比較如:SELECT*

FROMstu_info

WHEREnl>20(9)確定范圍between…and…和notbetween…and…如:查詢考試成績在60-70之間的學(xué)號、課程號、考試成績:SELECTxh,kch,

kscjFROMxkWHEREkscjBETWEEN60AND70(10)確定集合

IN和NOTIN例:查詢復(fù)材0108、復(fù)材0109班的學(xué)生的信息SELECTxh,xm,xbm,bhFROMstu_infoWHEREbhIN('復(fù)材0108','復(fù)材0109')(11)字符匹配NOTLIKE和LIKE與%和_搭配。%代表任意長度的字符串.如a%b:acb,addgb等都滿足匹配_(下橫線)代表任意單個字符。例:查詢班級名中第1個字為“計”字的學(xué)生信息:

SELECT*

FROMstu_info

WHEREbhlike'計%'例:查詢名字中第2個字為“寧”字的學(xué)生信息:

SELECT*

FROMstu_info

WHERExmlike'_寧%'例:查詢DB_Design課程的課程號和學(xué)分。

SELECTckh,kcxfFROMGCourseWHEREkmLIKE'DB\_Design'ESCAPE'\'例:查詢以"DB_"開頭,且倒數(shù)第3個字符為i的課程的詳細(xì)情況。

SELECT*FROMGCourseWHEREkmLIKE'DB\_%i__'ESCAPE'\'當(dāng)用戶要查詢的字符串本身就含有%或_時,要使用ESCAPE

'換碼字符'

短語對通配符進行轉(zhuǎn)義。(12)涉及空值的查詢SELECT*FROMstu_infoWHEREbhISNULL(13)多重條件查詢用邏輯運算符and和or連接,and的優(yōu)先級高于or。如:查詢應(yīng)什么班,姓劉的學(xué)生。SELECT*FROM

stu_infoWHEREbhlike'應(yīng)%'and

姓名like'劉%'4.2.4數(shù)據(jù)匯總(14)聚合函數(shù)count(*)統(tǒng)計元組(記錄)個數(shù)count([distinct|all]<列名>)統(tǒng)計一列中值的個數(shù)sum([distinct|all]<列名>)求一列值的總和(數(shù)值型)avg([distinct|all]<列名>)求一列值的平均數(shù)max([distinct|all]<列名>)求一列值中的最大值min([distinct|all]<列名>)求一列值中的最小值聚合函數(shù)一覽表例:查詢學(xué)生總數(shù)

SELECT

count(*)

FROMstu_info例:已知數(shù)據(jù)庫表XK中高等數(shù)學(xué)課程的代碼為090101,查詢學(xué)生選修高等數(shù)學(xué)的平均成績:

SELECT

avg(KSCJ)

AS

高等數(shù)學(xué)

FROMXK

WHEREKCH='090101'(15)GROUPBY子句Groupby子句將查詢結(jié)果表按某一列或多列值分組,值相等的分為一組。如:在表xk中查詢各課程編號及相應(yīng)的選課人數(shù)注:GROUPBY子句中不能使用聚合函數(shù),并且必須在GROUPBY子句中列出SELECT列表中所有的非聚合項。例:在表stu_info中查詢每個專業(yè)的男生、女生人數(shù)在groupby子句后面加WITHROLLUP或WITHCUBE如果還要顯示每個專業(yè)的總?cè)藬?shù)及全體學(xué)生總?cè)藬?shù),如何實現(xiàn)?SELECTkch,count(xh)

FROMxk

GROUPBYkchSELECTzyh,xbm,count(*)as'人數(shù)'

FROMstu_info

GROUPBYzyh,xbm例:查詢選修了3門以上課程的學(xué)生及選課數(shù):SELECTXH,COUNT(*)FROMXKGROUPBYXHHAVING(COUNT(*)>3)

HAVING短語指定分組或聚合的條件。只有滿足條件的分組才被選出來,HAVING一般與GROUPBY子句一起使用。(16)HAVING

短語SELECTXH,COUNT(*)FROMXKWHERE(XHLIKE'2001%')GROUPBYXHHAVING(COUNT(*)>3)例:查詢學(xué)號前四位是2001的學(xué)生的學(xué)號及選課數(shù):having短語指定選擇組的條件,只有滿足條件的組才被選出來。一般和groupby子句一起使用where子句從基本表中選擇滿足條件的元組,而不是指定滿足條件的分組,這是二者的根本區(qū)別。若一個查詢同時涉及兩個以上的表,稱為連接查詢。連接查詢是關(guān)系數(shù)據(jù)庫中最主要的查詢,按連接類型可分為:內(nèi)連接、外連接和交叉連接。其中內(nèi)連接又分:等值連接、非等值連接和自然連接;外連接又分:左外連接、右外連接和全外連接等。4.2.5連接查詢

連接查詢中用來連接兩個關(guān)系的條件稱為連接條件或連接謂詞,格式:表名1.列名

比較運算符表名2.列名其中比較運算符主要有:=、>、<、>=、<=、!=當(dāng)連接運算符為=時,叫等值連接。使用其它運算符稱為非等值連接。連接謂詞中的列名稱為連接字段。

例:查詢每個學(xué)生及其選課情況SELECT*FROMstu_info,xkWHERE

stu_info.xh=xk.xh例:查詢應(yīng)化041班每個學(xué)生及其選修課程的情況SELECT

stu_info.xh,stu_info.xm,stu_info.bh,

stu_info.xbm,xk.kch,xk.kscjFROM

stu_info,xkWHERE

stu_info.xh=xk.xh

and

stu_info.bh='應(yīng)化041'

//復(fù)合條件連接多表查詢:涉及兩個表以上的查詢SELECTxmFROMstu_info,xk,gcourseWHEREgcourse.km='數(shù)據(jù)庫原理'

andgcourse.kch=xk.kch

andxk.xh=stu_info.xh為了簡化,表名可以取別名,且別名只在本次查詢有效增加表別名后的結(jié)果:SELECTxmFROMstu_infoa,xkb,gcoursecWHEREc.km='數(shù)據(jù)庫原理'

andc.kch=b.kch

andb.xh=a.xh例如:查詢選修了有機化學(xué)這門課程的學(xué)生的姓名下面討論另一類基于多個關(guān)系的查詢,這類查詢所要求的結(jié)果出自一個關(guān)系,但相關(guān)的條件卻涉及多個關(guān)系。在前面的例子中,WHERE之后是一個相對獨立的條件,這個條件或者為真、或者為假。但是,有時需要用另外的方式來表達檢索要求。比如,當(dāng)檢索關(guān)系X中的記錄時,它的條件依賴于相關(guān)的關(guān)系Y中的記錄屬性值,這時使用SQL的嵌套查詢功能將非常方便。4.2.6嵌套

查詢在SQL語言中,一個select-from-where語句稱為一個查詢塊,將一個查詢塊嵌套在另一個查詢塊的where子句或having短語的條件中的查詢稱為嵌套查詢。等價形式:SELECTxm

FROMstu_info,xk

WHEREstu_info.xh=xk.xh

andkch='05'SELECTxmFROMstu_info例:在stu_info表中查詢選修了05號課程的學(xué)生姓名WHERExhIN(SELECTxhFROMxkWHEREkch='05')例:查詢與劉玉濤在同一個班學(xué)習(xí)的學(xué)生的學(xué)號、姓名、班級。SELECTxh,xm,bhFROMstu_infoWHERE

bhIN(17)帶有in謂詞的子查詢(18)帶有比較運算符的子查詢例:查詢與學(xué)號是20029001的學(xué)生在同一個班學(xué)習(xí)的學(xué)生,按學(xué)號排序。SELECTxh,xm,bhFROMstu_infoWHERE

bh

ORDERBYxh

(SELECTbhFROMstu_infoWHERExm='劉玉濤')

=(SELECTbhFROMstu_infoWHERExh='20029001')(19)帶有any或all謂詞的子查詢比較子查詢通常用到操作符ALL、ANY。其通用格式為:

<列><比較運算符>[ALL|ANY]<內(nèi)部查詢>例:查詢其他班級中比應(yīng)化041班某個學(xué)生年齡小的那些學(xué)生的姓名和年齡。SELECTxm,nl

FROMstu_info

WHEREbh<>'應(yīng)化041'andnl<any(selectnlfromstu_infowherebh='應(yīng)化041')(20)帶有exists謂詞的子查詢EXISTS是測試子查詢是否有數(shù)據(jù)行返回,有則返回TRUE,否則返回FALSE。例:查詢選修了高等數(shù)學(xué)(090101)的學(xué)生姓名、性別和班級。SELECTxm,xbm,bhFROMstu_infoWHEREexists(select*fromxkwherexh=stu_info.xh

andkch='090101')例:查詢沒有選修高等數(shù)學(xué)(090101)的學(xué)生姓名、性別和班級。SELECTxm,xbm,bhFROMstu_infoWHEREnotexists(select*fromxkwherexh=stu_info.xhandkch='090101')4.2.7聯(lián)合(集合)查詢select語句的查詢結(jié)果是元組的集合,所以多個select語句的結(jié)果可進行集合操作。集合操作主要包括:并操作UNION、交操作INTERSECT、差操作MINUS標(biāo)準(zhǔn)SQL只提供UNION,其語法格式如下:

SELECT_1UNION[ALL]SELECT_2…如果要將查詢的結(jié)果保存在當(dāng)前數(shù)據(jù)庫新建的表NEWSTU中,可以使用INTO子句:SELECT*INTONEWSTUFROMaUNIONALLSELECT*FROMb例:查詢編號為01的學(xué)院的學(xué)生及所有學(xué)院的本科生SELECT*FROMstu_infoWHERExsh='01'UNIONSELECT*FROMstu_infoWHEREpyccm='本科'4.2.8使用系統(tǒng)內(nèi)置函數(shù)的查詢(21)數(shù)學(xué)函數(shù)

ABS(數(shù)字型表達式)、RAND(整型表達式)(22)字符串處理函數(shù)

ASCII(字符型):返回表達式最左端字符的ASCII值

CHAR(0-255之間的整數(shù)):將ASCII轉(zhuǎn)換為字符

LEFT(字符型,整型):返回從字符串左邊開始指定個數(shù)的字符LTRIM(字符型):刪除字符串最左邊的空格,并返回字符串REPLACE(字符型1,字符型2,字符型3):用3替換1中包含的2,并返回替換后的表達式SUBSTRING(express,start,length):返回express中指定的部分?jǐn)?shù)據(jù)STR(float_exp[,length[,decimal]]):將數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù)(23)系統(tǒng)函數(shù)getdate():返回當(dāng)前的系統(tǒng)日期和時間year()、month()、day():分別返回指定日期的年、月、日

cast(表達式AS數(shù)據(jù)類型):將表達式的值轉(zhuǎn)換為數(shù)據(jù)類型參數(shù)所指定的類型。case函數(shù):一種是簡單的CASE函數(shù),另一種是搜索型的CASE函數(shù)。簡單CASE語法格式:CASE輸入表達式

WHEN比較表達式THEN結(jié)果表達式

……ELSE表達式END搜索CASE語法格式:CASE

WHEN條件1THEN表達式1

WHEN條件2THEN表達式2

……ELSE表達式END例:在STU_INFO中查詢03學(xué)院學(xué)生的學(xué)號、姓名、性別,并將性別分別轉(zhuǎn)換成“男生”、“女生”。 SELECTXH,XM,XBM,XBM= CASE'男'

WHENXBMTHEN'男生'

ELSE'女生'

END FROMSTU_INFO WHEREXSH='03'例:查詢成績表CS中選修了“數(shù)據(jù)庫技術(shù)及應(yīng)用”課程的學(xué)生的學(xué)號、姓名、5分制成績 SELECT學(xué)號,姓名,’5分制成績’=

CASE WHEN成績<60THEN‘不及格’

WHEN成績>=60AND成績<70THEN‘及格’

WHEN成績>=70AND成績<80THEN‘中等’ WHEN成績>=80AND成績<90THEN‘良好’

WHEN成績>=90THEN‘優(yōu)秀’

END FROMCS4.3數(shù)據(jù)更新4.3.1插入數(shù)據(jù)4.3.2修改數(shù)據(jù)4.3.3刪除數(shù)據(jù)4.2.1插入數(shù)據(jù)語句格式INSERTINTO<表名>[(<屬性列1>[,<屬性列2>]…)]VALUES(<常量1>[,<常量2>]…)功能將新元組插入指定表中。(1)插入單個元組例:INSERTINTO

stu_info(xh,xm,xbm)

VALUES('2005090209','王東方','男')如果基本表只有上述三個屬性,則該句等價于:

INSERTINTO

stu_info

VALUES

('2005090209','王東方','男')(2)插入子查詢結(jié)果例:在STU_INFO表中查詢出應(yīng)化041班的學(xué)生情況并存放在YINGHUA表中。

INSERTINTOyinghua

SELECTxh,xm,xbm,csrqFROMstu_infoWHEREbh='應(yīng)化041'語句格式

INSERT[INTO]<表名>[(<屬性列1>[,<屬性列2>]…)]

子查詢功能:將子查詢結(jié)果插入指定表中,用以插入批量記錄4.3.2修改數(shù)據(jù)

語句格式UPDATE<表名>SET<列名>=<表達式>[,<列名>=<表達式>,…][WHERE<條件>]

功能修改指定表中滿足WHERE子句條件的元組(3)修改一個元組的值UPDATEstu_infoSETbh='材0169'WHERExh='2005090209'注意:對批量數(shù)據(jù)的修改,一定把將要修改的記錄先查詢出來,確認(rèn)無誤后再修改。(4)修改多個元組的值UPDATEgcourse

SETkcxf=2

(5)帶子查詢的修改語句將選修了高數(shù)的學(xué)生的成績加10分UPDATExkSETkscj=kscj+10WHEREkch=(selectkchfromgcoursewherekm='高等數(shù)學(xué)')4.3.3刪除數(shù)據(jù)語法格式

DELETEFROM<表名>[WHERE<條件>]功能刪除指定表中滿足WHERE子句條件的元組WHERE子句指定要刪除的元組缺省表示要刪除表中的所有元組(6)刪除一個元組的值

DELETEFROMstu_info

WHERExh='2006050010'(7)刪除多個元組的值

DELETEFROMstu_info

WHEREbh='應(yīng)0203'

刪除表中所有數(shù)據(jù)

DELETEFROMstu_info

(8)帶子查詢的刪除語句

將信息學(xué)院學(xué)生的成績?nèi)縿h除DELETEFROMxkWHERE'12'=(SELECTxshFROMstu_info

WHEREstu_info.xh=xk.xh)注意:在日常工作中,操作刪除語句,一定要先查詢要刪除的數(shù)據(jù),確認(rèn)無誤后再刪除。SELECT*

FROMxkWHERE'12'=(selectxshfromstu_infowherestu_info.xh=xk.xh)4.4數(shù)據(jù)定義4.4.1定義基本表4.4.2修改基本表4.4.3刪除基本表4.4.4視圖4.4.5索引4.4數(shù)據(jù)定義

SQL的數(shù)據(jù)定義語句操作對象操作方式創(chuàng)建刪除修改表createtabledroptablealtertable視圖createviewdropview索引createindexdropindex4.4.1定義基本表語句格式:

CREATETABLE<表名>

(<列名><數(shù)據(jù)類型>[<列級完整性約束條件>][,<列名><數(shù)據(jù)類型>[<列級完整性約束條件>]]…[,<表級完整性約束條件>])<表名>:所要定義的基本表的名字<列名>:組成該表的各個屬性(列)<列級完整性約束條件>:涉及相應(yīng)屬性列的完整性約束條件<表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件例:建立一個學(xué)生表Student,它由學(xué)號Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個屬性組成。其中學(xué)號不能為空,值是唯一的,并且姓名取值也唯一。

CREATETABLEStudent

(

SnoVARCHAR(5)NOTNULLUNIQUE,SnameVARCHAR(20)UNIQUE,SsexVARCHAR(1),SageINT,SdeptVARCHAR(15))SnoSnameSsexSageSdept字符型長度為5不能為空值取值唯一字符型長度為20字符型長度為1整數(shù)字符型長度為15常用完整性約束主碼約束:PRIMARYKEY唯一性約束:UNIQUE非空值約束:NOTNULL默認(rèn)值約束:DEFAULT檢查約束:

CHECK參照完整性約束:FOREIGNKEY…REFERENCE例:建立一個“學(xué)生選課”表SC,它由學(xué)號Sno、課程號Cno,修課成績Grade組成,其中(Sno,Cno)為主碼。CREATETABLESC(SnoVARCHAR(5),CnoVARCHAR(3),Gradeint,

Primarykey(Sno,Cno)

)例:創(chuàng)建表n_jobsCREATETABLEn_jobs(job_idsmallintIDENTITY(1,1)PRIMARYKEYCLUSTERED,job_descvarchar(50)NOTNULLDEFAULT('新部門'),

min_lvltinyintNOTNULLCHECK(min_lvl>=12),max_lvltinyintNOTNULLCHECK(max_lvl<=250))例:使用表達式((最低分+最高分)/2)生成中等分計算列。CREATETABLE得分(最低分int,

最高分int,

中等分AS(最低分+最高分)/2)4.4.2修改基本表語法格式:ALTERTABLE<表名>[ALTERCOLUMN<列名><新數(shù)據(jù)類型>][ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>]<表名>:要修改的基本表ALTERCOLUMN

子句:要更改的列,要更改的列不能是數(shù)據(jù)類型為text,image,ntext或timestamp等列ADD子句:增加新列和新的完整性約束條件DROP子句:刪除指定的完整性約束條件或列名1、添加列例:向?qū)W生表中添加入學(xué)時間列,其數(shù)據(jù)類型為日期型

ALTERTABLEstu_infoADDrxsjDATETIME可能破壞已有數(shù)據(jù)2、修改列例:將教師表的xb列改為smallint數(shù)據(jù)類型

ALTERTABLEgtechALTERCOLUMNxbsmallint3、刪除列或約束例:將數(shù)據(jù)庫表gtech中的xb列刪除

ALTERTABLEgtechDROPCOLUMNxb例:刪除學(xué)生姓名必須取唯一值的約束

ALTERTABLEstu_infoDROPUNIQUE(xm)4.4.3刪除基本表語法格式:

DROPTABLE<表名>基本表定義一旦刪除,表中的數(shù)據(jù)、表上的索引和視圖都將自動被刪除刪除基本表時,系統(tǒng)會從數(shù)據(jù)字典中刪去有關(guān)該基本表及其索引的描述。

例:刪除EDU_D庫中的表stu_info

DROPTABLE

stu_info4.4.4視圖視圖是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫中數(shù)據(jù)的重要機制。視圖是從一個或多個基本表(或視圖)導(dǎo)出的表,是個虛表。數(shù)據(jù)庫只存放視圖的定義,不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中。所以,視圖的數(shù)據(jù)跟隨基本表的數(shù)據(jù)而變化。視圖一旦被定義,就可以被查詢、刪除,修改及再定義一個新的視圖等。視圖包含一系列帶有名稱的列和行數(shù)據(jù)。這些數(shù)據(jù)來自定義視圖的查詢所引用的基表中,并且在引用視圖時動態(tài)生成。1、定義視圖(1)用企業(yè)管理器建立視圖請同學(xué)們上機自己學(xué)習(xí)建立視圖的方法。(2)用SQL語句建立視圖

CREATEVIEW視圖名

AS<子查詢>[WITHCHECKOPTION]其中[WITHCHECKOPTION]表示對視圖進行UPDATE、INSERT和DELETE操作時要保證更新、插入或刪除的行滿足視圖定義中的條件表達式A、選擇列定義視圖可定義一個視圖,該視圖由表的部分列組成。下例中,視圖MyView1包含了employees表中的三個列。

CREATEVIEW

MyView1AS

SELECTlname,fname

FROMemployee定義了視圖后,可以和表一樣,使用SELECT語句訪問它。例如:SELECT*FROMMyView1B、基于列的表達式定義視圖在定義視圖時,除了使用基礎(chǔ)表的列外,還可使用基本表的列的表達式,生成自己的列。下例中,視圖MyView2的第四列即由表達式計算而來。

CREATEVIEW

MyView2(xh,xm,xbm,nl)ASSELECTxh,xm,xbm,year(getdate())-year(csrq)

FROMstu_infoC、選擇行定義視圖可定義一個視圖,該視圖由表的部分行組成。下例中,視圖MyView3只包含employee表中姓名包含sh的行。

CREATEVIEW

MyView3ASSELECT*FROMemployeeWHEREfnameLIKE'%sh%'D、選擇行和列可定義一個視圖,該視圖由表的部分行和列聯(lián)合組成。下例中,視圖MyView4只包括三列

CREATEVIEW

MyView4ASSELECTlname,fname,pub_idFROMemployeeWHEREfnameLIKE'%sh%'E、基于多個表定義視圖CREATVIEW

查詢學(xué)生選課情況AS

SELECTstu_info.xh,stu_info.xm,gcourse.kmFROMstu_info,gcourse,xkWHEREstu_info.xh=xk.xh

andxk.kch=gcourse.kch2、更新視圖更新視圖是指通過視圖來插入(INSERT)、刪除(DELETE)、修改(UPDATE)數(shù)據(jù)。由于視圖是不實際存儲數(shù)據(jù)的虛表,因此,對視圖的更新最終要轉(zhuǎn)換為對基本表的更新。例、在stu_info表創(chuàng)建信息學(xué)院學(xué)生的視圖:

CREATEVIEWis_stuASSELECT*FROMstu_infoWHERExsh=’03’

例:現(xiàn)將視圖is_stu中學(xué)號為1998031001的學(xué)生的學(xué)院代號改為“12”:UPDATEis_stuSETxsh=‘12’WHERExh=‘1998031001’WITHCHECKOPTION會使

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論